2013-01-14 09:27:26 -06:00
|
|
|
// Copyright 2013 The Rust Project Developers. See the COPYRIGHT
|
2012-12-03 18:48:01 -06:00
|
|
|
// file at the top-level directory of this distribution and at
|
|
|
|
// http://rust-lang.org/COPYRIGHT.
|
|
|
|
//
|
|
|
|
// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
|
|
|
|
// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
|
|
|
|
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
|
|
|
|
// option. This file may not be copied, modified, or distributed
|
|
|
|
// except according to those terms.
|
|
|
|
|
2013-01-14 09:27:26 -06:00
|
|
|
//! An ordered map and set implemented as self-balancing binary search
|
|
|
|
//! trees. The only requirement for the types is that the key implements
|
2013-03-02 12:27:29 -06:00
|
|
|
//! `TotalOrd`.
|
2013-01-14 09:27:26 -06:00
|
|
|
|
2013-05-17 17:28:44 -05:00
|
|
|
|
Replaces the free-standing functions in f32, &c.
The free-standing functions in f32, f64, i8, i16, i32, i64, u8, u16,
u32, u64, float, int, and uint are replaced with generic functions in
num instead.
If you were previously using any of those functions, just replace them
with the corresponding function with the same name in num.
Note: If you were using a function that corresponds to an operator, use
the operator instead.
2013-07-08 11:05:17 -05:00
|
|
|
use std::num;
|
2013-06-28 17:32:26 -05:00
|
|
|
use std::util::{swap, replace};
|
2011-08-25 19:19:23 -05:00
|
|
|
|
2013-01-14 09:27:26 -06:00
|
|
|
// This is implemented as an AA tree, which is a simplified variation of
|
2013-06-06 02:38:41 -05:00
|
|
|
// a red-black tree where red (horizontal) nodes can only be added
|
2013-01-14 09:27:26 -06:00
|
|
|
// as a right child. The time complexity is the same, and re-balancing
|
|
|
|
// operations are more frequent but also cheaper.
|
2012-05-23 19:18:31 -05:00
|
|
|
|
2013-01-15 05:45:30 -06:00
|
|
|
// Future improvements:
|
|
|
|
|
2013-01-15 08:50:51 -06:00
|
|
|
// range search - O(log n) retrieval of an iterator from some key
|
|
|
|
|
2013-01-15 05:45:30 -06:00
|
|
|
// (possibly) implement the overloads Python does for sets:
|
2013-01-14 09:27:26 -06:00
|
|
|
// * intersection: &
|
|
|
|
// * difference: -
|
|
|
|
// * symmetric difference: ^
|
2013-01-29 18:30:26 -06:00
|
|
|
// * union: |
|
2013-01-15 11:44:43 -06:00
|
|
|
// These would be convenient since the methods work like `each`
|
2013-01-14 09:27:26 -06:00
|
|
|
|
2013-05-28 22:11:41 -05:00
|
|
|
#[allow(missing_doc)]
|
2013-01-28 12:46:43 -06:00
|
|
|
pub struct TreeMap<K, V> {
|
2013-01-14 09:27:26 -06:00
|
|
|
priv root: Option<~TreeNode<K, V>>,
|
|
|
|
priv length: uint
|
|
|
|
}
|
|
|
|
|
2013-03-02 12:27:29 -06:00
|
|
|
impl<K: Eq + TotalOrd, V: Eq> Eq for TreeMap<K, V> {
|
2013-03-21 23:34:30 -05:00
|
|
|
fn eq(&self, other: &TreeMap<K, V>) -> bool {
|
2013-01-14 09:27:26 -06:00
|
|
|
if self.len() != other.len() {
|
2013-01-14 20:12:49 -06:00
|
|
|
false
|
2013-01-15 13:25:37 -06:00
|
|
|
} else {
|
2013-01-14 20:03:28 -06:00
|
|
|
let mut x = self.iter();
|
|
|
|
let mut y = other.iter();
|
2013-01-23 13:43:58 -06:00
|
|
|
for self.len().times {
|
2013-04-09 09:54:32 -05:00
|
|
|
if x.next().unwrap() != y.next().unwrap() {
|
2013-03-22 17:07:09 -05:00
|
|
|
return false
|
2013-01-14 20:03:28 -06:00
|
|
|
}
|
2013-01-14 09:27:26 -06:00
|
|
|
}
|
2013-01-14 20:03:28 -06:00
|
|
|
true
|
2013-01-14 09:27:26 -06:00
|
|
|
}
|
|
|
|
}
|
2013-03-21 23:34:30 -05:00
|
|
|
fn ne(&self, other: &TreeMap<K, V>) -> bool { !self.eq(other) }
|
2011-08-25 19:19:23 -05:00
|
|
|
}
|
|
|
|
|
2013-01-26 11:40:41 -06:00
|
|
|
// Lexicographical comparison
|
2013-07-01 10:51:34 -05:00
|
|
|
fn lt<K: Ord + TotalOrd, V: Ord>(a: &TreeMap<K, V>,
|
2013-03-02 12:27:29 -06:00
|
|
|
b: &TreeMap<K, V>) -> bool {
|
2013-01-26 11:40:41 -06:00
|
|
|
let mut x = a.iter();
|
|
|
|
let mut y = b.iter();
|
|
|
|
|
|
|
|
let (a_len, b_len) = (a.len(), b.len());
|
Replaces the free-standing functions in f32, &c.
The free-standing functions in f32, f64, i8, i16, i32, i64, u8, u16,
u32, u64, float, int, and uint are replaced with generic functions in
num instead.
If you were previously using any of those functions, just replace them
with the corresponding function with the same name in num.
Note: If you were using a function that corresponds to an operator, use
the operator instead.
2013-07-08 11:05:17 -05:00
|
|
|
for num::min(a_len, b_len).times {
|
2013-07-01 10:51:34 -05:00
|
|
|
let (key_a, value_a) = x.next().unwrap();
|
|
|
|
let (key_b, value_b) = y.next().unwrap();
|
2013-03-22 17:07:09 -05:00
|
|
|
if *key_a < *key_b { return true; }
|
|
|
|
if *key_a > *key_b { return false; }
|
2013-07-01 10:51:34 -05:00
|
|
|
if *value_a < *value_b { return true; }
|
|
|
|
if *value_a > *value_b { return false; }
|
|
|
|
}
|
2013-01-26 11:40:41 -06:00
|
|
|
|
2013-03-14 22:16:15 -05:00
|
|
|
a_len < b_len
|
2013-01-26 11:40:41 -06:00
|
|
|
}
|
|
|
|
|
2013-07-01 10:51:34 -05:00
|
|
|
impl<K: Ord + TotalOrd, V: Ord> Ord for TreeMap<K, V> {
|
2013-06-18 16:45:18 -05:00
|
|
|
#[inline]
|
2013-03-21 23:34:30 -05:00
|
|
|
fn lt(&self, other: &TreeMap<K, V>) -> bool { lt(self, other) }
|
2013-06-18 16:45:18 -05:00
|
|
|
#[inline]
|
2013-03-21 23:34:30 -05:00
|
|
|
fn le(&self, other: &TreeMap<K, V>) -> bool { !lt(other, self) }
|
2013-06-18 16:45:18 -05:00
|
|
|
#[inline]
|
2013-03-21 23:34:30 -05:00
|
|
|
fn ge(&self, other: &TreeMap<K, V>) -> bool { !lt(self, other) }
|
2013-06-18 16:45:18 -05:00
|
|
|
#[inline]
|
2013-03-21 23:34:30 -05:00
|
|
|
fn gt(&self, other: &TreeMap<K, V>) -> bool { lt(other, self) }
|
2013-01-26 11:40:41 -06:00
|
|
|
}
|
|
|
|
|
2013-03-02 12:27:29 -06:00
|
|
|
impl<K: TotalOrd, V> Container for TreeMap<K, V> {
|
2013-01-21 20:59:19 -06:00
|
|
|
/// Return the number of elements in the map
|
2013-06-23 22:44:11 -05:00
|
|
|
fn len(&self) -> uint { self.length }
|
2013-01-21 20:59:19 -06:00
|
|
|
|
|
|
|
/// Return true if the map contains no elements
|
2013-06-23 22:44:11 -05:00
|
|
|
fn is_empty(&self) -> bool { self.root.is_none() }
|
2013-01-21 20:59:19 -06:00
|
|
|
}
|
|
|
|
|
2013-03-02 12:27:29 -06:00
|
|
|
impl<K: TotalOrd, V> Mutable for TreeMap<K, V> {
|
2013-01-21 16:25:57 -06:00
|
|
|
/// Clear the map, removing all key-value pairs.
|
|
|
|
fn clear(&mut self) {
|
|
|
|
self.root = None;
|
|
|
|
self.length = 0
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2013-03-02 12:27:29 -06:00
|
|
|
impl<K: TotalOrd, V> Map<K, V> for TreeMap<K, V> {
|
2013-01-21 17:22:03 -06:00
|
|
|
/// Return true if the map contains a value for the specified key
|
2013-03-21 23:34:30 -05:00
|
|
|
fn contains_key(&self, key: &K) -> bool {
|
2013-01-21 17:22:03 -06:00
|
|
|
self.find(key).is_some()
|
|
|
|
}
|
|
|
|
|
2013-03-24 15:55:51 -05:00
|
|
|
/// Return a reference to the value corresponding to the key
|
2013-04-10 15:14:06 -05:00
|
|
|
fn find<'a>(&'a self, key: &K) -> Option<&'a V> {
|
|
|
|
let mut current: &'a Option<~TreeNode<K, V>> = &self.root;
|
|
|
|
loop {
|
|
|
|
match *current {
|
|
|
|
Some(ref r) => {
|
|
|
|
match key.cmp(&r.key) {
|
|
|
|
Less => current = &r.left,
|
|
|
|
Greater => current = &r.right,
|
|
|
|
Equal => return Some(&r.value)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
None => return None
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2013-03-24 19:40:17 -05:00
|
|
|
/// Return a mutable reference to the value corresponding to the key
|
2013-06-18 16:45:18 -05:00
|
|
|
#[inline]
|
2013-04-10 15:14:06 -05:00
|
|
|
fn find_mut<'a>(&'a mut self, key: &K) -> Option<&'a mut V> {
|
|
|
|
find_mut(&mut self.root, key)
|
|
|
|
}
|
|
|
|
|
2013-01-21 17:22:03 -06:00
|
|
|
/// Insert a key-value pair into the map. An existing value for a
|
|
|
|
/// key is replaced by the new value. Return true if the key did
|
|
|
|
/// not already exist in the map.
|
|
|
|
fn insert(&mut self, key: K, value: V) -> bool {
|
2013-05-04 08:54:58 -05:00
|
|
|
self.swap(key, value).is_none()
|
2013-01-21 17:22:03 -06:00
|
|
|
}
|
|
|
|
|
|
|
|
/// Remove a key-value pair from the map. Return true if the key
|
|
|
|
/// was present in the map, otherwise false.
|
|
|
|
fn remove(&mut self, key: &K) -> bool {
|
2013-05-04 08:54:58 -05:00
|
|
|
self.pop(key).is_some()
|
|
|
|
}
|
|
|
|
|
|
|
|
/// Insert a key-value pair from the map. If the key already had a value
|
|
|
|
/// present in the map, that value is returned. Otherwise None is returned.
|
|
|
|
fn swap(&mut self, key: K, value: V) -> Option<V> {
|
|
|
|
let ret = insert(&mut self.root, key, value);
|
|
|
|
if ret.is_none() { self.length += 1 }
|
|
|
|
ret
|
|
|
|
}
|
|
|
|
|
|
|
|
/// Removes a key from the map, returning the value at the key if the key
|
|
|
|
/// was previously in the map.
|
|
|
|
fn pop(&mut self, key: &K) -> Option<V> {
|
2013-01-21 17:22:03 -06:00
|
|
|
let ret = remove(&mut self.root, key);
|
2013-05-04 08:54:58 -05:00
|
|
|
if ret.is_some() { self.length -= 1 }
|
2013-01-21 17:22:03 -06:00
|
|
|
ret
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2013-05-31 17:17:22 -05:00
|
|
|
impl<K: TotalOrd, V> TreeMap<K, V> {
|
2013-05-02 17:33:27 -05:00
|
|
|
/// Create an empty TreeMap
|
2013-05-31 17:17:22 -05:00
|
|
|
pub fn new() -> TreeMap<K, V> { TreeMap{root: None, length: 0} }
|
2013-05-02 17:33:27 -05:00
|
|
|
|
2013-06-24 16:45:00 -05:00
|
|
|
/// Visit all keys in order
|
|
|
|
pub fn each_key(&self, f: &fn(&K) -> bool) -> bool {
|
2013-06-26 06:49:06 -05:00
|
|
|
self.iter().advance(|(k, _)| f(k))
|
2013-06-24 16:45:00 -05:00
|
|
|
}
|
|
|
|
|
|
|
|
/// Visit all values in order
|
|
|
|
pub fn each_value<'a>(&'a self, f: &fn(&'a V) -> bool) -> bool {
|
2013-06-26 06:49:06 -05:00
|
|
|
self.iter().advance(|(_, v)| f(v))
|
2013-06-24 16:45:00 -05:00
|
|
|
}
|
|
|
|
|
|
|
|
/// Iterate over the map and mutate the contained values
|
|
|
|
pub fn mutate_values(&mut self, f: &fn(&K, &mut V) -> bool) -> bool {
|
|
|
|
mutate_values(&mut self.root, f)
|
|
|
|
}
|
|
|
|
|
2013-05-02 17:33:27 -05:00
|
|
|
/// Visit all key-value pairs in reverse order
|
2013-05-31 17:17:22 -05:00
|
|
|
pub fn each_reverse<'a>(&'a self, f: &fn(&'a K, &'a V) -> bool) -> bool {
|
2013-05-02 17:33:27 -05:00
|
|
|
each_reverse(&self.root, f)
|
|
|
|
}
|
|
|
|
|
|
|
|
/// Visit all keys in reverse order
|
2013-05-31 17:17:22 -05:00
|
|
|
pub fn each_key_reverse(&self, f: &fn(&K) -> bool) -> bool {
|
2013-05-02 17:33:27 -05:00
|
|
|
self.each_reverse(|k, _| f(k))
|
|
|
|
}
|
|
|
|
|
|
|
|
/// Visit all values in reverse order
|
2013-05-31 17:17:22 -05:00
|
|
|
pub fn each_value_reverse(&self, f: &fn(&V) -> bool) -> bool {
|
2013-05-02 17:33:27 -05:00
|
|
|
self.each_reverse(|_, v| f(v))
|
|
|
|
}
|
|
|
|
|
|
|
|
/// Get a lazy iterator over the key-value pairs in the map.
|
|
|
|
/// Requires that it be frozen (immutable).
|
2013-05-31 17:17:22 -05:00
|
|
|
pub fn iter<'a>(&'a self) -> TreeMapIterator<'a, K, V> {
|
2013-07-03 13:30:12 -05:00
|
|
|
TreeMapIterator{stack: ~[], node: &self.root, remaining: self.length}
|
2013-05-02 17:33:27 -05:00
|
|
|
}
|
|
|
|
}
|
2013-01-14 19:41:11 -06:00
|
|
|
|
|
|
|
/// Lazy forward iterator over a map
|
2013-03-25 15:21:04 -05:00
|
|
|
pub struct TreeMapIterator<'self, K, V> {
|
2013-03-14 13:22:51 -05:00
|
|
|
priv stack: ~[&'self ~TreeNode<K, V>],
|
2013-07-03 13:30:12 -05:00
|
|
|
priv node: &'self Option<~TreeNode<K, V>>,
|
|
|
|
priv remaining: uint
|
2011-08-25 19:19:23 -05:00
|
|
|
}
|
2011-08-26 12:50:02 -05:00
|
|
|
|
2013-04-09 09:54:32 -05:00
|
|
|
impl<'self, K, V> Iterator<(&'self K, &'self V)> for TreeMapIterator<'self, K, V> {
|
|
|
|
/// Advance the iterator to the next node (in order) and return a
|
|
|
|
/// tuple with a reference to the key and value. If there are no
|
|
|
|
/// more nodes, return `None`.
|
|
|
|
fn next(&mut self) -> Option<(&'self K, &'self V)> {
|
|
|
|
while !self.stack.is_empty() || self.node.is_some() {
|
|
|
|
match *self.node {
|
|
|
|
Some(ref x) => {
|
|
|
|
self.stack.push(x);
|
|
|
|
self.node = &x.left;
|
|
|
|
}
|
|
|
|
None => {
|
|
|
|
let res = self.stack.pop();
|
|
|
|
self.node = &res.right;
|
2013-07-03 13:30:12 -05:00
|
|
|
self.remaining -= 1;
|
2013-04-09 09:54:32 -05:00
|
|
|
return Some((&res.key, &res.value));
|
|
|
|
}
|
|
|
|
}
|
2013-01-14 19:41:11 -06:00
|
|
|
}
|
2013-04-09 09:54:32 -05:00
|
|
|
None
|
2013-01-14 19:41:11 -06:00
|
|
|
}
|
2013-07-03 13:30:12 -05:00
|
|
|
|
|
|
|
#[inline]
|
|
|
|
fn size_hint(&self) -> (uint, Option<uint>) {
|
|
|
|
(self.remaining, Some(self.remaining))
|
|
|
|
}
|
2013-02-26 13:15:08 -06:00
|
|
|
}
|
|
|
|
|
2013-04-09 09:54:32 -05:00
|
|
|
impl<'self, T> Iterator<&'self T> for TreeSetIterator<'self, T> {
|
|
|
|
/// Advance the iterator to the next node (in order). If there are no more nodes, return `None`.
|
2013-06-18 16:45:18 -05:00
|
|
|
#[inline]
|
2013-04-09 09:54:32 -05:00
|
|
|
fn next(&mut self) -> Option<&'self T> {
|
|
|
|
do self.iter.next().map |&(value, _)| { value }
|
2013-02-26 13:15:08 -06:00
|
|
|
}
|
2013-01-14 19:41:11 -06:00
|
|
|
}
|
|
|
|
|
2013-05-28 22:11:41 -05:00
|
|
|
/// A implementation of the `Set` trait on top of the `TreeMap` container. The
|
|
|
|
/// only requirement is that the type of the elements contained ascribes to the
|
|
|
|
/// `TotalOrd` trait.
|
2013-01-28 12:46:43 -06:00
|
|
|
pub struct TreeSet<T> {
|
2013-01-14 09:27:26 -06:00
|
|
|
priv map: TreeMap<T, ()>
|
|
|
|
}
|
|
|
|
|
2013-03-02 12:27:29 -06:00
|
|
|
impl<T: Eq + TotalOrd> Eq for TreeSet<T> {
|
2013-06-18 16:45:18 -05:00
|
|
|
#[inline]
|
2013-03-21 23:34:30 -05:00
|
|
|
fn eq(&self, other: &TreeSet<T>) -> bool { self.map == other.map }
|
2013-06-18 16:45:18 -05:00
|
|
|
#[inline]
|
2013-03-21 23:34:30 -05:00
|
|
|
fn ne(&self, other: &TreeSet<T>) -> bool { self.map != other.map }
|
2013-01-14 09:27:26 -06:00
|
|
|
}
|
|
|
|
|
2013-03-02 12:27:29 -06:00
|
|
|
impl<T: Ord + TotalOrd> Ord for TreeSet<T> {
|
2013-06-18 16:45:18 -05:00
|
|
|
#[inline]
|
2013-03-21 23:34:30 -05:00
|
|
|
fn lt(&self, other: &TreeSet<T>) -> bool { self.map < other.map }
|
2013-06-18 16:45:18 -05:00
|
|
|
#[inline]
|
2013-03-21 23:34:30 -05:00
|
|
|
fn le(&self, other: &TreeSet<T>) -> bool { self.map <= other.map }
|
2013-06-18 16:45:18 -05:00
|
|
|
#[inline]
|
2013-03-21 23:34:30 -05:00
|
|
|
fn ge(&self, other: &TreeSet<T>) -> bool { self.map >= other.map }
|
2013-06-18 16:45:18 -05:00
|
|
|
#[inline]
|
2013-03-21 23:34:30 -05:00
|
|
|
fn gt(&self, other: &TreeSet<T>) -> bool { self.map > other.map }
|
2013-01-26 11:40:41 -06:00
|
|
|
}
|
|
|
|
|
2013-03-02 12:27:29 -06:00
|
|
|
impl<T: TotalOrd> Container for TreeSet<T> {
|
2013-01-23 15:47:27 -06:00
|
|
|
/// Return the number of elements in the set
|
2013-06-18 16:45:18 -05:00
|
|
|
#[inline]
|
2013-06-23 22:44:11 -05:00
|
|
|
fn len(&self) -> uint { self.map.len() }
|
2013-01-21 20:59:19 -06:00
|
|
|
|
2013-01-23 15:47:27 -06:00
|
|
|
/// Return true if the set contains no elements
|
2013-06-18 16:45:18 -05:00
|
|
|
#[inline]
|
2013-06-23 22:44:11 -05:00
|
|
|
fn is_empty(&self) -> bool { self.map.is_empty() }
|
2013-01-21 20:59:19 -06:00
|
|
|
}
|
|
|
|
|
2013-03-02 12:27:29 -06:00
|
|
|
impl<T: TotalOrd> Mutable for TreeSet<T> {
|
2013-01-21 16:25:57 -06:00
|
|
|
/// Clear the set, removing all values.
|
2013-06-18 16:45:18 -05:00
|
|
|
#[inline]
|
2013-01-21 16:25:57 -06:00
|
|
|
fn clear(&mut self) { self.map.clear() }
|
|
|
|
}
|
|
|
|
|
2013-03-02 12:27:29 -06:00
|
|
|
impl<T: TotalOrd> Set<T> for TreeSet<T> {
|
2013-01-20 12:46:06 -06:00
|
|
|
/// Return true if the set contains a value
|
2013-06-18 16:45:18 -05:00
|
|
|
#[inline]
|
2013-03-21 23:34:30 -05:00
|
|
|
fn contains(&self, value: &T) -> bool {
|
2013-01-20 12:46:06 -06:00
|
|
|
self.map.contains_key(value)
|
|
|
|
}
|
|
|
|
|
|
|
|
/// Add a value to the set. Return true if the value was not already
|
|
|
|
/// present in the set.
|
2013-06-18 16:45:18 -05:00
|
|
|
#[inline]
|
2013-01-20 12:46:06 -06:00
|
|
|
fn insert(&mut self, value: T) -> bool { self.map.insert(value, ()) }
|
|
|
|
|
|
|
|
/// Remove a value from the set. Return true if the value was
|
|
|
|
/// present in the set.
|
2013-06-18 16:45:18 -05:00
|
|
|
#[inline]
|
2013-01-20 12:46:06 -06:00
|
|
|
fn remove(&mut self, value: &T) -> bool { self.map.remove(value) }
|
2013-01-29 15:07:11 -06:00
|
|
|
|
2013-01-29 16:04:25 -06:00
|
|
|
/// Return true if the set has no elements in common with `other`.
|
|
|
|
/// This is equivalent to checking for an empty intersection.
|
2013-03-21 23:34:30 -05:00
|
|
|
fn is_disjoint(&self, other: &TreeSet<T>) -> bool {
|
2013-01-29 16:04:25 -06:00
|
|
|
let mut x = self.iter();
|
|
|
|
let mut y = other.iter();
|
2013-04-09 09:54:32 -05:00
|
|
|
let mut a = x.next();
|
|
|
|
let mut b = y.next();
|
2013-03-22 17:07:09 -05:00
|
|
|
while a.is_some() && b.is_some() {
|
|
|
|
let a1 = a.unwrap();
|
|
|
|
let b1 = b.unwrap();
|
|
|
|
match a1.cmp(b1) {
|
2013-04-09 09:54:32 -05:00
|
|
|
Less => a = x.next(),
|
|
|
|
Greater => b = y.next(),
|
2013-03-22 17:07:09 -05:00
|
|
|
Equal => return false
|
2013-01-29 16:04:25 -06:00
|
|
|
}
|
|
|
|
}
|
|
|
|
true
|
|
|
|
}
|
|
|
|
|
2013-01-29 15:07:11 -06:00
|
|
|
/// Return true if the set is a subset of another
|
2013-06-18 16:45:18 -05:00
|
|
|
#[inline]
|
2013-03-21 23:34:30 -05:00
|
|
|
fn is_subset(&self, other: &TreeSet<T>) -> bool {
|
2013-01-29 15:07:11 -06:00
|
|
|
other.is_superset(self)
|
|
|
|
}
|
|
|
|
|
|
|
|
/// Return true if the set is a superset of another
|
2013-03-21 23:34:30 -05:00
|
|
|
fn is_superset(&self, other: &TreeSet<T>) -> bool {
|
2013-01-29 15:07:11 -06:00
|
|
|
let mut x = self.iter();
|
|
|
|
let mut y = other.iter();
|
2013-04-09 09:54:32 -05:00
|
|
|
let mut a = x.next();
|
|
|
|
let mut b = y.next();
|
2013-03-22 17:07:09 -05:00
|
|
|
while b.is_some() {
|
|
|
|
if a.is_none() {
|
|
|
|
return false
|
|
|
|
}
|
2013-01-29 15:07:11 -06:00
|
|
|
|
2013-03-22 17:07:09 -05:00
|
|
|
let a1 = a.unwrap();
|
|
|
|
let b1 = b.unwrap();
|
2013-01-29 15:07:11 -06:00
|
|
|
|
2013-03-22 17:07:09 -05:00
|
|
|
match a1.cmp(b1) {
|
|
|
|
Less => (),
|
|
|
|
Greater => return false,
|
2013-04-09 09:54:32 -05:00
|
|
|
Equal => b = y.next(),
|
2013-01-29 15:07:11 -06:00
|
|
|
}
|
2013-03-22 17:07:09 -05:00
|
|
|
|
2013-04-09 09:54:32 -05:00
|
|
|
a = x.next();
|
2013-01-29 15:07:11 -06:00
|
|
|
}
|
|
|
|
true
|
|
|
|
}
|
2013-01-15 13:25:37 -06:00
|
|
|
|
2013-01-14 09:27:26 -06:00
|
|
|
/// Visit the values (in-order) representing the difference
|
2013-05-02 17:33:27 -05:00
|
|
|
fn difference(&self, other: &TreeSet<T>, f: &fn(&T) -> bool) -> bool {
|
|
|
|
let mut x = self.iter();
|
|
|
|
let mut y = other.iter();
|
|
|
|
|
|
|
|
let mut a = x.next();
|
|
|
|
let mut b = y.next();
|
|
|
|
|
|
|
|
while a.is_some() {
|
|
|
|
if b.is_none() {
|
|
|
|
return f(a.unwrap()) && x.advance(f);
|
|
|
|
}
|
|
|
|
|
|
|
|
let a1 = a.unwrap();
|
|
|
|
let b1 = b.unwrap();
|
|
|
|
|
|
|
|
let cmp = a1.cmp(b1);
|
|
|
|
|
|
|
|
if cmp == Less {
|
|
|
|
if !f(a1) { return false; }
|
|
|
|
a = x.next();
|
|
|
|
} else {
|
|
|
|
if cmp == Equal { a = x.next() }
|
|
|
|
b = y.next();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return true;
|
|
|
|
}
|
2013-01-14 09:27:26 -06:00
|
|
|
|
|
|
|
/// Visit the values (in-order) representing the symmetric difference
|
2013-05-02 17:33:27 -05:00
|
|
|
fn symmetric_difference(&self, other: &TreeSet<T>,
|
|
|
|
f: &fn(&T) -> bool) -> bool {
|
|
|
|
let mut x = self.iter();
|
|
|
|
let mut y = other.iter();
|
|
|
|
|
|
|
|
let mut a = x.next();
|
|
|
|
let mut b = y.next();
|
|
|
|
|
|
|
|
while a.is_some() {
|
|
|
|
if b.is_none() {
|
|
|
|
return f(a.unwrap()) && x.advance(f);
|
|
|
|
}
|
|
|
|
|
|
|
|
let a1 = a.unwrap();
|
|
|
|
let b1 = b.unwrap();
|
|
|
|
|
|
|
|
let cmp = a1.cmp(b1);
|
|
|
|
|
|
|
|
if cmp == Less {
|
|
|
|
if !f(a1) { return false; }
|
|
|
|
a = x.next();
|
|
|
|
} else {
|
|
|
|
if cmp == Greater {
|
|
|
|
if !f(b1) { return false; }
|
|
|
|
} else {
|
|
|
|
a = x.next();
|
|
|
|
}
|
|
|
|
b = y.next();
|
|
|
|
}
|
|
|
|
}
|
2013-06-10 16:50:12 -05:00
|
|
|
b.iter().advance(|&x| f(x)) && y.advance(f)
|
2013-05-02 17:33:27 -05:00
|
|
|
}
|
2013-01-14 09:27:26 -06:00
|
|
|
|
|
|
|
/// Visit the values (in-order) representing the intersection
|
2013-05-02 17:33:27 -05:00
|
|
|
fn intersection(&self, other: &TreeSet<T>, f: &fn(&T) -> bool) -> bool {
|
|
|
|
let mut x = self.iter();
|
|
|
|
let mut y = other.iter();
|
|
|
|
|
|
|
|
let mut a = x.next();
|
|
|
|
let mut b = y.next();
|
|
|
|
|
|
|
|
while a.is_some() && b.is_some() {
|
|
|
|
let a1 = a.unwrap();
|
|
|
|
let b1 = b.unwrap();
|
|
|
|
|
|
|
|
let cmp = a1.cmp(b1);
|
|
|
|
|
|
|
|
if cmp == Less {
|
|
|
|
a = x.next();
|
|
|
|
} else {
|
|
|
|
if cmp == Equal {
|
|
|
|
if !f(a1) { return false }
|
|
|
|
}
|
|
|
|
b = y.next();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return true;
|
|
|
|
}
|
2013-01-14 09:27:26 -06:00
|
|
|
|
|
|
|
/// Visit the values (in-order) representing the union
|
2013-05-02 17:33:27 -05:00
|
|
|
fn union(&self, other: &TreeSet<T>, f: &fn(&T) -> bool) -> bool {
|
|
|
|
let mut x = self.iter();
|
|
|
|
let mut y = other.iter();
|
|
|
|
|
|
|
|
let mut a = x.next();
|
|
|
|
let mut b = y.next();
|
|
|
|
|
|
|
|
while a.is_some() {
|
|
|
|
if b.is_none() {
|
|
|
|
return f(a.unwrap()) && x.advance(f);
|
|
|
|
}
|
|
|
|
|
|
|
|
let a1 = a.unwrap();
|
|
|
|
let b1 = b.unwrap();
|
|
|
|
|
|
|
|
let cmp = a1.cmp(b1);
|
|
|
|
|
|
|
|
if cmp == Greater {
|
|
|
|
if !f(b1) { return false; }
|
|
|
|
b = y.next();
|
|
|
|
} else {
|
|
|
|
if !f(a1) { return false; }
|
|
|
|
if cmp == Equal {
|
|
|
|
b = y.next();
|
|
|
|
}
|
|
|
|
a = x.next();
|
|
|
|
}
|
|
|
|
}
|
2013-06-10 16:50:12 -05:00
|
|
|
b.iter().advance(|&x| f(x)) && y.advance(f)
|
2013-05-02 17:33:27 -05:00
|
|
|
}
|
2011-08-26 12:50:02 -05:00
|
|
|
}
|
2012-01-17 21:05:07 -06:00
|
|
|
|
2013-05-31 17:17:22 -05:00
|
|
|
impl<T: TotalOrd> TreeSet<T> {
|
2013-01-29 20:58:47 -06:00
|
|
|
/// Create an empty TreeSet
|
2013-06-18 16:45:18 -05:00
|
|
|
#[inline]
|
2013-05-31 17:17:22 -05:00
|
|
|
pub fn new() -> TreeSet<T> { TreeSet{map: TreeMap::new()} }
|
2013-01-29 20:58:47 -06:00
|
|
|
|
|
|
|
/// Get a lazy iterator over the values in the set.
|
|
|
|
/// Requires that it be frozen (immutable).
|
2013-06-18 16:45:18 -05:00
|
|
|
#[inline]
|
2013-05-31 17:17:22 -05:00
|
|
|
pub fn iter<'a>(&'a self) -> TreeSetIterator<'a, T> {
|
2013-04-10 15:14:06 -05:00
|
|
|
TreeSetIterator{iter: self.map.iter()}
|
|
|
|
}
|
2013-06-23 16:57:39 -05:00
|
|
|
|
|
|
|
/// Visit all values in reverse order
|
|
|
|
#[inline]
|
|
|
|
pub fn each_reverse(&self, f: &fn(&T) -> bool) -> bool {
|
|
|
|
self.map.each_key_reverse(f)
|
|
|
|
}
|
2013-01-29 20:58:47 -06:00
|
|
|
}
|
|
|
|
|
2013-01-15 13:25:37 -06:00
|
|
|
/// Lazy forward iterator over a set
|
2013-03-22 17:52:50 -05:00
|
|
|
pub struct TreeSetIterator<'self, T> {
|
|
|
|
priv iter: TreeMapIterator<'self, T, ()>
|
2013-01-15 13:25:37 -06:00
|
|
|
}
|
|
|
|
|
2013-01-14 09:27:26 -06:00
|
|
|
// Nodes keep track of their level in the tree, starting at 1 in the
|
|
|
|
// leaves and with a red child sharing the level of the parent.
|
2013-01-28 12:46:43 -06:00
|
|
|
struct TreeNode<K, V> {
|
2013-01-14 09:27:26 -06:00
|
|
|
key: K,
|
|
|
|
value: V,
|
|
|
|
left: Option<~TreeNode<K, V>>,
|
|
|
|
right: Option<~TreeNode<K, V>>,
|
|
|
|
level: uint
|
2012-10-04 17:18:02 -05:00
|
|
|
}
|
|
|
|
|
2013-05-31 17:17:22 -05:00
|
|
|
impl<K: TotalOrd, V> TreeNode<K, V> {
|
|
|
|
/// Creates a new tree node.
|
2013-06-18 16:45:18 -05:00
|
|
|
#[inline]
|
2013-05-31 17:17:22 -05:00
|
|
|
pub fn new(key: K, value: V) -> TreeNode<K, V> {
|
2013-01-14 09:27:26 -06:00
|
|
|
TreeNode{key: key, value: value, left: None, right: None, level: 1}
|
|
|
|
}
|
|
|
|
}
|
2012-10-04 17:18:02 -05:00
|
|
|
|
2013-03-25 15:21:04 -05:00
|
|
|
fn each<'r, K: TotalOrd, V>(node: &'r Option<~TreeNode<K, V>>,
|
2013-05-02 17:33:27 -05:00
|
|
|
f: &fn(&'r K, &'r V) -> bool) -> bool {
|
2013-06-21 19:08:35 -05:00
|
|
|
node.iter().advance(|x| each(&x.left, |k,v| f(k,v)) && f(&x.key, &x.value) &&
|
|
|
|
each(&x.right, |k,v| f(k,v)))
|
2013-01-14 09:27:26 -06:00
|
|
|
}
|
|
|
|
|
2013-03-25 15:21:04 -05:00
|
|
|
fn each_reverse<'r, K: TotalOrd, V>(node: &'r Option<~TreeNode<K, V>>,
|
2013-05-02 17:33:27 -05:00
|
|
|
f: &fn(&'r K, &'r V) -> bool) -> bool {
|
2013-06-21 19:08:35 -05:00
|
|
|
node.iter().advance(|x| each_reverse(&x.right, |k,v| f(k,v)) && f(&x.key, &x.value) &&
|
|
|
|
each_reverse(&x.left, |k,v| f(k,v)))
|
2013-01-14 09:27:26 -06:00
|
|
|
}
|
|
|
|
|
2013-03-25 15:21:04 -05:00
|
|
|
fn mutate_values<'r, K: TotalOrd, V>(node: &'r mut Option<~TreeNode<K, V>>,
|
|
|
|
f: &fn(&'r K, &'r mut V) -> bool)
|
|
|
|
-> bool {
|
2013-03-13 16:07:23 -05:00
|
|
|
match *node {
|
|
|
|
Some(~TreeNode{key: ref key, value: ref mut value, left: ref mut left,
|
|
|
|
right: ref mut right, _}) => {
|
2013-06-21 19:08:35 -05:00
|
|
|
if !mutate_values(left, |k,v| f(k,v)) { return false }
|
2013-03-13 16:07:23 -05:00
|
|
|
if !f(key, value) { return false }
|
2013-06-21 19:08:35 -05:00
|
|
|
if !mutate_values(right, |k,v| f(k,v)) { return false }
|
2013-03-13 16:07:23 -05:00
|
|
|
}
|
|
|
|
None => return false
|
|
|
|
}
|
|
|
|
true
|
|
|
|
}
|
|
|
|
|
2013-01-14 09:27:26 -06:00
|
|
|
// Remove left horizontal link by rotating right
|
2013-03-02 12:27:29 -06:00
|
|
|
fn skew<K: TotalOrd, V>(node: &mut ~TreeNode<K, V>) {
|
2013-01-14 09:27:26 -06:00
|
|
|
if node.left.map_default(false, |x| x.level == node.level) {
|
|
|
|
let mut save = node.left.swap_unwrap();
|
2013-05-05 23:42:54 -05:00
|
|
|
swap(&mut node.left, &mut save.right); // save.right now None
|
|
|
|
swap(node, &mut save);
|
2013-02-10 19:37:21 -06:00
|
|
|
node.right = Some(save);
|
2013-01-14 09:27:26 -06:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// Remove dual horizontal link by rotating left and increasing level of
|
|
|
|
// the parent
|
2013-03-02 12:27:29 -06:00
|
|
|
fn split<K: TotalOrd, V>(node: &mut ~TreeNode<K, V>) {
|
2013-01-15 14:34:46 -06:00
|
|
|
if node.right.map_default(false,
|
|
|
|
|x| x.right.map_default(false, |y| y.level == node.level)) {
|
2013-01-14 09:27:26 -06:00
|
|
|
let mut save = node.right.swap_unwrap();
|
2013-05-05 23:42:54 -05:00
|
|
|
swap(&mut node.right, &mut save.left); // save.left now None
|
2013-01-14 09:27:26 -06:00
|
|
|
save.level += 1;
|
2013-05-05 23:42:54 -05:00
|
|
|
swap(node, &mut save);
|
2013-02-10 19:37:21 -06:00
|
|
|
node.left = Some(save);
|
2013-01-14 09:27:26 -06:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2013-03-25 15:21:04 -05:00
|
|
|
fn find_mut<'r, K: TotalOrd, V>(node: &'r mut Option<~TreeNode<K, V>>,
|
|
|
|
key: &K)
|
|
|
|
-> Option<&'r mut V> {
|
2013-03-24 15:55:51 -05:00
|
|
|
match *node {
|
|
|
|
Some(ref mut x) => {
|
|
|
|
match key.cmp(&x.key) {
|
|
|
|
Less => find_mut(&mut x.left, key),
|
|
|
|
Greater => find_mut(&mut x.right, key),
|
|
|
|
Equal => Some(&mut x.value),
|
|
|
|
}
|
|
|
|
}
|
|
|
|
None => None
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2013-05-04 08:54:58 -05:00
|
|
|
fn insert<K: TotalOrd, V>(node: &mut Option<~TreeNode<K, V>>,
|
|
|
|
key: K, value: V) -> Option<V> {
|
2013-02-10 19:44:15 -06:00
|
|
|
match *node {
|
|
|
|
Some(ref mut save) => {
|
2013-03-02 12:27:29 -06:00
|
|
|
match key.cmp(&save.key) {
|
|
|
|
Less => {
|
2013-01-14 09:27:26 -06:00
|
|
|
let inserted = insert(&mut save.left, key, value);
|
2013-02-10 19:44:15 -06:00
|
|
|
skew(save);
|
|
|
|
split(save);
|
2013-01-14 09:27:26 -06:00
|
|
|
inserted
|
2013-03-02 12:27:29 -06:00
|
|
|
}
|
|
|
|
Greater => {
|
2013-01-14 09:27:26 -06:00
|
|
|
let inserted = insert(&mut save.right, key, value);
|
2013-02-10 19:44:15 -06:00
|
|
|
skew(save);
|
|
|
|
split(save);
|
2013-01-14 09:27:26 -06:00
|
|
|
inserted
|
2013-03-02 12:27:29 -06:00
|
|
|
}
|
|
|
|
Equal => {
|
2013-01-14 09:27:26 -06:00
|
|
|
save.key = key;
|
2013-05-04 08:54:58 -05:00
|
|
|
Some(replace(&mut save.value, value))
|
2013-03-02 12:27:29 -06:00
|
|
|
}
|
2013-01-14 09:27:26 -06:00
|
|
|
}
|
2013-02-10 19:44:15 -06:00
|
|
|
}
|
|
|
|
None => {
|
|
|
|
*node = Some(~TreeNode::new(key, value));
|
2013-05-04 08:54:58 -05:00
|
|
|
None
|
2013-02-10 19:44:15 -06:00
|
|
|
}
|
2013-01-14 09:27:26 -06:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2013-03-02 12:27:29 -06:00
|
|
|
fn remove<K: TotalOrd, V>(node: &mut Option<~TreeNode<K, V>>,
|
2013-05-04 08:54:58 -05:00
|
|
|
key: &K) -> Option<V> {
|
2013-03-02 12:27:29 -06:00
|
|
|
fn heir_swap<K: TotalOrd, V>(node: &mut ~TreeNode<K, V>,
|
2013-05-05 23:42:54 -05:00
|
|
|
child: &mut Option<~TreeNode<K, V>>) {
|
2013-01-14 09:27:26 -06:00
|
|
|
// *could* be done without recursion, but it won't borrow check
|
2013-06-10 16:50:12 -05:00
|
|
|
for child.mut_iter().advance |x| {
|
2013-03-15 13:14:03 -05:00
|
|
|
if x.right.is_some() {
|
|
|
|
heir_swap(node, &mut x.right);
|
2013-01-14 09:27:26 -06:00
|
|
|
} else {
|
2013-05-05 23:42:54 -05:00
|
|
|
swap(&mut node.key, &mut x.key);
|
|
|
|
swap(&mut node.value, &mut x.value);
|
2013-01-14 09:27:26 -06:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2013-02-10 21:03:26 -06:00
|
|
|
match *node {
|
|
|
|
None => {
|
2013-05-04 08:54:58 -05:00
|
|
|
return None; // bottom of tree
|
2013-02-10 21:03:26 -06:00
|
|
|
}
|
|
|
|
Some(ref mut save) => {
|
2013-05-04 08:54:58 -05:00
|
|
|
let (ret, rebalance) = match key.cmp(&save.key) {
|
|
|
|
Less => (remove(&mut save.left, key), true),
|
|
|
|
Greater => (remove(&mut save.right, key), true),
|
2013-03-02 12:27:29 -06:00
|
|
|
Equal => {
|
2013-01-14 09:27:26 -06:00
|
|
|
if save.left.is_some() {
|
|
|
|
if save.right.is_some() {
|
|
|
|
let mut left = save.left.swap_unwrap();
|
|
|
|
if left.right.is_some() {
|
|
|
|
heir_swap(save, &mut left.right);
|
|
|
|
} else {
|
2013-05-05 23:42:54 -05:00
|
|
|
swap(&mut save.key, &mut left.key);
|
|
|
|
swap(&mut save.value, &mut left.value);
|
2013-01-14 09:27:26 -06:00
|
|
|
}
|
2013-01-29 14:48:18 -06:00
|
|
|
save.left = Some(left);
|
2013-05-04 08:54:58 -05:00
|
|
|
(remove(&mut save.left, key), true)
|
2013-01-14 09:27:26 -06:00
|
|
|
} else {
|
2013-05-04 08:54:58 -05:00
|
|
|
let new = save.left.swap_unwrap();
|
|
|
|
let ~TreeNode{value, _} = replace(save, new);
|
2013-02-10 21:03:26 -06:00
|
|
|
*save = save.left.swap_unwrap();
|
2013-05-04 08:54:58 -05:00
|
|
|
(Some(value), true)
|
2013-01-14 09:27:26 -06:00
|
|
|
}
|
|
|
|
} else if save.right.is_some() {
|
2013-05-04 08:54:58 -05:00
|
|
|
let new = save.right.swap_unwrap();
|
|
|
|
let ~TreeNode{value, _} = replace(save, new);
|
|
|
|
(Some(value), true)
|
2013-01-14 09:27:26 -06:00
|
|
|
} else {
|
2013-05-04 08:54:58 -05:00
|
|
|
(None, false)
|
2013-01-14 09:27:26 -06:00
|
|
|
}
|
2013-03-02 12:27:29 -06:00
|
|
|
}
|
2013-01-14 09:27:26 -06:00
|
|
|
};
|
|
|
|
|
2013-05-04 08:54:58 -05:00
|
|
|
if rebalance {
|
2013-02-09 00:21:45 -06:00
|
|
|
let left_level = save.left.map_default(0, |x| x.level);
|
|
|
|
let right_level = save.right.map_default(0, |x| x.level);
|
2013-02-10 21:03:26 -06:00
|
|
|
|
2013-02-09 00:21:45 -06:00
|
|
|
// re-balance, if necessary
|
|
|
|
if left_level < save.level - 1 || right_level < save.level - 1 {
|
|
|
|
save.level -= 1;
|
2013-01-14 09:27:26 -06:00
|
|
|
|
2013-02-09 00:21:45 -06:00
|
|
|
if right_level > save.level {
|
2013-06-10 16:50:12 -05:00
|
|
|
for save.right.mut_iter().advance |x| { x.level = save.level }
|
2013-02-09 00:21:45 -06:00
|
|
|
}
|
2013-01-14 09:27:26 -06:00
|
|
|
|
2013-02-09 00:21:45 -06:00
|
|
|
skew(save);
|
2013-01-14 09:27:26 -06:00
|
|
|
|
2013-06-10 16:50:12 -05:00
|
|
|
for save.right.mut_iter().advance |right| {
|
2013-03-10 18:59:41 -05:00
|
|
|
skew(right);
|
2013-06-10 16:50:12 -05:00
|
|
|
for right.right.mut_iter().advance |x| { skew(x) }
|
2013-02-09 00:21:45 -06:00
|
|
|
}
|
2013-02-10 19:37:21 -06:00
|
|
|
|
2013-02-09 00:21:45 -06:00
|
|
|
split(save);
|
2013-06-10 16:50:12 -05:00
|
|
|
for save.right.mut_iter().advance |x| { split(x) }
|
2013-02-10 19:37:21 -06:00
|
|
|
}
|
2013-01-14 09:27:26 -06:00
|
|
|
|
2013-05-04 08:54:58 -05:00
|
|
|
return ret;
|
2013-01-14 09:27:26 -06:00
|
|
|
}
|
2013-02-10 21:03:26 -06:00
|
|
|
}
|
2013-01-14 09:27:26 -06:00
|
|
|
}
|
2013-05-04 08:54:58 -05:00
|
|
|
return match replace(node, None) {
|
|
|
|
Some(~TreeNode{value, _}) => Some(value), None => fail!()
|
|
|
|
};
|
2013-01-14 09:27:26 -06:00
|
|
|
}
|
2013-01-08 21:37:25 -06:00
|
|
|
|
2013-01-14 09:27:26 -06:00
|
|
|
#[cfg(test)]
|
|
|
|
mod test_treemap {
|
2013-05-21 19:24:31 -05:00
|
|
|
|
2013-01-14 09:27:26 -06:00
|
|
|
use super::*;
|
2013-05-24 21:35:29 -05:00
|
|
|
|
2013-06-28 17:32:26 -05:00
|
|
|
use std::rand::RngUtil;
|
|
|
|
use std::rand;
|
2012-12-27 20:24:18 -06:00
|
|
|
|
2012-01-17 21:05:07 -06:00
|
|
|
#[test]
|
2013-01-14 09:27:26 -06:00
|
|
|
fn find_empty() {
|
2013-03-28 20:39:09 -05:00
|
|
|
let m = TreeMap::new::<int, int>(); assert!(m.find(&5) == None);
|
2013-01-14 09:27:26 -06:00
|
|
|
}
|
2012-01-17 21:05:07 -06:00
|
|
|
|
|
|
|
#[test]
|
2013-01-14 09:27:26 -06:00
|
|
|
fn find_not_found() {
|
|
|
|
let mut m = TreeMap::new();
|
2013-03-28 20:39:09 -05:00
|
|
|
assert!(m.insert(1, 2));
|
|
|
|
assert!(m.insert(5, 3));
|
|
|
|
assert!(m.insert(9, 3));
|
2013-05-18 21:02:45 -05:00
|
|
|
assert_eq!(m.find(&2), None);
|
2013-01-14 09:27:26 -06:00
|
|
|
}
|
2012-01-17 21:05:07 -06:00
|
|
|
|
2013-03-24 15:55:51 -05:00
|
|
|
#[test]
|
|
|
|
fn test_find_mut() {
|
|
|
|
let mut m = TreeMap::new();
|
2013-03-28 20:39:09 -05:00
|
|
|
assert!(m.insert(1, 12));
|
|
|
|
assert!(m.insert(2, 8));
|
|
|
|
assert!(m.insert(5, 14));
|
2013-03-24 15:55:51 -05:00
|
|
|
let new = 100;
|
|
|
|
match m.find_mut(&5) {
|
|
|
|
None => fail!(), Some(x) => *x = new
|
|
|
|
}
|
|
|
|
assert_eq!(m.find(&5), Some(&new));
|
|
|
|
}
|
|
|
|
|
2012-01-17 21:05:07 -06:00
|
|
|
#[test]
|
2013-01-14 09:27:26 -06:00
|
|
|
fn insert_replace() {
|
|
|
|
let mut m = TreeMap::new();
|
2013-03-28 20:39:09 -05:00
|
|
|
assert!(m.insert(5, 2));
|
|
|
|
assert!(m.insert(2, 9));
|
|
|
|
assert!(!m.insert(2, 11));
|
2013-05-18 21:02:45 -05:00
|
|
|
assert_eq!(m.find(&2).unwrap(), &11);
|
2013-01-14 09:27:26 -06:00
|
|
|
}
|
2012-01-17 21:05:07 -06:00
|
|
|
|
2013-01-21 16:25:57 -06:00
|
|
|
#[test]
|
|
|
|
fn test_clear() {
|
|
|
|
let mut m = TreeMap::new();
|
|
|
|
m.clear();
|
2013-03-28 20:39:09 -05:00
|
|
|
assert!(m.insert(5, 11));
|
|
|
|
assert!(m.insert(12, -3));
|
|
|
|
assert!(m.insert(19, 2));
|
2013-01-21 16:25:57 -06:00
|
|
|
m.clear();
|
2013-03-28 20:39:09 -05:00
|
|
|
assert!(m.find(&5).is_none());
|
|
|
|
assert!(m.find(&12).is_none());
|
|
|
|
assert!(m.find(&19).is_none());
|
|
|
|
assert!(m.is_empty());
|
2013-01-21 16:25:57 -06:00
|
|
|
}
|
|
|
|
|
2012-01-17 21:05:07 -06:00
|
|
|
#[test]
|
2013-01-14 09:27:26 -06:00
|
|
|
fn u8_map() {
|
|
|
|
let mut m = TreeMap::new();
|
|
|
|
|
2013-06-10 22:10:37 -05:00
|
|
|
let k1 = "foo".as_bytes();
|
|
|
|
let k2 = "bar".as_bytes();
|
|
|
|
let v1 = "baz".as_bytes();
|
|
|
|
let v2 = "foobar".as_bytes();
|
2013-01-14 09:27:26 -06:00
|
|
|
|
2013-02-06 01:10:53 -06:00
|
|
|
m.insert(copy k1, copy v1);
|
|
|
|
m.insert(copy k2, copy v2);
|
2013-01-14 09:27:26 -06:00
|
|
|
|
2013-05-18 21:02:45 -05:00
|
|
|
assert_eq!(m.find(&k2), Some(&v2));
|
|
|
|
assert_eq!(m.find(&k1), Some(&v1));
|
2013-01-14 09:27:26 -06:00
|
|
|
}
|
|
|
|
|
2013-03-02 12:27:29 -06:00
|
|
|
fn check_equal<K: Eq + TotalOrd, V: Eq>(ctrl: &[(K, V)],
|
|
|
|
map: &TreeMap<K, V>) {
|
2013-05-18 21:02:45 -05:00
|
|
|
assert_eq!(ctrl.is_empty(), map.is_empty());
|
2013-06-21 07:29:53 -05:00
|
|
|
for ctrl.iter().advance |x| {
|
2013-06-20 14:15:16 -05:00
|
|
|
let &(ref k, ref v) = x;
|
|
|
|
assert!(map.find(k).unwrap() == v)
|
2013-01-14 09:27:26 -06:00
|
|
|
}
|
2013-06-26 06:49:06 -05:00
|
|
|
for map.iter().advance |(map_k, map_v)| {
|
2013-01-14 09:27:26 -06:00
|
|
|
let mut found = false;
|
2013-06-21 07:29:53 -05:00
|
|
|
for ctrl.iter().advance |x| {
|
2013-06-20 14:15:16 -05:00
|
|
|
let &(ref ctrl_k, ref ctrl_v) = x;
|
|
|
|
if *map_k == *ctrl_k {
|
|
|
|
assert!(*map_v == *ctrl_v);
|
2013-01-14 09:27:26 -06:00
|
|
|
found = true;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
2013-03-28 20:39:09 -05:00
|
|
|
assert!(found);
|
2013-01-14 09:27:26 -06:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2013-03-02 12:27:29 -06:00
|
|
|
fn check_left<K: TotalOrd, V>(node: &Option<~TreeNode<K, V>>,
|
|
|
|
parent: &~TreeNode<K, V>) {
|
2013-01-14 09:27:26 -06:00
|
|
|
match *node {
|
|
|
|
Some(ref r) => {
|
2013-05-18 21:02:45 -05:00
|
|
|
assert_eq!(r.key.cmp(&parent.key), Less);
|
2013-03-28 20:39:09 -05:00
|
|
|
assert!(r.level == parent.level - 1); // left is black
|
2013-01-14 09:27:26 -06:00
|
|
|
check_left(&r.left, r);
|
|
|
|
check_right(&r.right, r, false);
|
|
|
|
}
|
2013-03-28 20:39:09 -05:00
|
|
|
None => assert!(parent.level == 1) // parent is leaf
|
2013-01-14 09:27:26 -06:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2013-03-02 12:27:29 -06:00
|
|
|
fn check_right<K: TotalOrd, V>(node: &Option<~TreeNode<K, V>>,
|
|
|
|
parent: &~TreeNode<K, V>,
|
|
|
|
parent_red: bool) {
|
2013-01-14 09:27:26 -06:00
|
|
|
match *node {
|
|
|
|
Some(ref r) => {
|
2013-05-18 21:02:45 -05:00
|
|
|
assert_eq!(r.key.cmp(&parent.key), Greater);
|
2013-01-14 09:27:26 -06:00
|
|
|
let red = r.level == parent.level;
|
2013-03-28 20:39:09 -05:00
|
|
|
if parent_red { assert!(!red) } // no dual horizontal links
|
2013-03-06 21:09:17 -06:00
|
|
|
// Right red or black
|
2013-03-28 20:39:09 -05:00
|
|
|
assert!(red || r.level == parent.level - 1);
|
2013-01-14 09:27:26 -06:00
|
|
|
check_left(&r.left, r);
|
|
|
|
check_right(&r.right, r, red);
|
|
|
|
}
|
2013-03-28 20:39:09 -05:00
|
|
|
None => assert!(parent.level == 1) // parent is leaf
|
2013-01-14 09:27:26 -06:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2013-03-02 12:27:29 -06:00
|
|
|
fn check_structure<K: TotalOrd, V>(map: &TreeMap<K, V>) {
|
2013-01-14 09:27:26 -06:00
|
|
|
match map.root {
|
|
|
|
Some(ref r) => {
|
|
|
|
check_left(&r.left, r);
|
|
|
|
check_right(&r.right, r, false);
|
|
|
|
}
|
|
|
|
None => ()
|
|
|
|
}
|
2012-01-17 21:05:07 -06:00
|
|
|
}
|
|
|
|
|
|
|
|
#[test]
|
2013-01-14 09:27:26 -06:00
|
|
|
fn test_rand_int() {
|
|
|
|
let mut map = TreeMap::new::<int, int>();
|
|
|
|
let mut ctrl = ~[];
|
|
|
|
|
|
|
|
check_equal(ctrl, &map);
|
2013-03-28 20:39:09 -05:00
|
|
|
assert!(map.find(&5).is_none());
|
2013-01-14 09:27:26 -06:00
|
|
|
|
2013-05-07 19:57:58 -05:00
|
|
|
let mut rng = rand::IsaacRng::new_seeded(&[42]);
|
2013-01-14 09:27:26 -06:00
|
|
|
|
|
|
|
for 3.times {
|
|
|
|
for 90.times {
|
2013-04-24 07:29:19 -05:00
|
|
|
let k = rng.gen();
|
|
|
|
let v = rng.gen();
|
2013-07-04 21:13:26 -05:00
|
|
|
if !ctrl.iter().any(|x| x == &(k, v)) {
|
2013-03-28 20:39:09 -05:00
|
|
|
assert!(map.insert(k, v));
|
2013-01-14 09:27:26 -06:00
|
|
|
ctrl.push((k, v));
|
|
|
|
check_structure(&map);
|
|
|
|
check_equal(ctrl, &map);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
for 30.times {
|
|
|
|
let r = rng.gen_uint_range(0, ctrl.len());
|
2013-06-27 07:59:52 -05:00
|
|
|
let (key, _) = ctrl.remove(r);
|
2013-03-28 20:39:09 -05:00
|
|
|
assert!(map.remove(&key));
|
2013-01-14 09:27:26 -06:00
|
|
|
check_structure(&map);
|
|
|
|
check_equal(ctrl, &map);
|
|
|
|
}
|
|
|
|
}
|
2012-01-17 21:05:07 -06:00
|
|
|
}
|
|
|
|
|
|
|
|
#[test]
|
2013-01-14 09:27:26 -06:00
|
|
|
fn test_len() {
|
|
|
|
let mut m = TreeMap::new();
|
2013-03-28 20:39:09 -05:00
|
|
|
assert!(m.insert(3, 6));
|
2013-05-18 21:02:45 -05:00
|
|
|
assert_eq!(m.len(), 1);
|
2013-03-28 20:39:09 -05:00
|
|
|
assert!(m.insert(0, 0));
|
2013-05-18 21:02:45 -05:00
|
|
|
assert_eq!(m.len(), 2);
|
2013-03-28 20:39:09 -05:00
|
|
|
assert!(m.insert(4, 8));
|
2013-05-18 21:02:45 -05:00
|
|
|
assert_eq!(m.len(), 3);
|
2013-03-28 20:39:09 -05:00
|
|
|
assert!(m.remove(&3));
|
2013-05-18 21:02:45 -05:00
|
|
|
assert_eq!(m.len(), 2);
|
2013-03-28 20:39:09 -05:00
|
|
|
assert!(!m.remove(&5));
|
2013-05-18 21:02:45 -05:00
|
|
|
assert_eq!(m.len(), 2);
|
2013-03-28 20:39:09 -05:00
|
|
|
assert!(m.insert(2, 4));
|
2013-05-18 21:02:45 -05:00
|
|
|
assert_eq!(m.len(), 3);
|
2013-03-28 20:39:09 -05:00
|
|
|
assert!(m.insert(1, 2));
|
2013-05-18 21:02:45 -05:00
|
|
|
assert_eq!(m.len(), 4);
|
2013-01-14 09:27:26 -06:00
|
|
|
}
|
|
|
|
|
|
|
|
#[test]
|
2013-06-26 06:49:06 -05:00
|
|
|
fn test_iterator() {
|
2013-01-14 09:27:26 -06:00
|
|
|
let mut m = TreeMap::new();
|
|
|
|
|
2013-03-28 20:39:09 -05:00
|
|
|
assert!(m.insert(3, 6));
|
|
|
|
assert!(m.insert(0, 0));
|
|
|
|
assert!(m.insert(4, 8));
|
|
|
|
assert!(m.insert(2, 4));
|
|
|
|
assert!(m.insert(1, 2));
|
2013-01-14 09:27:26 -06:00
|
|
|
|
|
|
|
let mut n = 0;
|
2013-06-26 06:49:06 -05:00
|
|
|
for m.iter().advance |(k, v)| {
|
2013-05-18 21:02:45 -05:00
|
|
|
assert_eq!(*k, n);
|
|
|
|
assert_eq!(*v, n * 2);
|
2013-01-14 09:27:26 -06:00
|
|
|
n += 1;
|
|
|
|
}
|
2012-01-17 21:05:07 -06:00
|
|
|
}
|
|
|
|
|
|
|
|
#[test]
|
2013-01-14 09:27:26 -06:00
|
|
|
fn test_each_reverse() {
|
|
|
|
let mut m = TreeMap::new();
|
|
|
|
|
2013-03-28 20:39:09 -05:00
|
|
|
assert!(m.insert(3, 6));
|
|
|
|
assert!(m.insert(0, 0));
|
|
|
|
assert!(m.insert(4, 8));
|
|
|
|
assert!(m.insert(2, 4));
|
|
|
|
assert!(m.insert(1, 2));
|
2012-01-17 21:05:07 -06:00
|
|
|
|
2013-01-14 09:27:26 -06:00
|
|
|
let mut n = 4;
|
2013-04-06 10:22:36 -05:00
|
|
|
for m.each_reverse |k, v| {
|
2013-05-18 21:02:45 -05:00
|
|
|
assert_eq!(*k, n);
|
|
|
|
assert_eq!(*v, n * 2);
|
2013-01-14 09:27:26 -06:00
|
|
|
n -= 1;
|
2012-01-17 21:05:07 -06:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2012-10-04 17:18:02 -05:00
|
|
|
#[test]
|
2013-01-14 09:27:26 -06:00
|
|
|
fn test_eq() {
|
|
|
|
let mut a = TreeMap::new();
|
|
|
|
let mut b = TreeMap::new();
|
2012-10-04 17:18:02 -05:00
|
|
|
|
2013-03-28 20:39:09 -05:00
|
|
|
assert!(a == b);
|
|
|
|
assert!(a.insert(0, 5));
|
|
|
|
assert!(a != b);
|
|
|
|
assert!(b.insert(0, 4));
|
|
|
|
assert!(a != b);
|
|
|
|
assert!(a.insert(5, 19));
|
|
|
|
assert!(a != b);
|
|
|
|
assert!(!b.insert(0, 5));
|
|
|
|
assert!(a != b);
|
|
|
|
assert!(b.insert(5, 19));
|
|
|
|
assert!(a == b);
|
2013-01-14 09:27:26 -06:00
|
|
|
}
|
2013-01-26 11:40:41 -06:00
|
|
|
|
|
|
|
#[test]
|
|
|
|
fn test_lt() {
|
|
|
|
let mut a = TreeMap::new();
|
|
|
|
let mut b = TreeMap::new();
|
|
|
|
|
2013-03-28 20:39:09 -05:00
|
|
|
assert!(!(a < b) && !(b < a));
|
|
|
|
assert!(b.insert(0, 5));
|
|
|
|
assert!(a < b);
|
|
|
|
assert!(a.insert(0, 7));
|
2013-07-01 10:51:34 -05:00
|
|
|
assert!(!(a < b) && b < a);
|
2013-03-28 20:39:09 -05:00
|
|
|
assert!(b.insert(-2, 0));
|
|
|
|
assert!(b < a);
|
|
|
|
assert!(a.insert(-5, 2));
|
|
|
|
assert!(a < b);
|
|
|
|
assert!(a.insert(6, 2));
|
|
|
|
assert!(a < b && !(b < a));
|
2013-01-26 11:40:41 -06:00
|
|
|
}
|
|
|
|
|
|
|
|
#[test]
|
|
|
|
fn test_ord() {
|
|
|
|
let mut a = TreeMap::new();
|
|
|
|
let mut b = TreeMap::new();
|
|
|
|
|
2013-03-28 20:39:09 -05:00
|
|
|
assert!(a <= b && a >= b);
|
|
|
|
assert!(a.insert(1, 1));
|
|
|
|
assert!(a > b && a >= b);
|
|
|
|
assert!(b < a && b <= a);
|
|
|
|
assert!(b.insert(2, 2));
|
|
|
|
assert!(b > a && b >= a);
|
|
|
|
assert!(a < b && a <= b);
|
2013-01-26 11:40:41 -06:00
|
|
|
}
|
2013-01-14 19:41:11 -06:00
|
|
|
|
|
|
|
#[test]
|
|
|
|
fn test_lazy_iterator() {
|
|
|
|
let mut m = TreeMap::new();
|
|
|
|
let (x1, y1) = (2, 5);
|
|
|
|
let (x2, y2) = (9, 12);
|
|
|
|
let (x3, y3) = (20, -3);
|
|
|
|
let (x4, y4) = (29, 5);
|
|
|
|
let (x5, y5) = (103, 3);
|
|
|
|
|
2013-03-28 20:39:09 -05:00
|
|
|
assert!(m.insert(x1, y1));
|
|
|
|
assert!(m.insert(x2, y2));
|
|
|
|
assert!(m.insert(x3, y3));
|
|
|
|
assert!(m.insert(x4, y4));
|
|
|
|
assert!(m.insert(x5, y5));
|
2013-01-14 19:41:11 -06:00
|
|
|
|
|
|
|
let m = m;
|
2013-02-26 13:15:08 -06:00
|
|
|
let mut a = m.iter();
|
2013-01-14 19:41:11 -06:00
|
|
|
|
2013-05-18 21:02:45 -05:00
|
|
|
assert_eq!(a.next().unwrap(), (&x1, &y1));
|
|
|
|
assert_eq!(a.next().unwrap(), (&x2, &y2));
|
|
|
|
assert_eq!(a.next().unwrap(), (&x3, &y3));
|
|
|
|
assert_eq!(a.next().unwrap(), (&x4, &y4));
|
|
|
|
assert_eq!(a.next().unwrap(), (&x5, &y5));
|
2013-02-26 13:15:08 -06:00
|
|
|
|
2013-04-09 09:54:32 -05:00
|
|
|
assert!(a.next().is_none());
|
2013-02-26 13:15:08 -06:00
|
|
|
|
|
|
|
let mut b = m.iter();
|
|
|
|
|
|
|
|
let expected = [(&x1, &y1), (&x2, &y2), (&x3, &y3), (&x4, &y4),
|
|
|
|
(&x5, &y5)];
|
|
|
|
let mut i = 0;
|
|
|
|
|
2013-04-15 09:30:16 -05:00
|
|
|
for b.advance |x| {
|
2013-05-18 21:02:45 -05:00
|
|
|
assert_eq!(expected[i], x);
|
2013-02-26 13:15:08 -06:00
|
|
|
i += 1;
|
|
|
|
|
|
|
|
if i == 2 {
|
|
|
|
break
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2013-04-15 09:30:16 -05:00
|
|
|
for b.advance |x| {
|
2013-05-18 21:02:45 -05:00
|
|
|
assert_eq!(expected[i], x);
|
2013-02-26 13:15:08 -06:00
|
|
|
i += 1;
|
|
|
|
}
|
2013-01-14 19:41:11 -06:00
|
|
|
}
|
2013-01-14 09:27:26 -06:00
|
|
|
}
|
2012-10-04 17:18:02 -05:00
|
|
|
|
2013-01-14 09:27:26 -06:00
|
|
|
#[cfg(test)]
|
|
|
|
mod test_set {
|
2013-05-24 21:35:29 -05:00
|
|
|
|
2013-01-14 09:27:26 -06:00
|
|
|
use super::*;
|
2012-10-04 17:18:02 -05:00
|
|
|
|
2013-01-21 16:25:57 -06:00
|
|
|
#[test]
|
|
|
|
fn test_clear() {
|
|
|
|
let mut s = TreeSet::new();
|
|
|
|
s.clear();
|
2013-03-28 20:39:09 -05:00
|
|
|
assert!(s.insert(5));
|
|
|
|
assert!(s.insert(12));
|
|
|
|
assert!(s.insert(19));
|
2013-01-21 16:25:57 -06:00
|
|
|
s.clear();
|
2013-03-28 20:39:09 -05:00
|
|
|
assert!(!s.contains(&5));
|
|
|
|
assert!(!s.contains(&12));
|
|
|
|
assert!(!s.contains(&19));
|
|
|
|
assert!(s.is_empty());
|
2013-01-21 16:25:57 -06:00
|
|
|
}
|
|
|
|
|
2013-01-14 09:27:26 -06:00
|
|
|
#[test]
|
|
|
|
fn test_disjoint() {
|
|
|
|
let mut xs = TreeSet::new();
|
|
|
|
let mut ys = TreeSet::new();
|
2013-03-28 20:39:09 -05:00
|
|
|
assert!(xs.is_disjoint(&ys));
|
|
|
|
assert!(ys.is_disjoint(&xs));
|
|
|
|
assert!(xs.insert(5));
|
|
|
|
assert!(ys.insert(11));
|
|
|
|
assert!(xs.is_disjoint(&ys));
|
|
|
|
assert!(ys.is_disjoint(&xs));
|
|
|
|
assert!(xs.insert(7));
|
|
|
|
assert!(xs.insert(19));
|
|
|
|
assert!(xs.insert(4));
|
|
|
|
assert!(ys.insert(2));
|
|
|
|
assert!(ys.insert(-11));
|
|
|
|
assert!(xs.is_disjoint(&ys));
|
|
|
|
assert!(ys.is_disjoint(&xs));
|
|
|
|
assert!(ys.insert(7));
|
|
|
|
assert!(!xs.is_disjoint(&ys));
|
|
|
|
assert!(!ys.is_disjoint(&xs));
|
2012-10-04 17:18:02 -05:00
|
|
|
}
|
|
|
|
|
2012-01-17 21:05:07 -06:00
|
|
|
#[test]
|
2013-01-14 09:27:26 -06:00
|
|
|
fn test_subset_and_superset() {
|
|
|
|
let mut a = TreeSet::new();
|
2013-03-28 20:39:09 -05:00
|
|
|
assert!(a.insert(0));
|
|
|
|
assert!(a.insert(5));
|
|
|
|
assert!(a.insert(11));
|
|
|
|
assert!(a.insert(7));
|
2012-01-17 21:05:07 -06:00
|
|
|
|
2013-01-14 09:27:26 -06:00
|
|
|
let mut b = TreeSet::new();
|
2013-03-28 20:39:09 -05:00
|
|
|
assert!(b.insert(0));
|
|
|
|
assert!(b.insert(7));
|
|
|
|
assert!(b.insert(19));
|
|
|
|
assert!(b.insert(250));
|
|
|
|
assert!(b.insert(11));
|
|
|
|
assert!(b.insert(200));
|
|
|
|
|
|
|
|
assert!(!a.is_subset(&b));
|
|
|
|
assert!(!a.is_superset(&b));
|
|
|
|
assert!(!b.is_subset(&a));
|
|
|
|
assert!(!b.is_superset(&a));
|
|
|
|
|
|
|
|
assert!(b.insert(5));
|
|
|
|
|
|
|
|
assert!(a.is_subset(&b));
|
|
|
|
assert!(!a.is_superset(&b));
|
|
|
|
assert!(!b.is_subset(&a));
|
|
|
|
assert!(b.is_superset(&a));
|
2013-01-14 09:27:26 -06:00
|
|
|
}
|
|
|
|
|
|
|
|
#[test]
|
2013-06-26 06:49:06 -05:00
|
|
|
fn test_iterator() {
|
2013-01-14 09:27:26 -06:00
|
|
|
let mut m = TreeSet::new();
|
|
|
|
|
2013-03-28 20:39:09 -05:00
|
|
|
assert!(m.insert(3));
|
|
|
|
assert!(m.insert(0));
|
|
|
|
assert!(m.insert(4));
|
|
|
|
assert!(m.insert(2));
|
|
|
|
assert!(m.insert(1));
|
2013-01-14 09:27:26 -06:00
|
|
|
|
|
|
|
let mut n = 0;
|
2013-06-26 06:49:06 -05:00
|
|
|
for m.iter().advance |x| {
|
2013-06-10 16:50:12 -05:00
|
|
|
println(fmt!("%?", x));
|
2013-05-18 21:02:45 -05:00
|
|
|
assert_eq!(*x, n);
|
2013-01-14 09:27:26 -06:00
|
|
|
n += 1
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
#[test]
|
|
|
|
fn test_each_reverse() {
|
|
|
|
let mut m = TreeSet::new();
|
|
|
|
|
2013-03-28 20:39:09 -05:00
|
|
|
assert!(m.insert(3));
|
|
|
|
assert!(m.insert(0));
|
|
|
|
assert!(m.insert(4));
|
|
|
|
assert!(m.insert(2));
|
|
|
|
assert!(m.insert(1));
|
2013-01-14 09:27:26 -06:00
|
|
|
|
|
|
|
let mut n = 4;
|
|
|
|
for m.each_reverse |x| {
|
2013-05-18 21:02:45 -05:00
|
|
|
assert_eq!(*x, n);
|
2013-01-14 09:27:26 -06:00
|
|
|
n -= 1
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2013-03-10 19:38:12 -05:00
|
|
|
fn check(a: &[int], b: &[int], expected: &[int],
|
2013-05-03 15:33:33 -05:00
|
|
|
f: &fn(&TreeSet<int>, &TreeSet<int>, f: &fn(&int) -> bool) -> bool) {
|
2013-03-10 19:38:12 -05:00
|
|
|
let mut set_a = TreeSet::new();
|
|
|
|
let mut set_b = TreeSet::new();
|
2013-01-14 09:27:26 -06:00
|
|
|
|
2013-06-21 07:29:53 -05:00
|
|
|
for a.iter().advance |x| { assert!(set_a.insert(*x)) }
|
|
|
|
for b.iter().advance |y| { assert!(set_b.insert(*y)) }
|
2013-01-14 09:27:26 -06:00
|
|
|
|
|
|
|
let mut i = 0;
|
2013-03-10 19:38:12 -05:00
|
|
|
for f(&set_a, &set_b) |x| {
|
2013-05-18 21:02:45 -05:00
|
|
|
assert_eq!(*x, expected[i]);
|
2013-03-10 19:38:12 -05:00
|
|
|
i += 1;
|
2013-01-14 09:27:26 -06:00
|
|
|
}
|
2013-05-18 21:02:45 -05:00
|
|
|
assert_eq!(i, expected.len());
|
2012-01-17 21:05:07 -06:00
|
|
|
}
|
2013-01-15 07:55:13 -06:00
|
|
|
|
|
|
|
#[test]
|
2013-03-10 19:38:12 -05:00
|
|
|
fn test_intersection() {
|
|
|
|
fn check_intersection(a: &[int], b: &[int], expected: &[int]) {
|
|
|
|
check(a, b, expected, |x, y, z| x.intersection(y, z))
|
|
|
|
}
|
2013-01-15 07:55:13 -06:00
|
|
|
|
2013-03-10 19:41:50 -05:00
|
|
|
check_intersection([], [], []);
|
|
|
|
check_intersection([1, 2, 3], [], []);
|
|
|
|
check_intersection([], [1, 2, 3], []);
|
|
|
|
check_intersection([2], [1, 2, 3], [2]);
|
|
|
|
check_intersection([1, 2, 3], [2], [2]);
|
2013-03-10 19:38:12 -05:00
|
|
|
check_intersection([11, 1, 3, 77, 103, 5, -5],
|
|
|
|
[2, 11, 77, -9, -42, 5, 3],
|
|
|
|
[3, 5, 11, 77]);
|
|
|
|
}
|
2013-01-15 07:55:13 -06:00
|
|
|
|
2013-03-10 19:38:12 -05:00
|
|
|
#[test]
|
|
|
|
fn test_difference() {
|
|
|
|
fn check_difference(a: &[int], b: &[int], expected: &[int]) {
|
|
|
|
check(a, b, expected, |x, y, z| x.difference(y, z))
|
2013-01-15 09:21:45 -06:00
|
|
|
}
|
2013-03-10 19:25:09 -05:00
|
|
|
|
|
|
|
check_difference([], [], []);
|
|
|
|
check_difference([1, 12], [], [1, 12]);
|
|
|
|
check_difference([], [1, 2, 3, 9], []);
|
|
|
|
check_difference([1, 3, 5, 9, 11],
|
|
|
|
[3, 9],
|
|
|
|
[1, 5, 11]);
|
|
|
|
check_difference([-5, 11, 22, 33, 40, 42],
|
|
|
|
[-12, -5, 14, 23, 34, 38, 39, 50],
|
|
|
|
[11, 22, 33, 40, 42]);
|
2013-01-15 09:21:45 -06:00
|
|
|
}
|
|
|
|
|
2013-01-15 10:41:47 -06:00
|
|
|
#[test]
|
|
|
|
fn test_symmetric_difference() {
|
2013-03-10 19:38:12 -05:00
|
|
|
fn check_symmetric_difference(a: &[int], b: &[int],
|
|
|
|
expected: &[int]) {
|
|
|
|
check(a, b, expected, |x, y, z| x.symmetric_difference(y, z))
|
2013-01-15 10:41:47 -06:00
|
|
|
}
|
2013-03-10 19:38:12 -05:00
|
|
|
|
2013-03-10 19:41:50 -05:00
|
|
|
check_symmetric_difference([], [], []);
|
|
|
|
check_symmetric_difference([1, 2, 3], [2], [1, 3]);
|
|
|
|
check_symmetric_difference([2], [1, 2, 3], [1, 3]);
|
2013-03-10 19:38:12 -05:00
|
|
|
check_symmetric_difference([1, 3, 5, 9, 11],
|
|
|
|
[-2, 3, 9, 14, 22],
|
|
|
|
[-2, 1, 5, 11, 14, 22]);
|
2013-01-15 10:41:47 -06:00
|
|
|
}
|
|
|
|
|
2013-01-15 09:21:45 -06:00
|
|
|
#[test]
|
|
|
|
fn test_union() {
|
2013-03-10 19:38:12 -05:00
|
|
|
fn check_union(a: &[int], b: &[int],
|
|
|
|
expected: &[int]) {
|
|
|
|
check(a, b, expected, |x, y, z| x.union(y, z))
|
2013-01-15 07:55:13 -06:00
|
|
|
}
|
2013-03-10 19:38:12 -05:00
|
|
|
|
2013-03-10 19:41:50 -05:00
|
|
|
check_union([], [], []);
|
|
|
|
check_union([1, 2, 3], [2], [1, 2, 3]);
|
2013-03-10 19:44:18 -05:00
|
|
|
check_union([2], [1, 2, 3], [1, 2, 3]);
|
2013-03-10 19:38:12 -05:00
|
|
|
check_union([1, 3, 5, 9, 11, 16, 19, 24],
|
|
|
|
[-2, 1, 5, 9, 13, 19],
|
|
|
|
[-2, 1, 3, 5, 9, 11, 13, 16, 19, 24]);
|
2013-01-15 07:55:13 -06:00
|
|
|
}
|
2013-04-09 09:54:32 -05:00
|
|
|
|
|
|
|
#[test]
|
|
|
|
fn test_zip() {
|
|
|
|
let mut x = TreeSet::new();
|
|
|
|
x.insert(5u);
|
|
|
|
x.insert(12u);
|
|
|
|
x.insert(11u);
|
|
|
|
|
|
|
|
let mut y = TreeSet::new();
|
|
|
|
y.insert("foo");
|
|
|
|
y.insert("bar");
|
|
|
|
|
|
|
|
let x = x;
|
|
|
|
let y = y;
|
2013-04-15 09:30:16 -05:00
|
|
|
let mut z = x.iter().zip(y.iter());
|
2013-04-09 09:54:32 -05:00
|
|
|
|
|
|
|
// FIXME: #5801: this needs a type hint to compile...
|
|
|
|
let result: Option<(&uint, & &'static str)> = z.next();
|
2013-05-18 21:02:45 -05:00
|
|
|
assert_eq!(result.unwrap(), (&5u, & &"bar"));
|
2013-04-09 09:54:32 -05:00
|
|
|
|
|
|
|
let result: Option<(&uint, & &'static str)> = z.next();
|
2013-05-18 21:02:45 -05:00
|
|
|
assert_eq!(result.unwrap(), (&11u, & &"foo"));
|
2013-04-09 09:54:32 -05:00
|
|
|
|
|
|
|
let result: Option<(&uint, & &'static str)> = z.next();
|
|
|
|
assert!(result.is_none());
|
|
|
|
}
|
2013-05-04 08:54:58 -05:00
|
|
|
|
|
|
|
#[test]
|
|
|
|
fn test_swap() {
|
|
|
|
let mut m = TreeMap::new();
|
2013-05-18 21:02:45 -05:00
|
|
|
assert_eq!(m.swap(1, 2), None);
|
|
|
|
assert_eq!(m.swap(1, 3), Some(2));
|
|
|
|
assert_eq!(m.swap(1, 4), Some(3));
|
2013-05-04 08:54:58 -05:00
|
|
|
}
|
|
|
|
|
|
|
|
#[test]
|
|
|
|
fn test_pop() {
|
|
|
|
let mut m = TreeMap::new();
|
|
|
|
m.insert(1, 2);
|
2013-05-18 21:02:45 -05:00
|
|
|
assert_eq!(m.pop(&1), Some(2));
|
|
|
|
assert_eq!(m.pop(&1), None);
|
2013-05-04 08:54:58 -05:00
|
|
|
}
|
2012-05-23 19:18:31 -05:00
|
|
|
}
|