@@ -6,11 +6,17 @@ use core::borrow::Borrow;
6
6
#[ cfg( feature = "std" ) ]
7
7
use std:: collections:: BTreeMap ;
8
8
#[ cfg( feature = "std" ) ]
9
- use std:: collections:: btree_map:: { Iter as BTreeIter , IterMut as BTreeIterMut } ;
9
+ use std:: collections:: btree_map:: { Iter as BTreeIter , IterMut as BTreeIterMut , Range as BTreeRange } ;
10
+ #[ cfg( feature = "std" ) ]
11
+ use std:: collections:: Bound :: { Included , Excluded } ;
10
12
#[ cfg( all( feature = "alloc" , not( feature = "std" ) ) ) ]
11
13
use alloc:: btree_map:: BTreeMap ;
12
14
#[ cfg( all( feature = "alloc" , not( feature = "std" ) ) ) ]
13
- use alloc:: btree_map:: { Iter as BTreeIter , IterMut as BTreeIterMut } ;
15
+ use alloc:: btree_map:: { Iter as BTreeIter , IterMut as BTreeIterMut , Range as BTreeRange } ;
16
+ #[ cfg( all( feature = "alloc" , not( feature = "std" ) , RUSTC_RANGEARGUMENT ) ) ]
17
+ use alloc:: Bound :: { Included , Excluded } ; // Rust < 1.26
18
+ #[ cfg( all( feature = "alloc" , not( feature = "std" ) , RUSTC_RANGEBOUNDS ) ) ]
19
+ use core:: ops:: { Included , Excluded } ; // Rust >= 1.26
14
20
15
21
/// A managed map.
16
22
///
@@ -90,6 +96,103 @@ impl<T> Into<Option<T>> for RevOption<T> {
90
96
}
91
97
}
92
98
99
+ pub enum Range < ' a , ' b , K : ' a , V : ' a > where ' a : ' b {
100
+ /// Borrowed variant.
101
+ Borrowed ( & ' b [ Option < ( K , V ) > ] , usize ) ,
102
+ /// Owned variant, only available with the `std` or `alloc` feature enabled.
103
+ #[ cfg( any( feature = "std" , feature = "alloc" ) ) ]
104
+ Owned ( BTreeRange < ' b , K , V > ) ,
105
+ _Phantom( & ' a K ) ,
106
+ }
107
+
108
+ impl < ' b , ' a : ' b , K : ' a , V : ' a > Iterator for Range < ' a , ' b , K , V > {
109
+ type Item = ( & ' b K , & ' b V ) ;
110
+
111
+ fn next ( & mut self ) -> Option < Self :: Item > {
112
+ match * self {
113
+ Range :: Borrowed ( ref slice, ref mut index) => {
114
+ * index += 1 ;
115
+ if * index-1 >= slice. len ( ) {
116
+ None
117
+ }
118
+ else {
119
+ match slice[ * index-1 ] {
120
+ None => None ,
121
+ Some ( ( ref k, ref v) ) => Some ( ( k, v) )
122
+ }
123
+ }
124
+ } ,
125
+ #[ cfg( any( feature = "std" , feature = "alloc" ) ) ]
126
+ Range :: Owned ( ref mut range) => range. next ( ) ,
127
+ Range :: _Phantom( _) => unreachable ! ( ) ,
128
+ }
129
+ }
130
+ }
131
+
132
+ fn binary_search_by_key_range < K , V , Q > ( slice : & [ Option < ( K , V ) > ] , key_begin : & Q , key_end : & Q ) -> Result < ( usize , usize ) , ( ) >
133
+ where K : Ord + Borrow < Q > , Q : Ord + ?Sized
134
+ {
135
+ if slice. len ( ) == 0 {
136
+ return Err ( ( ) )
137
+ }
138
+ let ( mut left, mut right) = ( 0 , slice. len ( ) -1 ) ;
139
+
140
+ //let key = |entry: Option<(K, V)>| { entry.as_ref().map(|&(ref key, _)| key.borrow()) };
141
+ macro_rules! key {
142
+ ( $e: expr) => { $e. as_ref( ) . map( |& ( ref key, _) | key. borrow( ) ) }
143
+ }
144
+
145
+ // We cannot use slice.binary_search_by_key instead of each of the
146
+ // two loops here, because we need the left-most match (for begin) and
147
+ // the right-most match (for end), and the stdlib does not provide
148
+ // any of these guarantees.
149
+
150
+ // Find the beginning
151
+ while left < right {
152
+ let middle = left + ( right-left) /2 ;
153
+ if key ! ( slice[ middle] ) < Some ( key_begin) {
154
+ left = middle+1 ;
155
+ }
156
+ else if middle > 0 && key ! ( slice[ middle-1 ] ) >= Some ( key_begin) {
157
+ right = middle-1 ;
158
+ }
159
+ else {
160
+ left = middle;
161
+ right = middle;
162
+ break ;
163
+ }
164
+ }
165
+ assert_eq ! ( left, right) ;
166
+ let begin = left;
167
+ if key ! ( slice[ begin] ) < Some ( key_begin) {
168
+ return Err ( ( ) )
169
+ }
170
+
171
+ // Find the ending
172
+ right = slice. len ( ) ; // no need to reset left
173
+ while left < right {
174
+ let middle = left + ( right-left+1 ) /2 ;
175
+ if key ! ( slice[ middle-1 ] ) >= Some ( key_end) {
176
+ right = middle-1 ;
177
+ }
178
+ else if middle < slice. len ( ) && key ! ( slice[ middle] ) < Some ( key_end) {
179
+ left = middle+1 ;
180
+ }
181
+ else {
182
+ left = middle;
183
+ right = middle;
184
+ break ;
185
+ }
186
+ }
187
+ assert_eq ! ( left, right) ;
188
+ let end = right;
189
+ if end == 0 || key ! ( slice[ end-1 ] ) > Some ( key_end) {
190
+ return Err ( ( ) )
191
+ }
192
+
193
+ Ok ( ( begin, end) )
194
+ }
195
+
93
196
fn binary_search_by_key < K , V , Q > ( slice : & [ Option < ( K , V ) > ] , key : & Q ) -> Result < usize , usize >
94
197
where K : Ord + Borrow < Q > , Q : Ord + ?Sized
95
198
{
@@ -155,6 +258,23 @@ impl<'a, K: Ord + 'a, V: 'a> ManagedMap<'a, K, V> {
155
258
}
156
259
}
157
260
261
+ pub fn range < ' b , ' c , Q > ( & ' c self , key_begin : & Q , key_end : & Q ) -> Range < ' a , ' b , K , V >
262
+ where K : Borrow < Q > , Q : Ord + ?Sized , ' a : ' b , ' c : ' a
263
+ {
264
+ match self {
265
+ & ManagedMap :: Borrowed ( ref pairs) => {
266
+ match binary_search_by_key_range ( & pairs[ 0 ..self . len ( ) ] , key_begin, key_end) {
267
+ Ok ( ( begin, end) ) => Range :: Borrowed ( & pairs[ begin..end] , 0 ) ,
268
+ Err ( ( ) ) => Range :: Borrowed ( & [ ] , 0 ) ,
269
+ }
270
+ } ,
271
+ #[ cfg( any( feature = "std" , feature = "alloc" ) ) ]
272
+ & ManagedMap :: Owned ( ref map) => {
273
+ Range :: Owned ( map. range ( ( Included ( key_begin) , Excluded ( key_end) ) ) )
274
+ } ,
275
+ }
276
+ }
277
+
158
278
pub fn insert ( & mut self , key : K , new_value : V ) -> Result < Option < V > , ( K , V ) > {
159
279
match self {
160
280
& mut ManagedMap :: Borrowed ( ref mut pairs) if pairs. len ( ) < 1 =>
@@ -379,6 +499,164 @@ mod test {
379
499
assert_eq ! ( map. get( "q" ) , None ) ;
380
500
}
381
501
502
+ #[ test]
503
+ fn test_get_none_empty ( ) {
504
+ let mut pairs = all_pairs_empty ( ) ;
505
+ let map = ManagedMap :: Borrowed ( & mut pairs) ;
506
+ assert_eq ! ( map. len( ) , 0 ) ;
507
+ assert ! ( map. is_empty( ) ) ;
508
+ assert_eq ! ( map. get( "q" ) , None ) ;
509
+ }
510
+
511
+ #[ test]
512
+ fn test_range_full ( ) {
513
+ let mut pairs = all_pairs_full ( ) ;
514
+ let map = ManagedMap :: Borrowed ( & mut pairs) ;
515
+ assert_eq ! ( map. len( ) , 4 ) ;
516
+
517
+ let mut range = map. range ( "0" , "a" ) ;
518
+ assert_eq ! ( range. next( ) , None ) ;
519
+ let mut range = map. range ( "0" , "b" ) ;
520
+ assert_eq ! ( range. next( ) , Some ( ( & "a" , & 1 ) ) ) ;
521
+ assert_eq ! ( range. next( ) , None ) ;
522
+ let mut range = map. range ( "0" , "c" ) ;
523
+ assert_eq ! ( range. next( ) , Some ( ( & "a" , & 1 ) ) ) ;
524
+ assert_eq ! ( range. next( ) , Some ( ( & "b" , & 2 ) ) ) ;
525
+ assert_eq ! ( range. next( ) , None ) ;
526
+ let mut range = map. range ( "0" , "d" ) ;
527
+ assert_eq ! ( range. next( ) , Some ( ( & "a" , & 1 ) ) ) ;
528
+ assert_eq ! ( range. next( ) , Some ( ( & "b" , & 2 ) ) ) ;
529
+ assert_eq ! ( range. next( ) , Some ( ( & "c" , & 3 ) ) ) ;
530
+ assert_eq ! ( range. next( ) , None ) ;
531
+ let mut range = map. range ( "0" , "e" ) ;
532
+ assert_eq ! ( range. next( ) , Some ( ( & "a" , & 1 ) ) ) ;
533
+ assert_eq ! ( range. next( ) , Some ( ( & "b" , & 2 ) ) ) ;
534
+ assert_eq ! ( range. next( ) , Some ( ( & "c" , & 3 ) ) ) ;
535
+ assert_eq ! ( range. next( ) , Some ( ( & "d" , & 4 ) ) ) ;
536
+ assert_eq ! ( range. next( ) , None ) ;
537
+
538
+ let mut range = map. range ( "a" , "a" ) ;
539
+ assert_eq ! ( range. next( ) , None ) ;
540
+ let mut range = map. range ( "a" , "b" ) ;
541
+ assert_eq ! ( range. next( ) , Some ( ( & "a" , & 1 ) ) ) ;
542
+ assert_eq ! ( range. next( ) , None ) ;
543
+ let mut range = map. range ( "a" , "c" ) ;
544
+ assert_eq ! ( range. next( ) , Some ( ( & "a" , & 1 ) ) ) ;
545
+ assert_eq ! ( range. next( ) , Some ( ( & "b" , & 2 ) ) ) ;
546
+ assert_eq ! ( range. next( ) , None ) ;
547
+ let mut range = map. range ( "a" , "d" ) ;
548
+ assert_eq ! ( range. next( ) , Some ( ( & "a" , & 1 ) ) ) ;
549
+ assert_eq ! ( range. next( ) , Some ( ( & "b" , & 2 ) ) ) ;
550
+ assert_eq ! ( range. next( ) , Some ( ( & "c" , & 3 ) ) ) ;
551
+ assert_eq ! ( range. next( ) , None ) ;
552
+ let mut range = map. range ( "a" , "e" ) ;
553
+ assert_eq ! ( range. next( ) , Some ( ( & "a" , & 1 ) ) ) ;
554
+ assert_eq ! ( range. next( ) , Some ( ( & "b" , & 2 ) ) ) ;
555
+ assert_eq ! ( range. next( ) , Some ( ( & "c" , & 3 ) ) ) ;
556
+ assert_eq ! ( range. next( ) , Some ( ( & "d" , & 4 ) ) ) ;
557
+ assert_eq ! ( range. next( ) , None ) ;
558
+
559
+ let mut range = map. range ( "b" , "a" ) ;
560
+ assert_eq ! ( range. next( ) , None ) ;
561
+ let mut range = map. range ( "b" , "b" ) ;
562
+ assert_eq ! ( range. next( ) , None ) ;
563
+ let mut range = map. range ( "b" , "c" ) ;
564
+ assert_eq ! ( range. next( ) , Some ( ( & "b" , & 2 ) ) ) ;
565
+ assert_eq ! ( range. next( ) , None ) ;
566
+ let mut range = map. range ( "b" , "d" ) ;
567
+ assert_eq ! ( range. next( ) , Some ( ( & "b" , & 2 ) ) ) ;
568
+ assert_eq ! ( range. next( ) , Some ( ( & "c" , & 3 ) ) ) ;
569
+ assert_eq ! ( range. next( ) , None ) ;
570
+ let mut range = map. range ( "b" , "e" ) ;
571
+ assert_eq ! ( range. next( ) , Some ( ( & "b" , & 2 ) ) ) ;
572
+ assert_eq ! ( range. next( ) , Some ( ( & "c" , & 3 ) ) ) ;
573
+ assert_eq ! ( range. next( ) , Some ( ( & "d" , & 4 ) ) ) ;
574
+ assert_eq ! ( range. next( ) , None ) ;
575
+
576
+ let mut range = map. range ( "c" , "a" ) ;
577
+ assert_eq ! ( range. next( ) , None ) ;
578
+ let mut range = map. range ( "c" , "b" ) ;
579
+ assert_eq ! ( range. next( ) , None ) ;
580
+ let mut range = map. range ( "c" , "c" ) ;
581
+ assert_eq ! ( range. next( ) , None ) ;
582
+ let mut range = map. range ( "c" , "d" ) ;
583
+ assert_eq ! ( range. next( ) , Some ( ( & "c" , & 3 ) ) ) ;
584
+ assert_eq ! ( range. next( ) , None ) ;
585
+ let mut range = map. range ( "c" , "e" ) ;
586
+ assert_eq ! ( range. next( ) , Some ( ( & "c" , & 3 ) ) ) ;
587
+ assert_eq ! ( range. next( ) , Some ( ( & "d" , & 4 ) ) ) ;
588
+ assert_eq ! ( range. next( ) , None ) ;
589
+
590
+ let mut range = map. range ( "d" , "a" ) ;
591
+ assert_eq ! ( range. next( ) , None ) ;
592
+ let mut range = map. range ( "d" , "b" ) ;
593
+ assert_eq ! ( range. next( ) , None ) ;
594
+ let mut range = map. range ( "d" , "c" ) ;
595
+ assert_eq ! ( range. next( ) , None ) ;
596
+ let mut range = map. range ( "d" , "d" ) ;
597
+ assert_eq ! ( range. next( ) , None ) ;
598
+ let mut range = map. range ( "d" , "e" ) ;
599
+ assert_eq ! ( range. next( ) , Some ( ( & "d" , & 4 ) ) ) ;
600
+ assert_eq ! ( range. next( ) , None ) ;
601
+
602
+ let mut range = map. range ( "e" , "a" ) ;
603
+ assert_eq ! ( range. next( ) , None ) ;
604
+ let mut range = map. range ( "e" , "b" ) ;
605
+ assert_eq ! ( range. next( ) , None ) ;
606
+ let mut range = map. range ( "e" , "c" ) ;
607
+ assert_eq ! ( range. next( ) , None ) ;
608
+ let mut range = map. range ( "e" , "d" ) ;
609
+ assert_eq ! ( range. next( ) , None ) ;
610
+ let mut range = map. range ( "e" , "e" ) ;
611
+ assert_eq ! ( range. next( ) , None ) ;
612
+ }
613
+
614
+ #[ test]
615
+ fn test_range_one_pair ( ) {
616
+ let mut pairs = one_pair_full ( ) ;
617
+ let map = ManagedMap :: Borrowed ( & mut pairs) ;
618
+ assert_eq ! ( map. len( ) , 1 ) ;
619
+
620
+ let mut range = map. range ( "0" , "a" ) ;
621
+ assert_eq ! ( range. next( ) , None ) ;
622
+ let mut range = map. range ( "0" , "b" ) ;
623
+ assert_eq ! ( range. next( ) , Some ( ( & "a" , & 1 ) ) ) ;
624
+ assert_eq ! ( range. next( ) , None ) ;
625
+ let mut range = map. range ( "0" , "c" ) ;
626
+ assert_eq ! ( range. next( ) , Some ( ( & "a" , & 1 ) ) ) ;
627
+ assert_eq ! ( range. next( ) , None ) ;
628
+
629
+ let mut range = map. range ( "a" , "a" ) ;
630
+ assert_eq ! ( range. next( ) , None ) ;
631
+ let mut range = map. range ( "a" , "b" ) ;
632
+ assert_eq ! ( range. next( ) , Some ( ( & "a" , & 1 ) ) ) ;
633
+ assert_eq ! ( range. next( ) , None ) ;
634
+ let mut range = map. range ( "a" , "c" ) ;
635
+ assert_eq ! ( range. next( ) , Some ( ( & "a" , & 1 ) ) ) ;
636
+ assert_eq ! ( range. next( ) , None ) ;
637
+
638
+ let mut range = map. range ( "b" , "a" ) ;
639
+ assert_eq ! ( range. next( ) , None ) ;
640
+ let mut range = map. range ( "b" , "b" ) ;
641
+ assert_eq ! ( range. next( ) , None ) ;
642
+ let mut range = map. range ( "b" , "c" ) ;
643
+ assert_eq ! ( range. next( ) , None ) ;
644
+ }
645
+
646
+ #[ test]
647
+ fn test_range_empty ( ) {
648
+ let mut pairs = all_pairs_empty ( ) ;
649
+ let map = ManagedMap :: Borrowed ( & mut pairs) ;
650
+ assert_eq ! ( map. len( ) , 0 ) ;
651
+
652
+ let mut range = map. range ( "b" , "a" ) ;
653
+ assert_eq ! ( range. next( ) , None ) ;
654
+ let mut range = map. range ( "b" , "b" ) ;
655
+ assert_eq ! ( range. next( ) , None ) ;
656
+ let mut range = map. range ( "b" , "c" ) ;
657
+ assert_eq ! ( range. next( ) , None ) ;
658
+ }
659
+
382
660
#[ test]
383
661
fn test_get_mut_some ( ) {
384
662
let mut pairs = all_pairs_full ( ) ;
0 commit comments