1 // Copyright 2013 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 //! An ordered map and set implemented as self-balancing binary search
12 //! trees. The only requirement for the types is that the key implements
17 use alloc::boxed::Box;
18 use core::default::Default;
21 use core::iter::Peekable;
23 use core::mem::{replace, swap};
25 use std::hash::{Writer, Hash};
27 use {Collection, Mutable, Set, MutableSet, MutableMap, Map};
30 // This is implemented as an AA tree, which is a simplified variation of
31 // a red-black tree where red (horizontal) nodes can only be added
32 // as a right child. The time complexity is the same, and re-balancing
33 // operations are more frequent but also cheaper.
35 // Future improvements:
37 // range search - O(log n) retrieval of an iterator from some key
39 // (possibly) implement the overloads Python does for sets:
42 // * symmetric difference: ^
44 // These would be convenient since the methods work like `each`
48 pub struct TreeMap<K, V> {
49 root: Option<Box<TreeNode<K, V>>>,
53 impl<K: PartialEq + Ord, V: PartialEq> PartialEq for TreeMap<K, V> {
54 fn eq(&self, other: &TreeMap<K, V>) -> bool {
55 self.len() == other.len() &&
56 self.iter().zip(other.iter()).all(|(a, b)| a == b)
60 impl<K: Ord, V: PartialOrd> PartialOrd for TreeMap<K, V> {
62 fn partial_cmp(&self, other: &TreeMap<K, V>) -> Option<Ordering> {
63 iter::order::partial_cmp(self.iter(), other.iter())
67 impl<K: Ord + Show, V: Show> Show for TreeMap<K, V> {
68 fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
69 try!(write!(f, "{{"));
71 for (i, (k, v)) in self.iter().enumerate() {
72 if i != 0 { try!(write!(f, ", ")); }
73 try!(write!(f, "{}: {}", *k, *v));
80 impl<K: Ord, V> Collection for TreeMap<K, V> {
81 fn len(&self) -> uint { self.length }
84 impl<K: Ord, V> Mutable for TreeMap<K, V> {
91 impl<K: Ord, V> Map<K, V> for TreeMap<K, V> {
92 // See comments on tree_find_with
94 fn find<'a>(&'a self, key: &K) -> Option<&'a V> {
95 tree_find_with(&self.root, |k2| key.cmp(k2))
99 impl<K: Ord, V> MutableMap<K, V> for TreeMap<K, V> {
100 // See comments on def_tree_find_mut_with
102 fn find_mut<'a>(&'a mut self, key: &K) -> Option<&'a mut V> {
103 tree_find_mut_with(&mut self.root, |x| key.cmp(x))
106 fn swap(&mut self, key: K, value: V) -> Option<V> {
107 let ret = insert(&mut self.root, key, value);
108 if ret.is_none() { self.length += 1 }
112 fn pop(&mut self, key: &K) -> Option<V> {
113 let ret = remove(&mut self.root, key);
114 if ret.is_some() { self.length -= 1 }
119 impl<K: Ord, V> Default for TreeMap<K,V> {
121 fn default() -> TreeMap<K, V> { TreeMap::new() }
124 impl<K: Ord, V> TreeMap<K, V> {
125 /// Create an empty TreeMap
126 pub fn new() -> TreeMap<K, V> { TreeMap{root: None, length: 0} }
128 /// Get a lazy iterator over the key-value pairs in the map.
129 /// Requires that it be frozen (immutable).
130 pub fn iter<'a>(&'a self) -> Entries<'a, K, V> {
133 node: deref(&self.root),
134 remaining_min: self.length,
135 remaining_max: self.length
139 /// Get a lazy reverse iterator over the key-value pairs in the map.
140 /// Requires that it be frozen (immutable).
141 pub fn rev_iter<'a>(&'a self) -> RevEntries<'a, K, V> {
142 RevEntries{iter: self.iter()}
145 /// Get a lazy forward iterator over the key-value pairs in the
146 /// map, with the values being mutable.
147 pub fn mut_iter<'a>(&'a mut self) -> MutEntries<'a, K, V> {
150 node: mut_deref(&mut self.root),
151 remaining_min: self.length,
152 remaining_max: self.length
155 /// Get a lazy reverse iterator over the key-value pairs in the
156 /// map, with the values being mutable.
157 pub fn mut_rev_iter<'a>(&'a mut self) -> RevMutEntries<'a, K, V> {
158 RevMutEntries{iter: self.mut_iter()}
162 /// Get a lazy iterator that consumes the treemap.
163 pub fn move_iter(self) -> MoveEntries<K, V> {
164 let TreeMap { root: root, length: length } = self;
165 let stk = match root {
167 Some(box tn) => vec!(tn)
176 impl<K, V> TreeMap<K, V> {
177 /// Return the value for which f(key) returns Equal. f is invoked
178 /// with current key and helps to navigate the tree
183 /// use std::ascii::StrAsciiExt;
185 /// let mut t = collections::treemap::TreeMap::new();
186 /// t.insert("Content-Type", "application/xml");
187 /// t.insert("User-Agent", "Curl-Rust/0.1");
189 /// let ua_key = "user-agent";
190 /// let ua = t.find_with(|&k| {
191 /// ua_key.cmp(&k.to_ascii_lower().as_slice())
194 /// assert_eq!(*ua.unwrap(), "Curl-Rust/0.1");
197 pub fn find_with<'a>(&'a self, f:|&K| -> Ordering) -> Option<&'a V> {
198 tree_find_with(&self.root, f)
201 /// Return the value for which f(key) returns Equal. f is invoked
202 /// with current key and helps to navigate the tree
207 /// let mut t = collections::treemap::TreeMap::new();
208 /// t.insert("Content-Type", "application/xml");
209 /// t.insert("User-Agent", "Curl-Rust/0.1");
211 /// let new_ua = "Safari/156.0";
212 /// match t.find_mut_with(|k| "User-Agent".cmp(k)) {
213 /// Some(x) => *x = new_ua,
217 /// assert_eq!(t.find(&"User-Agent"), Some(&new_ua));
220 pub fn find_mut_with<'a>(&'a mut self, f:|&K| -> Ordering) -> Option<&'a mut V> {
221 tree_find_mut_with(&mut self.root, f)
227 macro_rules! bound_setup {
228 // initialiser of the iterator to manipulate
229 ($iter:expr, $k:expr,
230 // whether we are looking for the lower or upper bound.
231 $is_lower_bound:expr) => {
233 let mut iter = $iter;
235 if !iter.node.is_null() {
236 let node_k = unsafe {&(*iter.node).key};
237 match $k.cmp(node_k) {
238 Less => iter.traverse_left(),
239 Greater => iter.traverse_right(),
242 iter.traverse_complete();
245 iter.traverse_right()
250 iter.traverse_complete();
259 impl<K: Ord, V> TreeMap<K, V> {
260 /// Get a lazy iterator that should be initialized using
261 /// `traverse_left`/`traverse_right`/`traverse_complete`.
262 fn iter_for_traversal<'a>(&'a self) -> Entries<'a, K, V> {
265 node: deref(&self.root),
267 remaining_max: self.length
271 /// Return a lazy iterator to the first key-value pair whose key is not less than `k`
272 /// If all keys in map are less than `k` an empty iterator is returned.
273 pub fn lower_bound<'a>(&'a self, k: &K) -> Entries<'a, K, V> {
274 bound_setup!(self.iter_for_traversal(), k, true)
277 /// Return a lazy iterator to the first key-value pair whose key is greater than `k`
278 /// If all keys in map are not greater than `k` an empty iterator is returned.
279 pub fn upper_bound<'a>(&'a self, k: &K) -> Entries<'a, K, V> {
280 bound_setup!(self.iter_for_traversal(), k, false)
283 /// Get a lazy iterator that should be initialized using
284 /// `traverse_left`/`traverse_right`/`traverse_complete`.
285 fn mut_iter_for_traversal<'a>(&'a mut self) -> MutEntries<'a, K, V> {
288 node: mut_deref(&mut self.root),
290 remaining_max: self.length
294 /// Return a lazy value iterator to the first key-value pair (with
295 /// the value being mutable) whose key is not less than `k`.
297 /// If all keys in map are less than `k` an empty iterator is
299 pub fn mut_lower_bound<'a>(&'a mut self, k: &K) -> MutEntries<'a, K, V> {
300 bound_setup!(self.mut_iter_for_traversal(), k, true)
303 /// Return a lazy iterator to the first key-value pair (with the
304 /// value being mutable) whose key is greater than `k`.
306 /// If all keys in map are not greater than `k` an empty iterator
308 pub fn mut_upper_bound<'a>(&'a mut self, k: &K) -> MutEntries<'a, K, V> {
309 bound_setup!(self.mut_iter_for_traversal(), k, false)
313 /// Lazy forward iterator over a map
314 pub struct Entries<'a, K, V> {
315 stack: Vec<&'a TreeNode<K, V>>,
316 // See the comment on MutEntries; this is just to allow
317 // code-sharing (for this immutable-values iterator it *could* very
318 // well be Option<&'a TreeNode<K,V>>).
319 node: *const TreeNode<K, V>,
324 /// Lazy backward iterator over a map
325 pub struct RevEntries<'a, K, V> {
326 iter: Entries<'a, K, V>,
329 /// Lazy forward iterator over a map that allows for the mutation of
331 pub struct MutEntries<'a, K, V> {
332 stack: Vec<&'a mut TreeNode<K, V>>,
333 // Unfortunately, we require some unsafe-ness to get around the
334 // fact that we would be storing a reference *into* one of the
335 // nodes in the stack.
337 // As far as the compiler knows, this would let us invalidate the
338 // reference by assigning a new value to this node's position in
339 // its parent, which would cause this current one to be
340 // deallocated so this reference would be invalid. (i.e. the
341 // compilers complaints are 100% correct.)
343 // However, as far as you humans reading this code know (or are
344 // about to know, if you haven't read far enough down yet), we are
345 // only reading from the TreeNode.{left,right} fields. the only
346 // thing that is ever mutated is the .value field (although any
347 // actual mutation that happens is done externally, by the
348 // iterator consumer). So, don't be so concerned, rustc, we've got
351 // (This field can legitimately be null.)
352 node: *mut TreeNode<K, V>,
357 /// Lazy backward iterator over a map
358 pub struct RevMutEntries<'a, K, V> {
359 iter: MutEntries<'a, K, V>,
363 // FIXME #5846 we want to be able to choose between &x and &mut x
364 // (with many different `x`) below, so we need to optionally pass mut
365 // as a tt, but the only thing we can do with a `tt` is pass them to
366 // other macros, so this takes the `& <mutability> <operand>` token
367 // sequence and forces their evaluation as an expression.
368 macro_rules! addr { ($e:expr) => { $e }}
369 // putting an optional mut into type signatures
370 macro_rules! item { ($i:item) => { $i }}
372 macro_rules! define_iterator {
376 // the function to go from &m Option<Box<TreeNode>> to *m TreeNode
377 deref = $deref:ident,
379 // see comment on `addr!`, this is just an optional `mut`, but
380 // there's no support for 0-or-1 repeats.
381 addr_mut = $($addr_mut:tt)*
383 // private methods on the forward iterator (item!() for the
384 // addr_mut in the next_ return value)
385 item!(impl<'a, K, V> $name<'a, K, V> {
387 fn next_(&mut self, forward: bool) -> Option<(&'a K, &'a $($addr_mut)* V)> {
388 while !self.stack.is_empty() || !self.node.is_null() {
389 if !self.node.is_null() {
390 let node = unsafe {addr!(& $($addr_mut)* *self.node)};
392 let next_node = if forward {
393 addr!(& $($addr_mut)* node.left)
395 addr!(& $($addr_mut)* node.right)
397 self.node = $deref(next_node);
399 self.stack.push(node);
401 let node = self.stack.pop().unwrap();
402 let next_node = if forward {
403 addr!(& $($addr_mut)* node.right)
405 addr!(& $($addr_mut)* node.left)
407 self.node = $deref(next_node);
408 self.remaining_max -= 1;
409 if self.remaining_min > 0 {
410 self.remaining_min -= 1;
412 return Some((&node.key, addr!(& $($addr_mut)* node.value)));
418 /// traverse_left, traverse_right and traverse_complete are
419 /// used to initialize Entries/MutEntries
420 /// pointing to element inside tree structure.
422 /// They should be used in following manner:
423 /// - create iterator using TreeMap::[mut_]iter_for_traversal
424 /// - find required node using `traverse_left`/`traverse_right`
425 /// (current node is `Entries::node` field)
426 /// - complete initialization with `traverse_complete`
428 /// After this, iteration will start from `self.node`. If
429 /// `self.node` is None iteration will start from last
430 /// node from which we traversed left.
432 fn traverse_left(&mut self) {
433 let node = unsafe {addr!(& $($addr_mut)* *self.node)};
434 self.node = $deref(addr!(& $($addr_mut)* node.left));
435 self.stack.push(node);
439 fn traverse_right(&mut self) {
440 let node = unsafe {addr!(& $($addr_mut)* *self.node)};
441 self.node = $deref(addr!(& $($addr_mut)* node.right));
445 fn traverse_complete(&mut self) {
446 if !self.node.is_null() {
448 self.stack.push(addr!(& $($addr_mut)* *self.node));
450 self.node = ptr::RawPtr::null();
455 // the forward Iterator impl.
456 item!(impl<'a, K, V> Iterator<(&'a K, &'a $($addr_mut)* V)> for $name<'a, K, V> {
457 /// Advance the iterator to the next node (in order) and return a
458 /// tuple with a reference to the key and value. If there are no
459 /// more nodes, return `None`.
460 fn next(&mut self) -> Option<(&'a K, &'a $($addr_mut)* V)> {
465 fn size_hint(&self) -> (uint, Option<uint>) {
466 (self.remaining_min, Some(self.remaining_max))
470 // the reverse Iterator impl.
471 item!(impl<'a, K, V> Iterator<(&'a K, &'a $($addr_mut)* V)> for $rev_name<'a, K, V> {
472 fn next(&mut self) -> Option<(&'a K, &'a $($addr_mut)* V)> {
473 self.iter.next_(false)
477 fn size_hint(&self) -> (uint, Option<uint>) {
478 self.iter.size_hint()
482 } // end of define_iterator
489 // immutable, so no mut
500 fn deref<'a, K, V>(node: &'a Option<Box<TreeNode<K, V>>>) -> *const TreeNode<K, V> {
503 let n: &TreeNode<K, V> = *n;
504 n as *const TreeNode<K, V>
510 fn mut_deref<K, V>(x: &mut Option<Box<TreeNode<K, V>>>)
511 -> *mut TreeNode<K, V> {
514 let n: &mut TreeNode<K, V> = &mut **n;
515 n as *mut TreeNode<K, V>
517 None => ptr::mut_null()
523 /// Lazy forward iterator over a map that consumes the map while iterating
524 pub struct MoveEntries<K, V> {
525 stack: Vec<TreeNode<K, V>>,
529 impl<K, V> Iterator<(K, V)> for MoveEntries<K,V> {
531 fn next(&mut self) -> Option<(K, V)> {
532 while !self.stack.is_empty() {
539 } = self.stack.pop().unwrap();
551 self.stack.push(left);
555 Some(box right) => self.stack.push(right),
559 return Some((key, value))
567 fn size_hint(&self) -> (uint, Option<uint>) {
568 (self.remaining, Some(self.remaining))
573 impl<'a, T> Iterator<&'a T> for SetItems<'a, T> {
575 fn next(&mut self) -> Option<&'a T> {
576 self.iter.next().map(|(value, _)| value)
580 impl<'a, T> Iterator<&'a T> for RevSetItems<'a, T> {
582 fn next(&mut self) -> Option<&'a T> {
583 self.iter.next().map(|(value, _)| value)
587 /// A implementation of the `Set` trait on top of the `TreeMap` container. The
588 /// only requirement is that the type of the elements contained ascribes to the
591 pub struct TreeSet<T> {
595 impl<T: PartialEq + Ord> PartialEq for TreeSet<T> {
597 fn eq(&self, other: &TreeSet<T>) -> bool { self.map == other.map }
600 impl<T: Ord> PartialOrd for TreeSet<T> {
602 fn partial_cmp(&self, other: &TreeSet<T>) -> Option<Ordering> {
603 self.map.partial_cmp(&other.map)
607 impl<T: Ord + Show> Show for TreeSet<T> {
608 fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
609 try!(write!(f, "{{"));
611 for (i, x) in self.iter().enumerate() {
612 if i != 0 { try!(write!(f, ", ")); }
613 try!(write!(f, "{}", *x));
620 impl<T: Ord> Collection for TreeSet<T> {
622 fn len(&self) -> uint { self.map.len() }
625 impl<T: Ord> Mutable for TreeSet<T> {
627 fn clear(&mut self) { self.map.clear() }
630 impl<T: Ord> Set<T> for TreeSet<T> {
632 fn contains(&self, value: &T) -> bool {
633 self.map.contains_key(value)
636 fn is_disjoint(&self, other: &TreeSet<T>) -> bool {
637 self.intersection(other).next().is_none()
640 fn is_subset(&self, other: &TreeSet<T>) -> bool {
641 let mut x = self.iter();
642 let mut y = other.iter();
643 let mut a = x.next();
644 let mut b = y.next();
655 Greater => return false,
656 Equal => a = x.next(),
665 impl<T: Ord> MutableSet<T> for TreeSet<T> {
667 fn insert(&mut self, value: T) -> bool { self.map.insert(value, ()) }
670 fn remove(&mut self, value: &T) -> bool { self.map.remove(value) }
673 impl<T: Ord> Default for TreeSet<T> {
675 fn default() -> TreeSet<T> { TreeSet::new() }
678 impl<T: Ord> TreeSet<T> {
679 /// Create an empty TreeSet
681 pub fn new() -> TreeSet<T> { TreeSet{map: TreeMap::new()} }
683 /// Get a lazy iterator over the values in the set.
684 /// Requires that it be frozen (immutable).
686 pub fn iter<'a>(&'a self) -> SetItems<'a, T> {
687 SetItems{iter: self.map.iter()}
690 /// Get a lazy iterator over the values in the set.
691 /// Requires that it be frozen (immutable).
693 pub fn rev_iter<'a>(&'a self) -> RevSetItems<'a, T> {
694 RevSetItems{iter: self.map.rev_iter()}
697 /// Get a lazy iterator that consumes the set.
699 pub fn move_iter(self) -> MoveSetItems<T> {
700 self.map.move_iter().map(|(value, _)| value)
703 /// Get a lazy iterator pointing to the first value not less than `v` (greater or equal).
704 /// If all elements in the set are less than `v` empty iterator is returned.
706 pub fn lower_bound<'a>(&'a self, v: &T) -> SetItems<'a, T> {
707 SetItems{iter: self.map.lower_bound(v)}
710 /// Get a lazy iterator pointing to the first value greater than `v`.
711 /// If all elements in the set are not greater than `v` empty iterator is returned.
713 pub fn upper_bound<'a>(&'a self, v: &T) -> SetItems<'a, T> {
714 SetItems{iter: self.map.upper_bound(v)}
717 /// Visit the values (in-order) representing the difference
718 pub fn difference<'a>(&'a self, other: &'a TreeSet<T>) -> DifferenceItems<'a, T> {
719 DifferenceItems{a: self.iter().peekable(), b: other.iter().peekable()}
722 /// Visit the values (in-order) representing the symmetric difference
723 pub fn symmetric_difference<'a>(&'a self, other: &'a TreeSet<T>)
724 -> SymDifferenceItems<'a, T> {
725 SymDifferenceItems{a: self.iter().peekable(), b: other.iter().peekable()}
728 /// Visit the values (in-order) representing the intersection
729 pub fn intersection<'a>(&'a self, other: &'a TreeSet<T>)
730 -> IntersectionItems<'a, T> {
731 IntersectionItems{a: self.iter().peekable(), b: other.iter().peekable()}
734 /// Visit the values (in-order) representing the union
735 pub fn union<'a>(&'a self, other: &'a TreeSet<T>) -> UnionItems<'a, T> {
736 UnionItems{a: self.iter().peekable(), b: other.iter().peekable()}
740 /// Lazy forward iterator over a set
741 pub struct SetItems<'a, T> {
742 iter: Entries<'a, T, ()>
745 /// Lazy backward iterator over a set
746 pub struct RevSetItems<'a, T> {
747 iter: RevEntries<'a, T, ()>
750 /// Lazy forward iterator over a set that consumes the set while iterating
751 pub type MoveSetItems<T> = iter::Map<'static, (T, ()), T, MoveEntries<T, ()>>;
753 /// Lazy iterator producing elements in the set difference (in-order)
754 pub struct DifferenceItems<'a, T> {
755 a: Peekable<&'a T, SetItems<'a, T>>,
756 b: Peekable<&'a T, SetItems<'a, T>>,
759 /// Lazy iterator producing elements in the set symmetric difference (in-order)
760 pub struct SymDifferenceItems<'a, T> {
761 a: Peekable<&'a T, SetItems<'a, T>>,
762 b: Peekable<&'a T, SetItems<'a, T>>,
765 /// Lazy iterator producing elements in the set intersection (in-order)
766 pub struct IntersectionItems<'a, T> {
767 a: Peekable<&'a T, SetItems<'a, T>>,
768 b: Peekable<&'a T, SetItems<'a, T>>,
771 /// Lazy iterator producing elements in the set union (in-order)
772 pub struct UnionItems<'a, T> {
773 a: Peekable<&'a T, SetItems<'a, T>>,
774 b: Peekable<&'a T, SetItems<'a, T>>,
777 /// Compare `x` and `y`, but return `short` if x is None and `long` if y is None
778 fn cmp_opt<T: Ord>(x: Option<&T>, y: Option<&T>,
779 short: Ordering, long: Ordering) -> Ordering {
781 (None , _ ) => short,
783 (Some(x1), Some(y1)) => x1.cmp(y1),
787 impl<'a, T: Ord> Iterator<&'a T> for DifferenceItems<'a, T> {
788 fn next(&mut self) -> Option<&'a T> {
790 match cmp_opt(self.a.peek(), self.b.peek(), Less, Less) {
791 Less => return self.a.next(),
792 Equal => { self.a.next(); self.b.next(); }
793 Greater => { self.b.next(); }
799 impl<'a, T: Ord> Iterator<&'a T> for SymDifferenceItems<'a, T> {
800 fn next(&mut self) -> Option<&'a T> {
802 match cmp_opt(self.a.peek(), self.b.peek(), Greater, Less) {
803 Less => return self.a.next(),
804 Equal => { self.a.next(); self.b.next(); }
805 Greater => return self.b.next(),
811 impl<'a, T: Ord> Iterator<&'a T> for IntersectionItems<'a, T> {
812 fn next(&mut self) -> Option<&'a T> {
814 let o_cmp = match (self.a.peek(), self.b.peek()) {
817 (Some(a1), Some(b1)) => Some(a1.cmp(b1)),
821 Some(Less) => { self.a.next(); }
822 Some(Equal) => { self.b.next(); return self.a.next() }
823 Some(Greater) => { self.b.next(); }
829 impl<'a, T: Ord> Iterator<&'a T> for UnionItems<'a, T> {
830 fn next(&mut self) -> Option<&'a T> {
832 match cmp_opt(self.a.peek(), self.b.peek(), Greater, Less) {
833 Less => return self.a.next(),
834 Equal => { self.b.next(); return self.a.next() }
835 Greater => return self.b.next(),
842 // Nodes keep track of their level in the tree, starting at 1 in the
843 // leaves and with a red child sharing the level of the parent.
845 struct TreeNode<K, V> {
848 left: Option<Box<TreeNode<K, V>>>,
849 right: Option<Box<TreeNode<K, V>>>,
853 impl<K: Ord, V> TreeNode<K, V> {
854 /// Creates a new tree node.
856 pub fn new(key: K, value: V) -> TreeNode<K, V> {
857 TreeNode{key: key, value: value, left: None, right: None, level: 1}
861 // Remove left horizontal link by rotating right
862 fn skew<K: Ord, V>(node: &mut Box<TreeNode<K, V>>) {
863 if node.left.as_ref().map_or(false, |x| x.level == node.level) {
864 let mut save = node.left.take_unwrap();
865 swap(&mut node.left, &mut save.right); // save.right now None
866 swap(node, &mut save);
867 node.right = Some(save);
871 // Remove dual horizontal link by rotating left and increasing level of
873 fn split<K: Ord, V>(node: &mut Box<TreeNode<K, V>>) {
874 if node.right.as_ref().map_or(false,
875 |x| x.right.as_ref().map_or(false, |y| y.level == node.level)) {
876 let mut save = node.right.take_unwrap();
877 swap(&mut node.right, &mut save.left); // save.left now None
879 swap(node, &mut save);
880 node.left = Some(save);
884 // Next 2 functions have the same conventions
886 // The only difference is that non-mutable version uses loop instead
887 // of recursion (performance considerations)
888 // It seems to be impossible to avoid recursion with mutability
890 // So convention is that comparator is gets at input current key
891 // and returns search_key cmp cur_key (i.e. search_key.cmp(cur_key))
892 fn tree_find_with<'r, K, V>(node: &'r Option<Box<TreeNode<K, V>>>,
893 f: |&K| -> Ordering) -> Option<&'r V> {
894 let mut current: &'r Option<Box<TreeNode<K, V>>> = node;
899 Less => current = &r.left,
900 Greater => current = &r.right,
901 Equal => return Some(&r.value)
909 // See comments above tree_find_with
910 fn tree_find_mut_with<'r, K, V>(node: &'r mut Option<Box<TreeNode<K, V>>>,
911 f: |&K| -> Ordering) -> Option<&'r mut V> {
913 let mut current = node;
915 let temp = current; // hack to appease borrowck
919 Less => current = &mut r.left,
920 Greater => current = &mut r.right,
921 Equal => return Some(&mut r.value)
929 fn insert<K: Ord, V>(node: &mut Option<Box<TreeNode<K, V>>>,
930 key: K, value: V) -> Option<V> {
932 Some(ref mut save) => {
933 match key.cmp(&save.key) {
935 let inserted = insert(&mut save.left, key, value);
941 let inserted = insert(&mut save.right, key, value);
948 Some(replace(&mut save.value, value))
953 *node = Some(box TreeNode::new(key, value));
959 fn remove<K: Ord, V>(node: &mut Option<Box<TreeNode<K, V>>>,
960 key: &K) -> Option<V> {
961 fn heir_swap<K: Ord, V>(node: &mut Box<TreeNode<K, V>>,
962 child: &mut Option<Box<TreeNode<K, V>>>) {
963 // *could* be done without recursion, but it won't borrow check
964 for x in child.mut_iter() {
965 if x.right.is_some() {
966 heir_swap(node, &mut x.right);
968 swap(&mut node.key, &mut x.key);
969 swap(&mut node.value, &mut x.value);
976 return None; // bottom of tree
978 Some(ref mut save) => {
979 let (ret, rebalance) = match key.cmp(&save.key) {
980 Less => (remove(&mut save.left, key), true),
981 Greater => (remove(&mut save.right, key), true),
983 if save.left.is_some() {
984 if save.right.is_some() {
985 let mut left = save.left.take_unwrap();
986 if left.right.is_some() {
987 heir_swap(save, &mut left.right);
989 swap(&mut save.key, &mut left.key);
990 swap(&mut save.value, &mut left.value);
992 save.left = Some(left);
993 (remove(&mut save.left, key), true)
995 let new = save.left.take_unwrap();
996 let box TreeNode{value, ..} = replace(save, new);
997 *save = save.left.take_unwrap();
1000 } else if save.right.is_some() {
1001 let new = save.right.take_unwrap();
1002 let box TreeNode{value, ..} = replace(save, new);
1011 let left_level = save.left.as_ref().map_or(0, |x| x.level);
1012 let right_level = save.right.as_ref().map_or(0, |x| x.level);
1014 // re-balance, if necessary
1015 if left_level < save.level - 1 || right_level < save.level - 1 {
1018 if right_level > save.level {
1019 for x in save.right.mut_iter() { x.level = save.level }
1024 for right in save.right.mut_iter() {
1026 for x in right.right.mut_iter() { skew(x) }
1030 for x in save.right.mut_iter() { split(x) }
1037 return match node.take() {
1038 Some(box TreeNode{value, ..}) => Some(value), None => fail!()
1042 impl<K: Ord, V> FromIterator<(K, V)> for TreeMap<K, V> {
1043 fn from_iter<T: Iterator<(K, V)>>(iter: T) -> TreeMap<K, V> {
1044 let mut map = TreeMap::new();
1050 impl<K: Ord, V> Extendable<(K, V)> for TreeMap<K, V> {
1052 fn extend<T: Iterator<(K, V)>>(&mut self, mut iter: T) {
1053 for (k, v) in iter {
1059 impl<S: Writer, K: Ord + Hash<S>, V: Hash<S>> Hash<S> for TreeMap<K, V> {
1060 fn hash(&self, state: &mut S) {
1061 for elt in self.iter() {
1067 impl<T: Ord> FromIterator<T> for TreeSet<T> {
1068 fn from_iter<Iter: Iterator<T>>(iter: Iter) -> TreeSet<T> {
1069 let mut set = TreeSet::new();
1075 impl<T: Ord> Extendable<T> for TreeSet<T> {
1077 fn extend<Iter: Iterator<T>>(&mut self, mut iter: Iter) {
1084 impl<S: Writer, T: Ord + Hash<S>> Hash<S> for TreeSet<T> {
1085 fn hash(&self, state: &mut S) {
1086 for elt in self.iter() {
1094 use std::prelude::*;
1098 use {Map, MutableMap, Mutable};
1099 use super::{TreeMap, TreeNode};
1103 let m: TreeMap<int,int> = TreeMap::new();
1104 assert!(m.find(&5) == None);
1108 fn find_not_found() {
1109 let mut m = TreeMap::new();
1110 assert!(m.insert(1i, 2i));
1111 assert!(m.insert(5i, 3i));
1112 assert!(m.insert(9i, 3i));
1113 assert_eq!(m.find(&2), None);
1117 fn find_with_empty() {
1118 let m: TreeMap<&'static str,int> = TreeMap::new();
1119 assert!(m.find_with(|k| "test".cmp(k)) == None);
1123 fn find_with_not_found() {
1124 let mut m = TreeMap::new();
1125 assert!(m.insert("test1", 2i));
1126 assert!(m.insert("test2", 3i));
1127 assert!(m.insert("test3", 3i));
1128 assert_eq!(m.find_with(|k| "test4".cmp(k)), None);
1132 fn find_with_found() {
1133 let mut m = TreeMap::new();
1134 assert!(m.insert("test1", 2i));
1135 assert!(m.insert("test2", 3i));
1136 assert!(m.insert("test3", 4i));
1137 assert_eq!(m.find_with(|k| "test2".cmp(k)), Some(&3i));
1141 fn test_find_mut() {
1142 let mut m = TreeMap::new();
1143 assert!(m.insert(1i, 12i));
1144 assert!(m.insert(2, 8));
1145 assert!(m.insert(5, 14));
1147 match m.find_mut(&5) {
1148 None => fail!(), Some(x) => *x = new
1150 assert_eq!(m.find(&5), Some(&new));
1154 fn test_find_with_mut() {
1155 let mut m = TreeMap::new();
1156 assert!(m.insert("t1", 12i));
1157 assert!(m.insert("t2", 8));
1158 assert!(m.insert("t5", 14));
1160 match m.find_mut_with(|k| "t5".cmp(k)) {
1161 None => fail!(), Some(x) => *x = new
1163 assert_eq!(m.find_with(|k| "t5".cmp(k)), Some(&new));
1167 fn insert_replace() {
1168 let mut m = TreeMap::new();
1169 assert!(m.insert(5i, 2i));
1170 assert!(m.insert(2, 9));
1171 assert!(!m.insert(2, 11));
1172 assert_eq!(m.find(&2).unwrap(), &11);
1177 let mut m = TreeMap::new();
1179 assert!(m.insert(5i, 11i));
1180 assert!(m.insert(12, -3));
1181 assert!(m.insert(19, 2));
1183 assert!(m.find(&5).is_none());
1184 assert!(m.find(&12).is_none());
1185 assert!(m.find(&19).is_none());
1186 assert!(m.is_empty());
1191 let mut m = TreeMap::new();
1193 let k1 = "foo".as_bytes();
1194 let k2 = "bar".as_bytes();
1195 let v1 = "baz".as_bytes();
1196 let v2 = "foobar".as_bytes();
1198 m.insert(k1.clone(), v1.clone());
1199 m.insert(k2.clone(), v2.clone());
1201 assert_eq!(m.find(&k2), Some(&v2));
1202 assert_eq!(m.find(&k1), Some(&v1));
1205 fn check_equal<K: PartialEq + Ord, V: PartialEq>(ctrl: &[(K, V)],
1206 map: &TreeMap<K, V>) {
1207 assert_eq!(ctrl.is_empty(), map.is_empty());
1208 for x in ctrl.iter() {
1209 let &(ref k, ref v) = x;
1210 assert!(map.find(k).unwrap() == v)
1212 for (map_k, map_v) in map.iter() {
1213 let mut found = false;
1214 for x in ctrl.iter() {
1215 let &(ref ctrl_k, ref ctrl_v) = x;
1216 if *map_k == *ctrl_k {
1217 assert!(*map_v == *ctrl_v);
1226 fn check_left<K: Ord, V>(node: &Option<Box<TreeNode<K, V>>>,
1227 parent: &Box<TreeNode<K, V>>) {
1230 assert_eq!(r.key.cmp(&parent.key), Less);
1231 assert!(r.level == parent.level - 1); // left is black
1232 check_left(&r.left, r);
1233 check_right(&r.right, r, false);
1235 None => assert!(parent.level == 1) // parent is leaf
1239 fn check_right<K: Ord, V>(node: &Option<Box<TreeNode<K, V>>>,
1240 parent: &Box<TreeNode<K, V>>,
1244 assert_eq!(r.key.cmp(&parent.key), Greater);
1245 let red = r.level == parent.level;
1246 if parent_red { assert!(!red) } // no dual horizontal links
1247 // Right red or black
1248 assert!(red || r.level == parent.level - 1);
1249 check_left(&r.left, r);
1250 check_right(&r.right, r, red);
1252 None => assert!(parent.level == 1) // parent is leaf
1256 fn check_structure<K: Ord, V>(map: &TreeMap<K, V>) {
1259 check_left(&r.left, r);
1260 check_right(&r.right, r, false);
1267 fn test_rand_int() {
1268 let mut map: TreeMap<int,int> = TreeMap::new();
1269 let mut ctrl = vec![];
1271 check_equal(ctrl.as_slice(), &map);
1272 assert!(map.find(&5).is_none());
1274 let mut rng: rand::IsaacRng = rand::SeedableRng::from_seed(&[42]);
1276 for _ in range(0u, 3) {
1277 for _ in range(0u, 90) {
1280 if !ctrl.iter().any(|x| x == &(k, v)) {
1281 assert!(map.insert(k, v));
1283 check_structure(&map);
1284 check_equal(ctrl.as_slice(), &map);
1288 for _ in range(0u, 30) {
1289 let r = rng.gen_range(0, ctrl.len());
1290 let (key, _) = ctrl.remove(r).unwrap();
1291 assert!(map.remove(&key));
1292 check_structure(&map);
1293 check_equal(ctrl.as_slice(), &map);
1300 let mut m = TreeMap::new();
1301 assert!(m.insert(3i, 6i));
1302 assert_eq!(m.len(), 1);
1303 assert!(m.insert(0, 0));
1304 assert_eq!(m.len(), 2);
1305 assert!(m.insert(4, 8));
1306 assert_eq!(m.len(), 3);
1307 assert!(m.remove(&3));
1308 assert_eq!(m.len(), 2);
1309 assert!(!m.remove(&5));
1310 assert_eq!(m.len(), 2);
1311 assert!(m.insert(2, 4));
1312 assert_eq!(m.len(), 3);
1313 assert!(m.insert(1, 2));
1314 assert_eq!(m.len(), 4);
1318 fn test_iterator() {
1319 let mut m = TreeMap::new();
1321 assert!(m.insert(3i, 6i));
1322 assert!(m.insert(0, 0));
1323 assert!(m.insert(4, 8));
1324 assert!(m.insert(2, 4));
1325 assert!(m.insert(1, 2));
1328 for (k, v) in m.iter() {
1330 assert_eq!(*v, n * 2);
1337 fn test_interval_iteration() {
1338 let mut m = TreeMap::new();
1339 for i in range(1i, 100i) {
1340 assert!(m.insert(i * 2, i * 4));
1343 for i in range(1i, 198i) {
1344 let mut lb_it = m.lower_bound(&i);
1345 let (&k, &v) = lb_it.next().unwrap();
1348 assert_eq!(lb * 2, v);
1350 let mut ub_it = m.upper_bound(&i);
1351 let (&k, &v) = ub_it.next().unwrap();
1352 let ub = i + 2 - i % 2;
1354 assert_eq!(ub * 2, v);
1356 let mut end_it = m.lower_bound(&199);
1357 assert_eq!(end_it.next(), None);
1361 fn test_rev_iter() {
1362 let mut m = TreeMap::new();
1364 assert!(m.insert(3i, 6i));
1365 assert!(m.insert(0, 0));
1366 assert!(m.insert(4, 8));
1367 assert!(m.insert(2, 4));
1368 assert!(m.insert(1, 2));
1371 for (k, v) in m.rev_iter() {
1373 assert_eq!(*v, n * 2);
1379 fn test_mut_iter() {
1380 let mut m = TreeMap::new();
1381 for i in range(0u, 10) {
1382 assert!(m.insert(i, 100 * i));
1385 for (i, (&k, v)) in m.mut_iter().enumerate() {
1386 *v += k * 10 + i; // 000 + 00 + 0, 100 + 10 + 1, ...
1389 for (&k, &v) in m.iter() {
1390 assert_eq!(v, 111 * k);
1394 fn test_mut_rev_iter() {
1395 let mut m = TreeMap::new();
1396 for i in range(0u, 10) {
1397 assert!(m.insert(i, 100 * i));
1400 for (i, (&k, v)) in m.mut_rev_iter().enumerate() {
1401 *v += k * 10 + (9 - i); // 900 + 90 + (9 - 0), 800 + 80 + (9 - 1), ...
1404 for (&k, &v) in m.iter() {
1405 assert_eq!(v, 111 * k);
1410 fn test_mut_interval_iter() {
1411 let mut m_lower = TreeMap::new();
1412 let mut m_upper = TreeMap::new();
1413 for i in range(1i, 100i) {
1414 assert!(m_lower.insert(i * 2, i * 4));
1415 assert!(m_upper.insert(i * 2, i * 4));
1418 for i in range(1i, 199) {
1419 let mut lb_it = m_lower.mut_lower_bound(&i);
1420 let (&k, v) = lb_it.next().unwrap();
1425 for i in range(0i, 198) {
1426 let mut ub_it = m_upper.mut_upper_bound(&i);
1427 let (&k, v) = ub_it.next().unwrap();
1428 let ub = i + 2 - i % 2;
1433 assert!(m_lower.mut_lower_bound(&199).next().is_none());
1435 assert!(m_upper.mut_upper_bound(&198).next().is_none());
1437 assert!(m_lower.iter().all(|(_, &x)| x == 0));
1438 assert!(m_upper.iter().all(|(_, &x)| x == 0));
1443 let mut a = TreeMap::new();
1444 let mut b = TreeMap::new();
1447 assert!(a.insert(0i, 5i));
1449 assert!(b.insert(0, 4));
1451 assert!(a.insert(5, 19));
1453 assert!(!b.insert(0, 5));
1455 assert!(b.insert(5, 19));
1461 let mut a = TreeMap::new();
1462 let mut b = TreeMap::new();
1464 assert!(!(a < b) && !(b < a));
1465 assert!(b.insert(0i, 5i));
1467 assert!(a.insert(0, 7));
1468 assert!(!(a < b) && b < a);
1469 assert!(b.insert(-2, 0));
1471 assert!(a.insert(-5, 2));
1473 assert!(a.insert(6, 2));
1474 assert!(a < b && !(b < a));
1479 let mut a = TreeMap::new();
1480 let mut b = TreeMap::new();
1482 assert!(a <= b && a >= b);
1483 assert!(a.insert(1i, 1i));
1484 assert!(a > b && a >= b);
1485 assert!(b < a && b <= a);
1486 assert!(b.insert(2, 2));
1487 assert!(b > a && b >= a);
1488 assert!(a < b && a <= b);
1493 let mut map: TreeMap<int, int> = TreeMap::new();
1494 let empty: TreeMap<int, int> = TreeMap::new();
1499 let map_str = format!("{}", map);
1501 assert!(map_str == "{1: 2, 3: 4}".to_string());
1502 assert_eq!(format!("{}", empty), "{}".to_string());
1506 fn test_lazy_iterator() {
1507 let mut m = TreeMap::new();
1508 let (x1, y1) = (2i, 5i);
1509 let (x2, y2) = (9, 12);
1510 let (x3, y3) = (20, -3);
1511 let (x4, y4) = (29, 5);
1512 let (x5, y5) = (103, 3);
1514 assert!(m.insert(x1, y1));
1515 assert!(m.insert(x2, y2));
1516 assert!(m.insert(x3, y3));
1517 assert!(m.insert(x4, y4));
1518 assert!(m.insert(x5, y5));
1521 let mut a = m.iter();
1523 assert_eq!(a.next().unwrap(), (&x1, &y1));
1524 assert_eq!(a.next().unwrap(), (&x2, &y2));
1525 assert_eq!(a.next().unwrap(), (&x3, &y3));
1526 assert_eq!(a.next().unwrap(), (&x4, &y4));
1527 assert_eq!(a.next().unwrap(), (&x5, &y5));
1529 assert!(a.next().is_none());
1531 let mut b = m.iter();
1533 let expected = [(&x1, &y1), (&x2, &y2), (&x3, &y3), (&x4, &y4),
1538 assert_eq!(expected[i], x);
1547 assert_eq!(expected[i], x);
1553 fn test_from_iter() {
1554 let xs = [(1i, 1i), (2, 2), (3, 3), (4, 4), (5, 5), (6, 6)];
1556 let map: TreeMap<int, int> = xs.iter().map(|&x| x).collect();
1558 for &(k, v) in xs.iter() {
1559 assert_eq!(map.find(&k), Some(&v));
1570 use deque::bench::{insert_rand_n, insert_seq_n, find_rand_n, find_seq_n};
1574 pub fn insert_rand_100(b: &mut Bencher) {
1575 let mut m : TreeMap<uint,uint> = TreeMap::new();
1576 insert_rand_n(100, &mut m, b);
1580 pub fn insert_rand_10_000(b: &mut Bencher) {
1581 let mut m : TreeMap<uint,uint> = TreeMap::new();
1582 insert_rand_n(10_000, &mut m, b);
1587 pub fn insert_seq_100(b: &mut Bencher) {
1588 let mut m : TreeMap<uint,uint> = TreeMap::new();
1589 insert_seq_n(100, &mut m, b);
1593 pub fn insert_seq_10_000(b: &mut Bencher) {
1594 let mut m : TreeMap<uint,uint> = TreeMap::new();
1595 insert_seq_n(10_000, &mut m, b);
1600 pub fn find_rand_100(b: &mut Bencher) {
1601 let mut m : TreeMap<uint,uint> = TreeMap::new();
1602 find_rand_n(100, &mut m, b);
1606 pub fn find_rand_10_000(b: &mut Bencher) {
1607 let mut m : TreeMap<uint,uint> = TreeMap::new();
1608 find_rand_n(10_000, &mut m, b);
1613 pub fn find_seq_100(b: &mut Bencher) {
1614 let mut m : TreeMap<uint,uint> = TreeMap::new();
1615 find_seq_n(100, &mut m, b);
1619 pub fn find_seq_10_000(b: &mut Bencher) {
1620 let mut m : TreeMap<uint,uint> = TreeMap::new();
1621 find_seq_n(10_000, &mut m, b);
1627 use std::prelude::*;
1630 use {Set, MutableSet, Mutable, MutableMap};
1631 use super::{TreeMap, TreeSet};
1635 let mut s = TreeSet::new();
1637 assert!(s.insert(5i));
1638 assert!(s.insert(12));
1639 assert!(s.insert(19));
1641 assert!(!s.contains(&5));
1642 assert!(!s.contains(&12));
1643 assert!(!s.contains(&19));
1644 assert!(s.is_empty());
1648 fn test_disjoint() {
1649 let mut xs = TreeSet::new();
1650 let mut ys = TreeSet::new();
1651 assert!(xs.is_disjoint(&ys));
1652 assert!(ys.is_disjoint(&xs));
1653 assert!(xs.insert(5i));
1654 assert!(ys.insert(11i));
1655 assert!(xs.is_disjoint(&ys));
1656 assert!(ys.is_disjoint(&xs));
1657 assert!(xs.insert(7));
1658 assert!(xs.insert(19));
1659 assert!(xs.insert(4));
1660 assert!(ys.insert(2));
1661 assert!(ys.insert(-11));
1662 assert!(xs.is_disjoint(&ys));
1663 assert!(ys.is_disjoint(&xs));
1664 assert!(ys.insert(7));
1665 assert!(!xs.is_disjoint(&ys));
1666 assert!(!ys.is_disjoint(&xs));
1670 fn test_subset_and_superset() {
1671 let mut a = TreeSet::new();
1672 assert!(a.insert(0i));
1673 assert!(a.insert(5));
1674 assert!(a.insert(11));
1675 assert!(a.insert(7));
1677 let mut b = TreeSet::new();
1678 assert!(b.insert(0i));
1679 assert!(b.insert(7));
1680 assert!(b.insert(19));
1681 assert!(b.insert(250));
1682 assert!(b.insert(11));
1683 assert!(b.insert(200));
1685 assert!(!a.is_subset(&b));
1686 assert!(!a.is_superset(&b));
1687 assert!(!b.is_subset(&a));
1688 assert!(!b.is_superset(&a));
1690 assert!(b.insert(5));
1692 assert!(a.is_subset(&b));
1693 assert!(!a.is_superset(&b));
1694 assert!(!b.is_subset(&a));
1695 assert!(b.is_superset(&a));
1699 fn test_iterator() {
1700 let mut m = TreeSet::new();
1702 assert!(m.insert(3i));
1703 assert!(m.insert(0));
1704 assert!(m.insert(4));
1705 assert!(m.insert(2));
1706 assert!(m.insert(1));
1716 fn test_rev_iter() {
1717 let mut m = TreeSet::new();
1719 assert!(m.insert(3i));
1720 assert!(m.insert(0));
1721 assert!(m.insert(4));
1722 assert!(m.insert(2));
1723 assert!(m.insert(1));
1726 for x in m.rev_iter() {
1733 fn test_move_iter() {
1734 let s: TreeSet<int> = range(0i, 5).collect();
1737 for x in s.move_iter() {
1744 fn test_move_iter_size_hint() {
1745 let s: TreeSet<int> = vec!(0i, 1).move_iter().collect();
1747 let mut it = s.move_iter();
1749 assert_eq!(it.size_hint(), (2, Some(2)));
1750 assert!(it.next() != None);
1752 assert_eq!(it.size_hint(), (1, Some(1)));
1753 assert!(it.next() != None);
1755 assert_eq!(it.size_hint(), (0, Some(0)));
1756 assert_eq!(it.next(), None);
1760 fn test_clone_eq() {
1761 let mut m = TreeSet::new();
1766 assert!(m.clone() == m);
1771 let mut x = TreeSet::new();
1772 let mut y = TreeSet::new();
1782 assert!(hash::hash(&x) == hash::hash(&y));
1788 f: |&TreeSet<int>, &TreeSet<int>, f: |&int| -> bool| -> bool) {
1789 let mut set_a = TreeSet::new();
1790 let mut set_b = TreeSet::new();
1792 for x in a.iter() { assert!(set_a.insert(*x)) }
1793 for y in b.iter() { assert!(set_b.insert(*y)) }
1796 f(&set_a, &set_b, |x| {
1797 assert_eq!(*x, expected[i]);
1801 assert_eq!(i, expected.len());
1805 fn test_intersection() {
1806 fn check_intersection(a: &[int], b: &[int], expected: &[int]) {
1807 check(a, b, expected, |x, y, f| x.intersection(y).all(f))
1810 check_intersection([], [], []);
1811 check_intersection([1, 2, 3], [], []);
1812 check_intersection([], [1, 2, 3], []);
1813 check_intersection([2], [1, 2, 3], [2]);
1814 check_intersection([1, 2, 3], [2], [2]);
1815 check_intersection([11, 1, 3, 77, 103, 5, -5],
1816 [2, 11, 77, -9, -42, 5, 3],
1821 fn test_difference() {
1822 fn check_difference(a: &[int], b: &[int], expected: &[int]) {
1823 check(a, b, expected, |x, y, f| x.difference(y).all(f))
1826 check_difference([], [], []);
1827 check_difference([1, 12], [], [1, 12]);
1828 check_difference([], [1, 2, 3, 9], []);
1829 check_difference([1, 3, 5, 9, 11],
1832 check_difference([-5, 11, 22, 33, 40, 42],
1833 [-12, -5, 14, 23, 34, 38, 39, 50],
1834 [11, 22, 33, 40, 42]);
1838 fn test_symmetric_difference() {
1839 fn check_symmetric_difference(a: &[int], b: &[int],
1841 check(a, b, expected, |x, y, f| x.symmetric_difference(y).all(f))
1844 check_symmetric_difference([], [], []);
1845 check_symmetric_difference([1, 2, 3], [2], [1, 3]);
1846 check_symmetric_difference([2], [1, 2, 3], [1, 3]);
1847 check_symmetric_difference([1, 3, 5, 9, 11],
1849 [-2, 1, 5, 11, 14, 22]);
1854 fn check_union(a: &[int], b: &[int],
1856 check(a, b, expected, |x, y, f| x.union(y).all(f))
1859 check_union([], [], []);
1860 check_union([1, 2, 3], [2], [1, 2, 3]);
1861 check_union([2], [1, 2, 3], [1, 2, 3]);
1862 check_union([1, 3, 5, 9, 11, 16, 19, 24],
1863 [-2, 1, 5, 9, 13, 19],
1864 [-2, 1, 3, 5, 9, 11, 13, 16, 19, 24]);
1869 let mut x = TreeSet::new();
1874 let mut y = TreeSet::new();
1880 let mut z = x.iter().zip(y.iter());
1882 // FIXME: #5801: this needs a type hint to compile...
1883 let result: Option<(&uint, & &'static str)> = z.next();
1884 assert_eq!(result.unwrap(), (&5u, &("bar")));
1886 let result: Option<(&uint, & &'static str)> = z.next();
1887 assert_eq!(result.unwrap(), (&11u, &("foo")));
1889 let result: Option<(&uint, & &'static str)> = z.next();
1890 assert!(result.is_none());
1895 let mut m = TreeMap::new();
1896 assert_eq!(m.swap(1u, 2i), None);
1897 assert_eq!(m.swap(1u, 3i), Some(2));
1898 assert_eq!(m.swap(1u, 4i), Some(3));
1903 let mut m = TreeMap::new();
1905 assert_eq!(m.pop(&1), Some(2));
1906 assert_eq!(m.pop(&1), None);
1910 fn test_from_iter() {
1911 let xs = [1i, 2, 3, 4, 5, 6, 7, 8, 9];
1913 let set: TreeSet<int> = xs.iter().map(|&x| x).collect();
1915 for x in xs.iter() {
1916 assert!(set.contains(x));
1922 let mut set: TreeSet<int> = TreeSet::new();
1923 let empty: TreeSet<int> = TreeSet::new();
1928 let set_str = format!("{}", set);
1930 assert!(set_str == "{1, 2}".to_string());
1931 assert_eq!(format!("{}", empty), "{}".to_string());