Skip to content

Commit da95db5

Browse files
committed
refactor: implement Median for slice types with macro
1 parent d29c6db commit da95db5

File tree

1 file changed

+20
-41
lines changed

1 file changed

+20
-41
lines changed

src/prelude.rs

Lines changed: 20 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -24,50 +24,29 @@ pub trait Median<T> {
2424
fn median(&mut self) -> T;
2525
}
2626

27-
impl Median<i64> for Vec<i64> {
28-
fn median(&mut self) -> i64 {
29-
self.sort();
30-
let len = self.len();
31-
if len == 0 {
32-
0
33-
} else if len % 2 == 1 {
34-
self[len / 2]
35-
} else {
36-
let mid = len / 2;
37-
(self[mid - 1] + self[mid]) / 2
38-
}
39-
}
40-
}
41-
42-
impl Median<u64> for Vec<u64> {
43-
fn median(&mut self) -> u64 {
44-
self.sort();
45-
let len = self.len();
46-
if len == 0 {
47-
0
48-
} else if len % 2 == 1 {
49-
self[len / 2]
50-
} else {
51-
let mid = len / 2;
52-
(self[mid - 1] + self[mid]) / 2
27+
macro_rules! impl_median_for {
28+
($t:ident) => {
29+
impl Median<$t> for [$t] {
30+
fn median(&mut self) -> $t {
31+
self.sort();
32+
let len = self.len();
33+
if len == 0 {
34+
0
35+
} else if len % 2 == 1 {
36+
self[len / 2]
37+
} else {
38+
let mid = len / 2;
39+
(self[mid - 1] + self[mid]) / 2
40+
}
41+
}
5342
}
54-
}
43+
};
5544
}
5645

57-
impl Median<u32> for Vec<u32> {
58-
fn median(&mut self) -> u32 {
59-
self.sort();
60-
let len = self.len();
61-
if len == 0 {
62-
0
63-
} else if len % 2 == 1 {
64-
self[len / 2]
65-
} else {
66-
let mid = len / 2;
67-
(self[mid - 1] + self[mid]) / 2
68-
}
69-
}
70-
}
46+
impl_median_for!(u32);
47+
impl_median_for!(u64);
48+
impl_median_for!(i32);
49+
impl_median_for!(i64);
7150

7251
pub trait Netgroup {
7352
fn netgroup(&self) -> String;

0 commit comments

Comments
 (0)