@@ -6,9 +6,25 @@ pub use dynamic_arq::{ArqView, DynamicArq};
6
6
pub use specs:: ArqSpec ;
7
7
pub use static_arq:: StaticArq ;
8
8
9
+ /// Assuming slice is sorted, returns the minimum i for which slice[i] >= key,
10
+ /// or slice.len() if no such i exists
11
+ pub fn slice_lower_bound < T : Ord > ( slice : & [ T ] , key : & T ) -> usize {
12
+ slice
13
+ . binary_search_by ( |x| x. cmp ( key) . then ( std:: cmp:: Ordering :: Greater ) )
14
+ . unwrap_err ( )
15
+ }
16
+
17
+ /// Assuming slice is sorted, returns the minimum i for which slice[i] > key,
18
+ /// or slice.len() if no such i exists
19
+ pub fn slice_upper_bound < T : Ord > ( slice : & [ T ] , key : & T ) -> usize {
20
+ slice
21
+ . binary_search_by ( |x| x. cmp ( key) . then ( std:: cmp:: Ordering :: Less ) )
22
+ . unwrap_err ( )
23
+ }
24
+
9
25
/// A simple data structure for coordinate compression
10
26
pub struct SparseIndex {
11
- coords : Vec < i64 >
27
+ coords : Vec < i64 > ,
12
28
}
13
29
14
30
impl SparseIndex {
@@ -31,6 +47,22 @@ mod test {
31
47
use super :: specs:: * ;
32
48
use super :: * ;
33
49
50
+ #[ test]
51
+ fn test_bounds ( ) {
52
+ let mut vals = vec ! [ 16 , 45 , 45 , 45 , 82 ] ;
53
+
54
+ assert_eq ! ( slice_upper_bound( & vals, & 44 ) , 1 ) ;
55
+ assert_eq ! ( slice_lower_bound( & vals, & 45 ) , 1 ) ;
56
+ assert_eq ! ( slice_upper_bound( & vals, & 45 ) , 4 ) ;
57
+ assert_eq ! ( slice_lower_bound( & vals, & 46 ) , 4 ) ;
58
+
59
+ vals. dedup ( ) ;
60
+ for ( i, q) in vals. iter ( ) . enumerate ( ) {
61
+ assert_eq ! ( slice_lower_bound( & vals, q) , i) ;
62
+ assert_eq ! ( slice_upper_bound( & vals, q) , i + 1 ) ;
63
+ }
64
+ }
65
+
34
66
#[ test]
35
67
fn test_coord_compress ( ) {
36
68
let mut coords = vec ! [ 16 , 99 , 45 , 18 ] ;
@@ -49,7 +81,7 @@ mod test {
49
81
let queries = vec ! [ ( 0 , 10 ) , ( 10 , 19 ) , ( 20 , 29 ) ] ;
50
82
let coords = queries. iter ( ) . flat_map ( |& ( i, j) | vec ! [ i, j + 1 ] ) . collect ( ) ;
51
83
let index = SparseIndex :: new ( coords) ;
52
-
84
+
53
85
assert_eq ! ( index. coords, vec![ 0 , 10 , 11 , 20 , 30 ] ) ;
54
86
}
55
87
0 commit comments