1 // Copyright 2014 The Rust Project Developers. See the COPYRIGHT
2 // file at the top-level directory of this distribution and at
3 // http://rust-lang.org/COPYRIGHT.
5 // Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
6 // http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
7 // <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
8 // option. This file may not be copied, modified, or distributed
9 // except according to those terms.
11 use std
::collections
::BTreeMap
;
12 use std
::collections
::Bound
::{self, Excluded, Included, Unbounded}
;
13 use std
::collections
::btree_map
::Entry
::{Occupied, Vacant}
;
16 use std
::iter
::FromIterator
;
17 use super::DeterministicRng
;
20 fn test_basic_large() {
21 let mut map
= BTreeMap
::new();
23 assert_eq
!(map
.len(), 0);
26 assert_eq
!(map
.insert(i
, 10 * i
), None
);
27 assert_eq
!(map
.len(), i
+ 1);
31 assert_eq
!(map
.get(&i
).unwrap(), &(i
* 10));
34 for i
in size
..size
* 2 {
35 assert_eq
!(map
.get(&i
), None
);
39 assert_eq
!(map
.insert(i
, 100 * i
), Some(10 * i
));
40 assert_eq
!(map
.len(), size
);
44 assert_eq
!(map
.get(&i
).unwrap(), &(i
* 100));
47 for i
in 0..size
/ 2 {
48 assert_eq
!(map
.remove(&(i
* 2)), Some(i
* 200));
49 assert_eq
!(map
.len(), size
- i
- 1);
52 for i
in 0..size
/ 2 {
53 assert_eq
!(map
.get(&(2 * i
)), None
);
54 assert_eq
!(map
.get(&(2 * i
+ 1)).unwrap(), &(i
* 200 + 100));
57 for i
in 0..size
/ 2 {
58 assert_eq
!(map
.remove(&(2 * i
)), None
);
59 assert_eq
!(map
.remove(&(2 * i
+ 1)), Some(i
* 200 + 100));
60 assert_eq
!(map
.len(), size
/ 2 - i
- 1);
65 fn test_basic_small() {
66 let mut map
= BTreeMap
::new();
67 assert_eq
!(map
.remove(&1), None
);
68 assert_eq
!(map
.get(&1), None
);
69 assert_eq
!(map
.insert(1, 1), None
);
70 assert_eq
!(map
.get(&1), Some(&1));
71 assert_eq
!(map
.insert(1, 2), Some(1));
72 assert_eq
!(map
.get(&1), Some(&2));
73 assert_eq
!(map
.insert(2, 4), None
);
74 assert_eq
!(map
.get(&2), Some(&4));
75 assert_eq
!(map
.remove(&1), Some(2));
76 assert_eq
!(map
.remove(&2), Some(4));
77 assert_eq
!(map
.remove(&1), None
);
85 let mut map
: BTreeMap
<_
, _
> = (0..size
).map(|i
| (i
, i
)).collect();
87 fn test
<T
>(size
: usize, mut iter
: T
)
88 where T
: Iterator
<Item
= (usize, usize)>
91 assert_eq
!(iter
.size_hint(), (size
- i
, Some(size
- i
)));
92 assert_eq
!(iter
.next().unwrap(), (i
, i
));
94 assert_eq
!(iter
.size_hint(), (0, Some(0)));
95 assert_eq
!(iter
.next(), None
);
97 test(size
, map
.iter().map(|(&k
, &v
)| (k
, v
)));
98 test(size
, map
.iter_mut().map(|(&k
, &mut v
)| (k
, v
)));
99 test(size
, map
.into_iter());
107 let mut map
: BTreeMap
<_
, _
> = (0..size
).map(|i
| (i
, i
)).collect();
109 fn test
<T
>(size
: usize, mut iter
: T
)
110 where T
: Iterator
<Item
= (usize, usize)>
113 assert_eq
!(iter
.size_hint(), (size
- i
, Some(size
- i
)));
114 assert_eq
!(iter
.next().unwrap(), (size
- i
- 1, size
- i
- 1));
116 assert_eq
!(iter
.size_hint(), (0, Some(0)));
117 assert_eq
!(iter
.next(), None
);
119 test(size
, map
.iter().rev().map(|(&k
, &v
)| (k
, v
)));
120 test(size
, map
.iter_mut().rev().map(|(&k
, &mut v
)| (k
, v
)));
121 test(size
, map
.into_iter().rev());
125 fn test_values_mut() {
126 let mut a
= BTreeMap
::new();
127 a
.insert(1, String
::from("hello"));
128 a
.insert(2, String
::from("goodbye"));
130 for value
in a
.values_mut() {
134 let values
: Vec
<String
> = a
.values().cloned().collect();
135 assert_eq
!(values
, [String
::from("hello!"), String
::from("goodbye!")]);
139 fn test_iter_mixed() {
143 let mut map
: BTreeMap
<_
, _
> = (0..size
).map(|i
| (i
, i
)).collect();
145 fn test
<T
>(size
: usize, mut iter
: T
)
146 where T
: Iterator
<Item
= (usize, usize)> + DoubleEndedIterator
148 for i
in 0..size
/ 4 {
149 assert_eq
!(iter
.size_hint(), (size
- i
* 2, Some(size
- i
* 2)));
150 assert_eq
!(iter
.next().unwrap(), (i
, i
));
151 assert_eq
!(iter
.next_back().unwrap(), (size
- i
- 1, size
- i
- 1));
153 for i
in size
/ 4..size
* 3 / 4 {
154 assert_eq
!(iter
.size_hint(), (size
* 3 / 4 - i
, Some(size
* 3 / 4 - i
)));
155 assert_eq
!(iter
.next().unwrap(), (i
, i
));
157 assert_eq
!(iter
.size_hint(), (0, Some(0)));
158 assert_eq
!(iter
.next(), None
);
160 test(size
, map
.iter().map(|(&k
, &v
)| (k
, v
)));
161 test(size
, map
.iter_mut().map(|(&k
, &mut v
)| (k
, v
)));
162 test(size
, map
.into_iter());
166 fn test_range_small() {
170 let map
: BTreeMap
<_
, _
> = (0..size
).map(|i
| (i
, i
)).collect();
173 for ((&k
, &v
), i
) in map
.range(Included(&2), Unbounded
).zip(2..size
) {
178 assert_eq
!(j
, size
- 2);
182 fn test_range_1000() {
184 let map
: BTreeMap
<_
, _
> = (0..size
).map(|i
| (i
, i
)).collect();
186 fn test(map
: &BTreeMap
<u32, u32>, size
: u32, min
: Bound
<&u32>, max
: Bound
<&u32>) {
187 let mut kvs
= map
.range(min
, max
).map(|(&k
, &v
)| (k
, v
));
188 let mut pairs
= (0..size
).map(|i
| (i
, i
));
190 for (kv
, pair
) in kvs
.by_ref().zip(pairs
.by_ref()) {
191 assert_eq
!(kv
, pair
);
193 assert_eq
!(kvs
.next(), None
);
194 assert_eq
!(pairs
.next(), None
);
196 test(&map
, size
, Included(&0), Excluded(&size
));
197 test(&map
, size
, Unbounded
, Excluded(&size
));
198 test(&map
, size
, Included(&0), Included(&(size
- 1)));
199 test(&map
, size
, Unbounded
, Included(&(size
- 1)));
200 test(&map
, size
, Included(&0), Unbounded
);
201 test(&map
, size
, Unbounded
, Unbounded
);
207 let map
: BTreeMap
<_
, _
> = (0..size
).map(|i
| (i
, i
)).collect();
211 let mut kvs
= map
.range(Included(&i
), Included(&j
)).map(|(&k
, &v
)| (k
, v
));
212 let mut pairs
= (i
..j
+ 1).map(|i
| (i
, i
));
214 for (kv
, pair
) in kvs
.by_ref().zip(pairs
.by_ref()) {
215 assert_eq
!(kv
, pair
);
217 assert_eq
!(kvs
.next(), None
);
218 assert_eq
!(pairs
.next(), None
);
225 // make sure these compile -- using the Borrow trait
227 let mut map
= BTreeMap
::new();
228 map
.insert("0".to_string(), 1);
229 assert_eq
!(map
["0"], 1);
233 let mut map
= BTreeMap
::new();
234 map
.insert(Box
::new(0), 1);
235 assert_eq
!(map
[&0], 1);
239 let mut map
= BTreeMap
::new();
240 map
.insert(Box
::new([0, 1]) as Box
<[i32]>, 1);
241 assert_eq
!(map
[&[0, 1][..]], 1);
245 let mut map
= BTreeMap
::new();
246 map
.insert(Rc
::new(0), 1);
247 assert_eq
!(map
[&0], 1);
253 let xs
= [(1, 10), (2, 20), (3, 30), (4, 40), (5, 50), (6, 60)];
255 let mut map
: BTreeMap
<_
, _
> = xs
.iter().cloned().collect();
257 // Existing key (insert)
259 Vacant(_
) => unreachable
!(),
260 Occupied(mut view
) => {
261 assert_eq
!(view
.get(), &10);
262 assert_eq
!(view
.insert(100), 10);
265 assert_eq
!(map
.get(&1).unwrap(), &100);
266 assert_eq
!(map
.len(), 6);
269 // Existing key (update)
271 Vacant(_
) => unreachable
!(),
272 Occupied(mut view
) => {
273 let v
= view
.get_mut();
277 assert_eq
!(map
.get(&2).unwrap(), &200);
278 assert_eq
!(map
.len(), 6);
280 // Existing key (take)
282 Vacant(_
) => unreachable
!(),
284 assert_eq
!(view
.remove(), 30);
287 assert_eq
!(map
.get(&3), None
);
288 assert_eq
!(map
.len(), 5);
291 // Inexistent key (insert)
292 match map
.entry(10) {
293 Occupied(_
) => unreachable
!(),
295 assert_eq
!(*view
.insert(1000), 1000);
298 assert_eq
!(map
.get(&10).unwrap(), &1000);
299 assert_eq
!(map
.len(), 6);
303 fn test_extend_ref() {
304 let mut a
= BTreeMap
::new();
306 let mut b
= BTreeMap
::new();
308 b
.insert(3, "three");
312 assert_eq
!(a
.len(), 3);
313 assert_eq
!(a
[&1], "one");
314 assert_eq
!(a
[&2], "two");
315 assert_eq
!(a
[&3], "three");
320 let mut m
= BTreeMap
::new();
321 assert_eq
!(m
.len(), 0);
323 assert_eq
!(m
.insert((), ()), None
);
324 assert_eq
!(m
.len(), 1);
326 assert_eq
!(m
.insert((), ()), Some(()));
327 assert_eq
!(m
.len(), 1);
328 assert_eq
!(m
.iter().count(), 1);
331 assert_eq
!(m
.len(), 0);
337 assert_eq
!(m
.len(), 1);
338 assert_eq
!(m
.iter().count(), 1);
341 // This test's only purpose is to ensure that zero-sized keys with nonsensical orderings
342 // do not cause segfaults when used with zero-sized values. All other map behavior is
346 use std
::cmp
::Ordering
;
350 impl PartialEq
for Bad
{
351 fn eq(&self, _
: &Self) -> bool
{
358 impl PartialOrd
for Bad
{
359 fn partial_cmp(&self, _
: &Self) -> Option
<Ordering
> {
365 fn cmp(&self, _
: &Self) -> Ordering
{
370 let mut m
= BTreeMap
::new();
379 let mut map
= BTreeMap
::new();
381 assert_eq
!(map
.len(), 0);
384 assert_eq
!(map
.insert(i
, 10 * i
), None
);
385 assert_eq
!(map
.len(), i
+ 1);
386 assert_eq
!(map
, map
.clone());
390 assert_eq
!(map
.insert(i
, 100 * i
), Some(10 * i
));
391 assert_eq
!(map
.len(), size
);
392 assert_eq
!(map
, map
.clone());
395 for i
in 0..size
/ 2 {
396 assert_eq
!(map
.remove(&(i
* 2)), Some(i
* 200));
397 assert_eq
!(map
.len(), size
- i
- 1);
398 assert_eq
!(map
, map
.clone());
401 for i
in 0..size
/ 2 {
402 assert_eq
!(map
.remove(&(2 * i
)), None
);
403 assert_eq
!(map
.remove(&(2 * i
+ 1)), Some(i
* 200 + 100));
404 assert_eq
!(map
.len(), size
/ 2 - i
- 1);
405 assert_eq
!(map
, map
.clone());
412 use std
::collections
::btree_map
::{Iter, IntoIter, Range, Keys, Values}
;
414 fn map_key
<'new
>(v
: BTreeMap
<&'
static str, ()>) -> BTreeMap
<&'new
str, ()> {
417 fn map_val
<'new
>(v
: BTreeMap
<(), &'
static str>) -> BTreeMap
<(), &'new
str> {
420 fn iter_key
<'a
, 'new
>(v
: Iter
<'a
, &'
static str, ()>) -> Iter
<'a
, &'new
str, ()> {
423 fn iter_val
<'a
, 'new
>(v
: Iter
<'a
, (), &'
static str>) -> Iter
<'a
, (), &'new
str> {
426 fn into_iter_key
<'new
>(v
: IntoIter
<&'
static str, ()>) -> IntoIter
<&'new
str, ()> {
429 fn into_iter_val
<'new
>(v
: IntoIter
<(), &'
static str>) -> IntoIter
<(), &'new
str> {
432 fn range_key
<'a
, 'new
>(v
: Range
<'a
, &'
static str, ()>) -> Range
<'a
, &'new
str, ()> {
435 fn range_val
<'a
, 'new
>(v
: Range
<'a
, (), &'
static str>) -> Range
<'a
, (), &'new
str> {
438 fn keys
<'a
, 'new
>(v
: Keys
<'a
, &'
static str, ()>) -> Keys
<'a
, &'new
str, ()> {
441 fn vals
<'a
, 'new
>(v
: Values
<'a
, (), &'
static str>) -> Values
<'a
, (), &'new
str> {
447 fn test_occupied_entry_key() {
448 let mut a
= BTreeMap
::new();
449 let key
= "hello there";
450 let value
= "value goes here";
451 assert
!(a
.is_empty());
452 a
.insert(key
.clone(), value
.clone());
453 assert_eq
!(a
.len(), 1);
454 assert_eq
!(a
[key
], value
);
456 match a
.entry(key
.clone()) {
457 Vacant(_
) => panic
!(),
458 Occupied(e
) => assert_eq
!(key
, *e
.key()),
460 assert_eq
!(a
.len(), 1);
461 assert_eq
!(a
[key
], value
);
465 fn test_vacant_entry_key() {
466 let mut a
= BTreeMap
::new();
467 let key
= "hello there";
468 let value
= "value goes here";
470 assert
!(a
.is_empty());
471 match a
.entry(key
.clone()) {
472 Occupied(_
) => panic
!(),
474 assert_eq
!(key
, *e
.key());
475 e
.insert(value
.clone());
478 assert_eq
!(a
.len(), 1);
479 assert_eq
!(a
[key
], value
);
482 macro_rules
! create_append_test
{
483 ($name
:ident
, $len
:expr
) => {
486 let mut a
= BTreeMap
::new();
491 let mut b
= BTreeMap
::new();
498 assert_eq
!(a
.len(), $len
);
499 assert_eq
!(b
.len(), 0);
503 assert_eq
!(a
[&i
], i
);
505 assert_eq
!(a
[&i
], 2*i
);
509 assert_eq
!(a
.remove(&($len
-1)), Some(2*($len
-1)));
510 assert_eq
!(a
.insert($len
-1, 20), None
);
515 // These are mostly for testing the algorithm that "fixes" the right edge after insertion.
517 create_append_test
!(test_append_9
, 9);
518 // Two leafs that don't need fixing.
519 create_append_test
!(test_append_17
, 17);
520 // Two leafs where the second one ends up underfull and needs stealing at the end.
521 create_append_test
!(test_append_14
, 14);
522 // Two leafs where the second one ends up empty because the insertion finished at the root.
523 create_append_test
!(test_append_12
, 12);
524 // Three levels; insertion finished at the root.
525 create_append_test
!(test_append_144
, 144);
526 // Three levels; insertion finished at leaf while there is an empty node on the second level.
527 create_append_test
!(test_append_145
, 145);
528 // Tests for several randomly chosen sizes.
529 create_append_test
!(test_append_170
, 170);
530 create_append_test
!(test_append_181
, 181);
531 create_append_test
!(test_append_239
, 239);
532 create_append_test
!(test_append_1700
, 1700);
534 fn rand_data(len
: usize) -> Vec
<(u32, u32)> {
535 let mut rng
= DeterministicRng
::new();
536 Vec
::from_iter((0..len
).map(|_
| (rng
.next(), rng
.next())))
540 fn test_split_off_empty_right() {
541 let mut data
= rand_data(173);
543 let mut map
= BTreeMap
::from_iter(data
.clone());
544 let right
= map
.split_off(&(data
.iter().max().unwrap().0 + 1));
547 assert
!(map
.into_iter().eq(data
));
548 assert
!(right
.into_iter().eq(None
));
552 fn test_split_off_empty_left() {
553 let mut data
= rand_data(314);
555 let mut map
= BTreeMap
::from_iter(data
.clone());
556 let right
= map
.split_off(&data
.iter().min().unwrap().0);
559 assert
!(map
.into_iter().eq(None
));
560 assert
!(right
.into_iter().eq(data
));
564 fn test_split_off_large_random_sorted() {
565 let mut data
= rand_data(1529);
566 // special case with maximum height.
569 let mut map
= BTreeMap
::from_iter(data
.clone());
570 let key
= data
[data
.len() / 2].0;
571 let right
= map
.split_off(&key
);
573 assert
!(map
.into_iter().eq(data
.clone().into_iter().filter(|x
| x
.0 < key
)));
574 assert
!(right
.into_iter().eq(data
.into_iter().filter(|x
| x
.0 >= key
)));
578 use std
::collections
::BTreeMap
;
579 use std
::__rand
::{Rng, thread_rng}
;
581 use test
::{Bencher, black_box}
;
583 map_insert_rand_bench
!{insert_rand_100, 100, BTreeMap}
584 map_insert_rand_bench
!{insert_rand_10_000, 10_000, BTreeMap}
586 map_insert_seq_bench
!{insert_seq_100, 100, BTreeMap}
587 map_insert_seq_bench
!{insert_seq_10_000, 10_000, BTreeMap}
589 map_find_rand_bench
!{find_rand_100, 100, BTreeMap}
590 map_find_rand_bench
!{find_rand_10_000, 10_000, BTreeMap}
592 map_find_seq_bench
!{find_seq_100, 100, BTreeMap}
593 map_find_seq_bench
!{find_seq_10_000, 10_000, BTreeMap}
595 fn bench_iter(b
: &mut Bencher
, size
: i32) {
596 let mut map
= BTreeMap
::<i32, i32>::new();
597 let mut rng
= thread_rng();
600 map
.insert(rng
.gen(), rng
.gen());
611 pub fn iter_20(b
: &mut Bencher
) {
616 pub fn iter_1000(b
: &mut Bencher
) {
621 pub fn iter_100000(b
: &mut Bencher
) {
622 bench_iter(b
, 100000);