@@ -4,6 +4,7 @@ use std::convert::TryFrom;
44use std:: fmt:: Debug ;
55use std:: iter:: FromIterator ;
66use std:: ops:: Bound :: { self , Excluded , Included , Unbounded } ;
7+ use std:: ops:: RangeBounds ;
78use std:: rc:: Rc ;
89
910use super :: DeterministicRng ;
@@ -68,6 +69,11 @@ fn test_basic_small() {
6869 assert_eq ! ( map. last_key_value( ) , None ) ;
6970 assert_eq ! ( map. keys( ) . count( ) , 0 ) ;
7071 assert_eq ! ( map. values( ) . count( ) , 0 ) ;
72+ assert_eq ! ( map. range( ..) . next( ) , None ) ;
73+ assert_eq ! ( map. range( ..1 ) . next( ) , None ) ;
74+ assert_eq ! ( map. range( 1 ..) . next( ) , None ) ;
75+ assert_eq ! ( map. range( 1 ..=1 ) . next( ) , None ) ;
76+ assert_eq ! ( map. range( 1 ..2 ) . next( ) , None ) ;
7177 assert_eq ! ( map. insert( 1 , 1 ) , None ) ;
7278
7379 // 1 key-value pair:
@@ -118,6 +124,11 @@ fn test_basic_small() {
118124 assert_eq ! ( map. last_key_value( ) , None ) ;
119125 assert_eq ! ( map. keys( ) . count( ) , 0 ) ;
120126 assert_eq ! ( map. values( ) . count( ) , 0 ) ;
127+ assert_eq ! ( map. range( ..) . next( ) , None ) ;
128+ assert_eq ! ( map. range( ..1 ) . next( ) , None ) ;
129+ assert_eq ! ( map. range( 1 ..) . next( ) , None ) ;
130+ assert_eq ! ( map. range( 1 ..=1 ) . next( ) , None ) ;
131+ assert_eq ! ( map. range( 1 ..2 ) . next( ) , None ) ;
121132 assert_eq ! ( map. remove( & 1 ) , None ) ;
122133}
123134
@@ -128,7 +139,6 @@ fn test_iter() {
128139 #[ cfg( miri) ]
129140 let size = 200 ;
130141
131- // Forwards
132142 let mut map: BTreeMap < _ , _ > = ( 0 ..size) . map ( |i| ( i, i) ) . collect ( ) ;
133143
134144 fn test < T > ( size : usize , mut iter : T )
@@ -154,7 +164,6 @@ fn test_iter_rev() {
154164 #[ cfg( miri) ]
155165 let size = 200 ;
156166
157- // Forwards
158167 let mut map: BTreeMap < _ , _ > = ( 0 ..size) . map ( |i| ( i, i) ) . collect ( ) ;
159168
160169 fn test < T > ( size : usize , mut iter : T )
@@ -275,7 +284,6 @@ fn test_iter_mixed() {
275284 #[ cfg( miri) ]
276285 let size = 200 ;
277286
278- // Forwards
279287 let mut map: BTreeMap < _ , _ > = ( 0 ..size) . map ( |i| ( i, i) ) . collect ( ) ;
280288
281289 fn test < T > ( size : usize , mut iter : T )
@@ -299,27 +307,147 @@ fn test_iter_mixed() {
299307 test ( size, map. into_iter ( ) ) ;
300308}
301309
302- #[ test]
303- fn test_range_small ( ) {
304- let size = 5 ;
305-
306- // Forwards
307- let map: BTreeMap < _ , _ > = ( 0 ..size) . map ( |i| ( i, i) ) . collect ( ) ;
308-
309- let mut j = 0 ;
310- for ( ( & k, & v) , i) in map. range ( 2 ..) . zip ( 2 ..size) {
311- assert_eq ! ( k, i) ;
312- assert_eq ! ( v, i) ;
313- j += 1 ;
314- }
315- assert_eq ! ( j, size - 2 ) ;
310+ fn range_keys ( map : & BTreeMap < i32 , i32 > , range : impl RangeBounds < i32 > ) -> Vec < i32 > {
311+ map. range ( range)
312+ . map ( |( & k, & v) | {
313+ assert_eq ! ( k, v) ;
314+ k
315+ } )
316+ . collect ( )
316317}
317318
318319#[ test]
319- fn test_range_inclusive ( ) {
320- let size = 500 ;
320+ fn test_range_small ( ) {
321+ let size = 4 ;
322+
323+ let map: BTreeMap < _ , _ > = ( 1 ..=size) . map ( |i| ( i, i) ) . collect ( ) ;
324+ let all: Vec < _ > = ( 1 ..=size) . collect ( ) ;
325+ let ( first, last) = ( vec ! [ all[ 0 ] ] , vec ! [ all[ size as usize - 1 ] ] ) ;
326+
327+ assert_eq ! ( range_keys( & map, ( Excluded ( 0 ) , Excluded ( size + 1 ) ) ) , all) ;
328+ assert_eq ! ( range_keys( & map, ( Excluded ( 0 ) , Included ( size + 1 ) ) ) , all) ;
329+ assert_eq ! ( range_keys( & map, ( Excluded ( 0 ) , Included ( size) ) ) , all) ;
330+ assert_eq ! ( range_keys( & map, ( Excluded ( 0 ) , Unbounded ) ) , all) ;
331+ assert_eq ! ( range_keys( & map, ( Included ( 0 ) , Excluded ( size + 1 ) ) ) , all) ;
332+ assert_eq ! ( range_keys( & map, ( Included ( 0 ) , Included ( size + 1 ) ) ) , all) ;
333+ assert_eq ! ( range_keys( & map, ( Included ( 0 ) , Included ( size) ) ) , all) ;
334+ assert_eq ! ( range_keys( & map, ( Included ( 0 ) , Unbounded ) ) , all) ;
335+ assert_eq ! ( range_keys( & map, ( Included ( 1 ) , Excluded ( size + 1 ) ) ) , all) ;
336+ assert_eq ! ( range_keys( & map, ( Included ( 1 ) , Included ( size + 1 ) ) ) , all) ;
337+ assert_eq ! ( range_keys( & map, ( Included ( 1 ) , Included ( size) ) ) , all) ;
338+ assert_eq ! ( range_keys( & map, ( Included ( 1 ) , Unbounded ) ) , all) ;
339+ assert_eq ! ( range_keys( & map, ( Unbounded , Excluded ( size + 1 ) ) ) , all) ;
340+ assert_eq ! ( range_keys( & map, ( Unbounded , Included ( size + 1 ) ) ) , all) ;
341+ assert_eq ! ( range_keys( & map, ( Unbounded , Included ( size) ) ) , all) ;
342+ assert_eq ! ( range_keys( & map, ..) , all) ;
343+
344+ assert_eq ! ( range_keys( & map, ( Excluded ( 0 ) , Excluded ( 1 ) ) ) , vec![ ] ) ;
345+ assert_eq ! ( range_keys( & map, ( Excluded ( 0 ) , Included ( 0 ) ) ) , vec![ ] ) ;
346+ assert_eq ! ( range_keys( & map, ( Included ( 0 ) , Included ( 0 ) ) ) , vec![ ] ) ;
347+ assert_eq ! ( range_keys( & map, ( Included ( 0 ) , Excluded ( 1 ) ) ) , vec![ ] ) ;
348+ assert_eq ! ( range_keys( & map, ( Unbounded , Excluded ( 1 ) ) ) , vec![ ] ) ;
349+ assert_eq ! ( range_keys( & map, ( Unbounded , Included ( 0 ) ) ) , vec![ ] ) ;
350+ assert_eq ! ( range_keys( & map, ( Excluded ( 0 ) , Excluded ( 2 ) ) ) , first) ;
351+ assert_eq ! ( range_keys( & map, ( Excluded ( 0 ) , Included ( 1 ) ) ) , first) ;
352+ assert_eq ! ( range_keys( & map, ( Included ( 0 ) , Excluded ( 2 ) ) ) , first) ;
353+ assert_eq ! ( range_keys( & map, ( Included ( 0 ) , Included ( 1 ) ) ) , first) ;
354+ assert_eq ! ( range_keys( & map, ( Included ( 1 ) , Excluded ( 2 ) ) ) , first) ;
355+ assert_eq ! ( range_keys( & map, ( Included ( 1 ) , Included ( 1 ) ) ) , first) ;
356+ assert_eq ! ( range_keys( & map, ( Unbounded , Excluded ( 2 ) ) ) , first) ;
357+ assert_eq ! ( range_keys( & map, ( Unbounded , Included ( 1 ) ) ) , first) ;
358+ assert_eq ! ( range_keys( & map, ( Excluded ( size - 1 ) , Excluded ( size + 1 ) ) ) , last) ;
359+ assert_eq ! ( range_keys( & map, ( Excluded ( size - 1 ) , Included ( size + 1 ) ) ) , last) ;
360+ assert_eq ! ( range_keys( & map, ( Excluded ( size - 1 ) , Included ( size) ) ) , last) ;
361+ assert_eq ! ( range_keys( & map, ( Excluded ( size - 1 ) , Unbounded ) ) , last) ;
362+ assert_eq ! ( range_keys( & map, ( Included ( size) , Excluded ( size + 1 ) ) ) , last) ;
363+ assert_eq ! ( range_keys( & map, ( Included ( size) , Included ( size + 1 ) ) ) , last) ;
364+ assert_eq ! ( range_keys( & map, ( Included ( size) , Included ( size) ) ) , last) ;
365+ assert_eq ! ( range_keys( & map, ( Included ( size) , Unbounded ) ) , last) ;
366+ assert_eq ! ( range_keys( & map, ( Excluded ( size) , Excluded ( size + 1 ) ) ) , vec![ ] ) ;
367+ assert_eq ! ( range_keys( & map, ( Excluded ( size) , Included ( size) ) ) , vec![ ] ) ;
368+ assert_eq ! ( range_keys( & map, ( Excluded ( size) , Unbounded ) ) , vec![ ] ) ;
369+ assert_eq ! ( range_keys( & map, ( Included ( size + 1 ) , Excluded ( size + 1 ) ) ) , vec![ ] ) ;
370+ assert_eq ! ( range_keys( & map, ( Included ( size + 1 ) , Included ( size + 1 ) ) ) , vec![ ] ) ;
371+ assert_eq ! ( range_keys( & map, ( Included ( size + 1 ) , Unbounded ) ) , vec![ ] ) ;
372+
373+ assert_eq ! ( range_keys( & map, ..3 ) , vec![ 1 , 2 ] ) ;
374+ assert_eq ! ( range_keys( & map, 3 ..) , vec![ 3 , 4 ] ) ;
375+ assert_eq ! ( range_keys( & map, 2 ..=3 ) , vec![ 2 , 3 ] ) ;
376+ }
377+
378+ #[ test]
379+ fn test_range_depth_2 ( ) {
380+ // Assuming that node.CAPACITY is 11, having 12 pairs implies a depth 2 tree
381+ // with 2 leaves. Depending on details we don't want or need to rely upon,
382+ // the single key at the root will be 6 or 7.
383+
384+ let map: BTreeMap < _ , _ > = ( 1 ..=12 ) . map ( |i| ( i, i) ) . collect ( ) ;
385+ for & root in & [ 6 , 7 ] {
386+ assert_eq ! ( range_keys( & map, ( Excluded ( root) , Excluded ( root + 1 ) ) ) , vec![ ] ) ;
387+ assert_eq ! ( range_keys( & map, ( Excluded ( root) , Included ( root + 1 ) ) ) , vec![ root + 1 ] ) ;
388+ assert_eq ! ( range_keys( & map, ( Included ( root) , Excluded ( root + 1 ) ) ) , vec![ root] ) ;
389+ assert_eq ! ( range_keys( & map, ( Included ( root) , Included ( root + 1 ) ) ) , vec![ root, root + 1 ] ) ;
390+
391+ assert_eq ! ( range_keys( & map, ( Excluded ( root - 1 ) , Excluded ( root) ) ) , vec![ ] ) ;
392+ assert_eq ! ( range_keys( & map, ( Included ( root - 1 ) , Excluded ( root) ) ) , vec![ root - 1 ] ) ;
393+ assert_eq ! ( range_keys( & map, ( Excluded ( root - 1 ) , Included ( root) ) ) , vec![ root] ) ;
394+ assert_eq ! ( range_keys( & map, ( Included ( root - 1 ) , Included ( root) ) ) , vec![ root - 1 , root] ) ;
395+ }
396+ }
397+
398+ #[ test]
399+ fn test_range_large ( ) {
400+ let size = 200 ;
321401
322- let map: BTreeMap < _ , _ > = ( 0 ..=size) . map ( |i| ( i, i) ) . collect ( ) ;
402+ let map: BTreeMap < _ , _ > = ( 1 ..=size) . map ( |i| ( i, i) ) . collect ( ) ;
403+ let all: Vec < _ > = ( 1 ..=size) . collect ( ) ;
404+ let ( first, last) = ( vec ! [ all[ 0 ] ] , vec ! [ all[ size as usize - 1 ] ] ) ;
405+
406+ assert_eq ! ( range_keys( & map, ( Excluded ( 0 ) , Excluded ( size + 1 ) ) ) , all) ;
407+ assert_eq ! ( range_keys( & map, ( Excluded ( 0 ) , Included ( size + 1 ) ) ) , all) ;
408+ assert_eq ! ( range_keys( & map, ( Excluded ( 0 ) , Included ( size) ) ) , all) ;
409+ assert_eq ! ( range_keys( & map, ( Excluded ( 0 ) , Unbounded ) ) , all) ;
410+ assert_eq ! ( range_keys( & map, ( Included ( 0 ) , Excluded ( size + 1 ) ) ) , all) ;
411+ assert_eq ! ( range_keys( & map, ( Included ( 0 ) , Included ( size + 1 ) ) ) , all) ;
412+ assert_eq ! ( range_keys( & map, ( Included ( 0 ) , Included ( size) ) ) , all) ;
413+ assert_eq ! ( range_keys( & map, ( Included ( 0 ) , Unbounded ) ) , all) ;
414+ assert_eq ! ( range_keys( & map, ( Included ( 1 ) , Excluded ( size + 1 ) ) ) , all) ;
415+ assert_eq ! ( range_keys( & map, ( Included ( 1 ) , Included ( size + 1 ) ) ) , all) ;
416+ assert_eq ! ( range_keys( & map, ( Included ( 1 ) , Included ( size) ) ) , all) ;
417+ assert_eq ! ( range_keys( & map, ( Included ( 1 ) , Unbounded ) ) , all) ;
418+ assert_eq ! ( range_keys( & map, ( Unbounded , Excluded ( size + 1 ) ) ) , all) ;
419+ assert_eq ! ( range_keys( & map, ( Unbounded , Included ( size + 1 ) ) ) , all) ;
420+ assert_eq ! ( range_keys( & map, ( Unbounded , Included ( size) ) ) , all) ;
421+ assert_eq ! ( range_keys( & map, ..) , all) ;
422+
423+ assert_eq ! ( range_keys( & map, ( Excluded ( 0 ) , Excluded ( 1 ) ) ) , vec![ ] ) ;
424+ assert_eq ! ( range_keys( & map, ( Excluded ( 0 ) , Included ( 0 ) ) ) , vec![ ] ) ;
425+ assert_eq ! ( range_keys( & map, ( Included ( 0 ) , Included ( 0 ) ) ) , vec![ ] ) ;
426+ assert_eq ! ( range_keys( & map, ( Included ( 0 ) , Excluded ( 1 ) ) ) , vec![ ] ) ;
427+ assert_eq ! ( range_keys( & map, ( Unbounded , Excluded ( 1 ) ) ) , vec![ ] ) ;
428+ assert_eq ! ( range_keys( & map, ( Unbounded , Included ( 0 ) ) ) , vec![ ] ) ;
429+ assert_eq ! ( range_keys( & map, ( Excluded ( 0 ) , Excluded ( 2 ) ) ) , first) ;
430+ assert_eq ! ( range_keys( & map, ( Excluded ( 0 ) , Included ( 1 ) ) ) , first) ;
431+ assert_eq ! ( range_keys( & map, ( Included ( 0 ) , Excluded ( 2 ) ) ) , first) ;
432+ assert_eq ! ( range_keys( & map, ( Included ( 0 ) , Included ( 1 ) ) ) , first) ;
433+ assert_eq ! ( range_keys( & map, ( Included ( 1 ) , Excluded ( 2 ) ) ) , first) ;
434+ assert_eq ! ( range_keys( & map, ( Included ( 1 ) , Included ( 1 ) ) ) , first) ;
435+ assert_eq ! ( range_keys( & map, ( Unbounded , Excluded ( 2 ) ) ) , first) ;
436+ assert_eq ! ( range_keys( & map, ( Unbounded , Included ( 1 ) ) ) , first) ;
437+ assert_eq ! ( range_keys( & map, ( Excluded ( size - 1 ) , Excluded ( size + 1 ) ) ) , last) ;
438+ assert_eq ! ( range_keys( & map, ( Excluded ( size - 1 ) , Included ( size + 1 ) ) ) , last) ;
439+ assert_eq ! ( range_keys( & map, ( Excluded ( size - 1 ) , Included ( size) ) ) , last) ;
440+ assert_eq ! ( range_keys( & map, ( Excluded ( size - 1 ) , Unbounded ) ) , last) ;
441+ assert_eq ! ( range_keys( & map, ( Included ( size) , Excluded ( size + 1 ) ) ) , last) ;
442+ assert_eq ! ( range_keys( & map, ( Included ( size) , Included ( size + 1 ) ) ) , last) ;
443+ assert_eq ! ( range_keys( & map, ( Included ( size) , Included ( size) ) ) , last) ;
444+ assert_eq ! ( range_keys( & map, ( Included ( size) , Unbounded ) ) , last) ;
445+ assert_eq ! ( range_keys( & map, ( Excluded ( size) , Excluded ( size + 1 ) ) ) , vec![ ] ) ;
446+ assert_eq ! ( range_keys( & map, ( Excluded ( size) , Included ( size) ) ) , vec![ ] ) ;
447+ assert_eq ! ( range_keys( & map, ( Excluded ( size) , Unbounded ) ) , vec![ ] ) ;
448+ assert_eq ! ( range_keys( & map, ( Included ( size + 1 ) , Excluded ( size + 1 ) ) ) , vec![ ] ) ;
449+ assert_eq ! ( range_keys( & map, ( Included ( size + 1 ) , Included ( size + 1 ) ) ) , vec![ ] ) ;
450+ assert_eq ! ( range_keys( & map, ( Included ( size + 1 ) , Unbounded ) ) , vec![ ] ) ;
323451
324452 fn check < ' a , L , R > ( lhs : L , rhs : R )
325453 where
@@ -331,18 +459,9 @@ fn test_range_inclusive() {
331459 assert_eq ! ( lhs, rhs) ;
332460 }
333461
334- check ( map. range ( size + 1 ..=size + 1 ) , vec ! [ ] ) ;
335- check ( map. range ( size..=size) , vec ! [ ( & size, & size) ] ) ;
336- check ( map. range ( size..=size + 1 ) , vec ! [ ( & size, & size) ] ) ;
337- check ( map. range ( 0 ..=0 ) , vec ! [ ( & 0 , & 0 ) ] ) ;
338- check ( map. range ( 0 ..=size - 1 ) , map. range ( ..size) ) ;
339- check ( map. range ( -1 ..=-1 ) , vec ! [ ] ) ;
340- check ( map. range ( -1 ..=size) , map. range ( ..) ) ;
341- check ( map. range ( ..=size) , map. range ( ..) ) ;
342- check ( map. range ( ..=200 ) , map. range ( ..201 ) ) ;
462+ check ( map. range ( ..=100 ) , map. range ( ..101 ) ) ;
343463 check ( map. range ( 5 ..=8 ) , vec ! [ ( & 5 , & 5 ) , ( & 6 , & 6 ) , ( & 7 , & 7 ) , ( & 8 , & 8 ) ] ) ;
344- check ( map. range ( -1 ..=0 ) , vec ! [ ( & 0 , & 0 ) ] ) ;
345- check ( map. range ( -1 ..=2 ) , vec ! [ ( & 0 , & 0 ) , ( & 1 , & 1 ) , ( & 2 , & 2 ) ] ) ;
464+ check ( map. range ( -1 ..=2 ) , vec ! [ ( & 1 , & 1 ) , ( & 2 , & 2 ) ] ) ;
346465}
347466
348467#[ test]
0 commit comments