@@ -6,7 +6,7 @@ struct Top<'a, T> {
6
6
// Maximum number of elements to contain.
7
7
count : usize ,
8
8
// Element ordering function.
9
- order : fn ( & & T , & & T ) -> Ordering ,
9
+ order : fn ( & T , & T ) -> Ordering ,
10
10
// Elements contained, by reference.
11
11
elems : Vec < & ' a T > ,
12
12
}
@@ -21,12 +21,10 @@ impl<T: fmt::Debug> fmt::Debug for Top<'_, T> {
21
21
}
22
22
}
23
23
24
-
25
24
// Can parameterize a function to make it able to take a specified type of data.
26
-
27
- fn make_top < ' a , T > ( count : usize , order : fn ( & & T , & & T ) -> Ordering , vals : & ' a [ T ] ) -> Top < ' a , T > {
25
+ fn make_top < T > ( count : usize , order : fn ( & T , & T ) -> Ordering , vals : & [ T ] ) -> Top < ' _ , T > {
28
26
let mut elems: Vec < & T > = vals. iter ( ) . collect ( ) ;
29
- elems. sort_by ( order) ;
27
+ elems. sort_by ( | & v1 , & v2| order ( v1 , v2 ) ) ;
30
28
if count < elems. len ( ) {
31
29
elems. truncate ( count) ;
32
30
}
@@ -37,16 +35,19 @@ fn make_top<'a, T>(count: usize, order: fn(&&T, &&T) -> Ordering, vals: &'a [T])
37
35
impl < ' a , T > Top < ' a , T > {
38
36
fn update ( & mut self , val : & ' a T ) {
39
37
self . elems . push ( val) ;
40
- self . elems . sort_by ( self . order ) ;
41
- while self . elems . len ( ) > self . count {
38
+ let order = self . order ;
39
+ self . elems . sort_by ( |& v1, & v2| order ( v1, v2) ) ;
40
+ if self . elems . len ( ) > self . count {
42
41
let _ = self . elems . pop ( ) ;
43
42
}
43
+ assert ! ( self . elems. len( ) <= self . count) ;
44
44
}
45
45
}
46
46
47
47
fn main ( ) {
48
48
let vals = [ 9 , 7 , 3 , 1 , 4 , 6 , 8 , 2 , 5 ] ;
49
49
let mut top = make_top ( 3 , |x, y| x. cmp ( y) , & vals) ;
50
+ println ! ( "{:?}" , top) ;
50
51
top. update ( & 0 ) ;
51
52
println ! ( "{:?}" , top) ;
52
53
}
0 commit comments