rust/src/libstd/treemap.rs

1198 lines
33 KiB
Rust
Raw Normal View History

2013-01-14 09:27:26 -06:00
// Copyright 2013 The Rust Project Developers. See the COPYRIGHT
// 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
//! `Ord`, and that the `lt` method provides a total ordering.
2013-01-21 20:59:19 -06:00
use core::container::{Container, Mutable, Map, Set};
2012-09-04 13:23:53 -05:00
use core::cmp::{Eq, Ord};
use core::iter::{BaseIter, ReverseIter};
use core::option::{Option, Some, None};
use core::prelude::*;
2013-01-14 09:27:26 -06:00
// This is implemented as an AA tree, which is a simplified variation of
// a red-black tree where where red (horizontal) nodes can only be added
// 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
// Future improvements:
2013-01-15 08:50:51 -06:00
// range search - O(log n) retrieval of an iterator from some key
// (possibly) implement the overloads Python does for sets:
2013-01-14 09:27:26 -06:00
// * intersection: &
// * difference: -
// * symmetric difference: ^
// * 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
pub struct TreeMap<K, V> {
2013-01-14 09:27:26 -06:00
priv root: Option<~TreeNode<K, V>>,
priv length: uint
}
impl<K:Eq + Ord,V:Eq> Eq for TreeMap<K, V> {
2013-01-14 09:27:26 -06:00
pure fn eq(&self, other: &TreeMap<K, V>) -> bool {
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();
for self.len().times {
unsafe { // unsafe as a purity workaround
if map_next(&mut x).unwrap() !=
map_next(&mut y).unwrap() {
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-01-21 16:12:35 -06:00
pure fn ne(&self, other: &TreeMap<K, V>) -> bool { !self.eq(other) }
}
// Lexicographical comparison
pure fn lt<K:Ord,V>(a: &TreeMap<K, V>, b: &TreeMap<K, V>) -> bool {
let mut x = a.iter();
let mut y = b.iter();
let (a_len, b_len) = (a.len(), b.len());
for uint::min(a_len, b_len).times {
unsafe { // purity workaround
let (key_a,_) = map_next(&mut x).unwrap();
let (key_b,_) = map_next(&mut y).unwrap();
if *key_a < *key_b { return true; }
if *key_a > *key_b { return false; }
}
};
return a_len < b_len;
}
impl<K:Ord,V> Ord for TreeMap<K, V> {
#[inline(always)]
pure fn lt(&self, other: &TreeMap<K, V>) -> bool {
lt(self, other)
}
#[inline(always)]
pure fn le(&self, other: &TreeMap<K, V>) -> bool {
!lt(other, self)
}
#[inline(always)]
pure fn ge(&self, other: &TreeMap<K, V>) -> bool {
!lt(self, other)
}
#[inline(always)]
pure fn gt(&self, other: &TreeMap<K, V>) -> bool {
lt(other, self)
}
}
impl<K:Ord,V> BaseIter<(&K, &V)> for TreeMap<K, V> {
2013-02-07 17:05:27 -06:00
/// Visit all key-value pairs in order
pure fn each(&self, f: fn(&(&self/K, &self/V)) -> bool) {
each(&self.root, f)
}
pure fn size_hint(&self) -> Option<uint> { Some(self.len()) }
}
impl<K:Ord,V> ReverseIter<(&K, &V)> for TreeMap<K, V> {
/// Visit all key-value pairs in reverse order
pure fn each_reverse(&self, f: fn(&(&self/K, &self/V)) -> bool) {
each_reverse(&self.root, f);
}
}
impl<K:Ord,V> Container for TreeMap<K, V> {
2013-01-21 20:59:19 -06:00
/// Return the number of elements in the map
pure fn len(&self) -> uint { self.length }
/// Return true if the map contains no elements
pure fn is_empty(&self) -> bool { self.root.is_none() }
}
impl<K:Ord,V> Mutable for TreeMap<K, V> {
/// Clear the map, removing all key-value pairs.
fn clear(&mut self) {
self.root = None;
self.length = 0
}
}
impl<K:Ord,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
pure fn contains_key(&self, key: &K) -> bool {
self.find(key).is_some()
}
/// Visit all keys in order
2013-02-07 17:05:27 -06:00
pure fn each_key(&self, f: fn(&K) -> bool) { self.each(|&(k, _)| f(k)) }
2013-01-21 17:22:03 -06:00
/// Visit all values in order
2013-02-07 17:05:27 -06:00
pure fn each_value(&self, f: fn(&V) -> bool) { self.each(|&(_, v)| f(v)) }
2013-01-21 17:22:03 -06:00
/// Return the value corresponding to the key in the map
pure fn find(&self, key: &K) -> Option<&self/V> {
let mut current: &self/Option<~TreeNode<K, V>> = &self.root;
loop {
match *current {
Some(ref r) => {
if *key < r.key {
current = &r.left;
} else if r.key < *key {
current = &r.right;
} else {
return Some(&r.value);
}
}
None => return None
}
}
}
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 {
let ret = insert(&mut self.root, key, value);
if ret { self.length += 1 }
ret
}
/// 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 {
let ret = remove(&mut self.root, key);
if ret { self.length -= 1 }
ret
}
}
impl <K:Ord,V> TreeMap<K, V> {
2013-01-14 09:27:26 -06:00
/// Create an empty TreeMap
static pure fn new() -> TreeMap<K, V> { TreeMap{root: None, length: 0} }
2012-05-23 19:18:31 -05:00
2013-01-14 09:27:26 -06:00
/// Visit all keys in reverse order
pure fn each_key_reverse(&self, f: fn(&K) -> bool) {
2013-02-07 17:05:27 -06:00
self.each_reverse(|&(k, _)| f(k))
2013-01-14 09:27:26 -06:00
}
/// Visit all values in reverse order
pure fn each_value_reverse(&self, f: fn(&V) -> bool) {
2013-02-07 17:05:27 -06:00
self.each_reverse(|&(_, v)| f(v))
2013-01-14 09:27:26 -06:00
}
2013-01-14 20:03:28 -06:00
/// Get a lazy iterator over the key-value pairs in the map.
/// Requires that it be frozen (immutable).
2013-01-15 13:25:37 -06:00
pure fn iter(&self) -> TreeMapIterator/&self<K, V> {
TreeMapIterator{stack: ~[], node: &self.root}
2013-01-14 19:41:11 -06:00
}
}
/// Lazy forward iterator over a map
pub struct TreeMapIterator<K, V> {
2013-01-14 19:41:11 -06:00
priv stack: ~[&~TreeNode<K, V>],
priv node: &Option<~TreeNode<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 map_next<K: Ord, V>(iter: &mut TreeMapIterator/&r<K, V>)
-> Option<(&r/K, &r/V)> {
while !iter.stack.is_empty() || iter.node.is_some() {
match *iter.node {
Some(ref x) => {
iter.stack.push(x);
iter.node = &x.left;
}
None => {
let res = iter.stack.pop();
iter.node = &res.right;
return Some((&res.key, &res.value));
}
2013-01-14 19:41:11 -06:00
}
}
None
}
/// Advance the iterator through the map
fn map_advance<K: Ord, V>(iter: &mut TreeMapIterator/&r<K, V>,
f: fn((&r/K, &r/V)) -> bool) {
loop {
match map_next(iter) {
Some(x) => {
if !f(x) { return }
}
None => return
}
}
2013-01-14 19:41:11 -06:00
}
pub struct TreeSet<T> {
2013-01-14 09:27:26 -06:00
priv map: TreeMap<T, ()>
}
impl<T:Ord> BaseIter<T> for TreeSet<T> {
2013-01-14 09:27:26 -06:00
/// Visit all values in order
pure fn each(&self, f: fn(&T) -> bool) { self.map.each_key(f) }
pure fn size_hint(&self) -> Option<uint> { Some(self.len()) }
}
impl<T:Ord> ReverseIter<T> for TreeSet<T> {
/// Visit all values in reverse order
pure fn each_reverse(&self, f: fn(&T) -> bool) {
self.map.each_key_reverse(f)
}
}
impl<T:Eq + Ord> Eq for TreeSet<T> {
2013-01-14 09:27:26 -06:00
pure fn eq(&self, other: &TreeSet<T>) -> bool { self.map == other.map }
pure fn ne(&self, other: &TreeSet<T>) -> bool { self.map != other.map }
}
impl<T:Ord> Ord for TreeSet<T> {
#[inline(always)]
pure fn lt(&self, other: &TreeSet<T>) -> bool { self.map < other.map }
#[inline(always)]
pure fn le(&self, other: &TreeSet<T>) -> bool { self.map <= other.map }
#[inline(always)]
pure fn ge(&self, other: &TreeSet<T>) -> bool { self.map >= other.map }
#[inline(always)]
pure fn gt(&self, other: &TreeSet<T>) -> bool { self.map > other.map }
}
impl<T:Ord> Container for TreeSet<T> {
2013-01-23 15:47:27 -06:00
/// Return the number of elements in the set
2013-01-21 20:59:19 -06:00
pure fn len(&self) -> uint { self.map.len() }
2013-01-23 15:47:27 -06:00
/// Return true if the set contains no elements
2013-01-21 20:59:19 -06:00
pure fn is_empty(&self) -> bool { self.map.is_empty() }
}
impl<T:Ord> Mutable for TreeSet<T> {
/// Clear the set, removing all values.
fn clear(&mut self) { self.map.clear() }
}
impl<T:Ord> Set<T> for TreeSet<T> {
/// Return true if the set contains a value
pure fn contains(&self, value: &T) -> bool {
self.map.contains_key(value)
}
/// Add a value to the set. Return true if the value was not already
/// present in the set.
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.
fn remove(&mut self, value: &T) -> bool { self.map.remove(value) }
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.
pure fn is_disjoint(&self, other: &TreeSet<T>) -> bool {
let mut x = self.iter();
let mut y = other.iter();
unsafe { // purity workaround
let mut a = set_next(&mut x);
let mut b = set_next(&mut y);
2013-01-29 16:04:25 -06:00
while a.is_some() && b.is_some() {
let a1 = a.unwrap();
let b1 = b.unwrap();
if a1 < b1 {
a = set_next(&mut x);
2013-01-29 16:04:25 -06:00
} else if b1 < a1 {
b = set_next(&mut y);
2013-01-29 16:04:25 -06:00
} else {
return false;
}
}
}
true
}
/// Return true if the set is a subset of another
pure fn is_subset(&self, other: &TreeSet<T>) -> bool {
other.is_superset(self)
}
/// Return true if the set is a superset of another
pure fn is_superset(&self, other: &TreeSet<T>) -> bool {
let mut x = self.iter();
let mut y = other.iter();
unsafe { // purity workaround
let mut a = set_next(&mut x);
let mut b = set_next(&mut y);
while b.is_some() {
if a.is_none() {
return false
}
let a1 = a.unwrap();
let b1 = b.unwrap();
if b1 < a1 {
return false
}
if !(a1 < b1) {
b = set_next(&mut y);
}
a = set_next(&mut x);
}
}
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-01-15 07:55:13 -06:00
pure fn difference(&self, other: &TreeSet<T>, f: fn(&T) -> bool) {
2013-01-15 13:25:37 -06:00
let mut x = self.iter();
let mut y = other.iter();
2013-01-15 07:55:13 -06:00
2013-01-15 13:25:37 -06:00
unsafe { // purity workaround
let mut a = set_next(&mut x);
let mut b = set_next(&mut y);
2013-01-15 07:55:13 -06:00
while a.is_some() {
if b.is_none() {
2013-01-15 13:25:37 -06:00
return do a.while_some() |a1| {
if f(a1) { set_next(&mut x) } else { None }
2013-01-15 07:55:13 -06:00
}
}
2013-01-15 13:25:37 -06:00
let a1 = a.unwrap();
let b1 = b.unwrap();
2013-01-15 07:55:13 -06:00
if a1 < b1 {
if !f(a1) { return }
a = set_next(&mut x);
2013-01-15 07:55:13 -06:00
} else {
if !(b1 < a1) { a = set_next(&mut x) }
b = set_next(&mut y);
2013-01-15 07:55:13 -06:00
}
}
}
2013-01-14 09:27:26 -06:00
}
/// Visit the values (in-order) representing the symmetric difference
pure fn symmetric_difference(&self, other: &TreeSet<T>,
2013-01-15 10:41:47 -06:00
f: fn(&T) -> bool) {
2013-01-15 13:25:37 -06:00
let mut x = self.iter();
let mut y = other.iter();
2013-01-15 13:25:37 -06:00
unsafe { // purity workaround
let mut a = set_next(&mut x);
let mut b = set_next(&mut y);
2013-01-15 10:41:47 -06:00
while a.is_some() {
if b.is_none() {
2013-01-15 13:25:37 -06:00
return do a.while_some() |a1| {
if f(a1) { set_next(&mut x) } else { None }
2013-01-15 10:41:47 -06:00
}
}
2013-01-15 13:25:37 -06:00
let a1 = a.unwrap();
let b1 = b.unwrap();
2013-01-15 10:41:47 -06:00
if a1 < b1 {
if !f(a1) { return }
a = set_next(&mut x);
2013-01-15 10:41:47 -06:00
} else {
if b1 < a1 {
if !f(b1) { return }
} else {
a = set_next(&mut x);
2013-01-15 10:41:47 -06:00
}
b = set_next(&mut y);
2013-01-15 10:41:47 -06:00
}
}
2013-01-15 13:25:37 -06:00
do b.while_some |b1| {
if f(b1) { set_next(&mut y) } else { None }
2013-01-15 10:41:47 -06:00
}
}
2013-01-14 09:27:26 -06:00
}
/// Visit the values (in-order) representing the intersection
2013-01-15 07:55:13 -06:00
pure fn intersection(&self, other: &TreeSet<T>, f: fn(&T) -> bool) {
let mut x = self.iter();
let mut y = other.iter();
unsafe { // purity workaround
let mut a = set_next(&mut x);
let mut b = set_next(&mut y);
while a.is_some() && b.is_some() {
let a1 = a.unwrap();
let b1 = b.unwrap();
if a1 < b1 {
a = set_next(&mut x);
} else {
if !(b1 < a1) {
if !f(a1) { return }
}
b = set_next(&mut y);
}
2013-01-14 09:27:26 -06:00
}
}
}
/// Visit the values (in-order) representing the union
2013-01-15 09:21:45 -06:00
pure fn union(&self, other: &TreeSet<T>, f: fn(&T) -> bool) {
2013-01-15 13:25:37 -06:00
let mut x = self.iter();
let mut y = other.iter();
2013-01-15 13:25:37 -06:00
unsafe { // purity workaround
let mut a = set_next(&mut x);
let mut b = set_next(&mut y);
2013-01-15 09:21:45 -06:00
while a.is_some() {
if b.is_none() {
2013-01-15 13:25:37 -06:00
return do a.while_some() |a1| {
if f(a1) { set_next(&mut x) } else { None }
2013-01-15 09:21:45 -06:00
}
}
2013-01-15 13:25:37 -06:00
let a1 = a.unwrap();
let b1 = b.unwrap();
2013-01-15 09:21:45 -06:00
if b1 < a1 {
if !f(b1) { return }
b = set_next(&mut y);
2013-01-15 09:21:45 -06:00
} else {
if !f(a1) { return }
if !(a1 < b1) {
b = set_next(&mut y);
2013-01-15 09:21:45 -06:00
}
a = set_next(&mut x);
2013-01-15 09:21:45 -06:00
}
}
}
}
}
2012-01-17 21:05:07 -06:00
impl <T:Ord> TreeSet<T> {
/// Create an empty TreeSet
static pure fn new() -> TreeSet<T> { TreeSet{map: TreeMap::new()} }
/// Get a lazy iterator over the values in the set.
/// Requires that it be frozen (immutable).
pure fn iter(&self) -> TreeSetIterator/&self<T> {
TreeSetIterator{iter: self.map.iter()}
}
}
2013-01-15 13:25:37 -06:00
/// Lazy forward iterator over a set
pub struct TreeSetIterator<T> {
2013-01-15 13:25:37 -06:00
priv iter: TreeMapIterator<T, ()>
}
/// Advance the iterator to the next node (in order). If this iterator is
/// finished, does nothing.
pub fn set_next<T: Ord>(iter: &mut TreeSetIterator/&r<T>) -> Option<&r/T> {
do map_next(&mut iter.iter).map |&(value, _)| { value }
}
/// Advance the iterator through the set
fn set_advance<T: Ord>(iter: &mut TreeSetIterator/&r<T>,
f: fn(&r/T) -> bool) {
do map_advance(&mut iter.iter) |(k, _)| { f(k) }
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.
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
}
impl <K:Ord,V> TreeNode<K, V> {
2013-01-14 09:27:26 -06:00
#[inline(always)]
static pure fn new(key: K, value: V) -> TreeNode<K, V> {
TreeNode{key: key, value: value, left: None, right: None, level: 1}
}
}
pure fn each<K:Ord,V>(node: &r/Option<~TreeNode<K, V>>,
2013-02-07 17:05:27 -06:00
f: fn(&(&r/K, &r/V)) -> bool) {
do node.iter |x| {
2013-01-14 09:27:26 -06:00
each(&x.left, f);
2013-02-07 17:05:27 -06:00
if f(&(&x.key, &x.value)) { each(&x.right, f) }
}
2013-01-14 09:27:26 -06:00
}
pure fn each_reverse<K:Ord,V>(node: &r/Option<~TreeNode<K, V>>,
2013-02-07 17:05:27 -06:00
f: fn(&(&r/K, &r/V)) -> bool) {
do node.iter |x| {
2013-01-14 09:27:26 -06:00
each_reverse(&x.right, f);
2013-02-07 17:05:27 -06:00
if f(&(&x.key, &x.value)) { each_reverse(&x.left, f) }
}
2013-01-14 09:27:26 -06:00
}
// Remove left horizontal link by rotating right
fn skew<K:Ord,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();
node.left <-> save.right; // save.right now None
*node <-> save;
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
fn split<K:Ord,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();
node.right <-> save.left; // save.left now None
save.level += 1;
*node <-> save;
node.left = Some(save);
2013-01-14 09:27:26 -06:00
}
}
fn insert<K:Ord,V>(node: &mut Option<~TreeNode<K, V>>, key: K,
2013-01-14 09:27:26 -06:00
value: V) -> bool {
match *node {
Some(ref mut save) => {
2013-01-14 09:27:26 -06:00
if key < save.key {
let inserted = insert(&mut save.left, key, value);
skew(save);
split(save);
2013-01-14 09:27:26 -06:00
inserted
} else if save.key < key {
let inserted = insert(&mut save.right, key, value);
skew(save);
split(save);
2013-01-14 09:27:26 -06:00
inserted
} else {
save.key = key;
save.value = value;
false
}
}
None => {
*node = Some(~TreeNode::new(key, value));
true
}
2013-01-14 09:27:26 -06:00
}
}
fn remove<K:Ord,V>(node: &mut Option<~TreeNode<K, V>>, key: &K) -> bool {
fn heir_swap<K:Ord,V>(node: &mut ~TreeNode<K, V>,
2013-01-14 09:27:26 -06:00
child: &mut Option<~TreeNode<K, V>>) {
// *could* be done without recursion, but it won't borrow check
do child.mutate |mut child| {
2013-01-14 09:27:26 -06:00
if child.right.is_some() {
2013-02-10 20:11:33 -06:00
heir_swap(node, &mut child.right);
2013-01-14 09:27:26 -06:00
} else {
node.key <-> child.key;
node.value <-> child.value;
}
child
}
}
match *node {
None => {
2013-01-14 09:27:26 -06:00
return false // bottom of tree
}
Some(ref mut save) => {
let (removed, this) = if save.key < *key {
(remove(&mut save.right, key), false)
2013-01-14 09:27:26 -06:00
} else if *key < save.key {
(remove(&mut save.left, key), false)
2013-01-14 09:27:26 -06:00
} else {
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 {
save.key <-> left.key;
save.value <-> left.value;
}
2013-01-29 14:48:18 -06:00
save.left = Some(left);
remove(&mut save.left, key);
2013-01-14 09:27:26 -06:00
} else {
*save = save.left.swap_unwrap();
2013-01-14 09:27:26 -06:00
}
(true, false)
2013-01-14 09:27:26 -06:00
} else if save.right.is_some() {
*save = save.right.swap_unwrap();
(true, false)
2013-01-14 09:27:26 -06:00
} else {
(true, true)
2013-01-14 09:27:26 -06:00
}
};
if !this {
let left_level = save.left.map_default(0, |x| x.level);
let right_level = save.right.map_default(0, |x| x.level);
// 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
if right_level > save.level {
do save.right.mutate |mut x| { x.level = save.level; x }
}
2013-01-14 09:27:26 -06:00
skew(save);
2013-01-14 09:27:26 -06:00
match save.right {
Some(ref mut right) => {
skew(right);
match right.right {
Some(ref mut x) => { skew(x) },
None => ()
}
}
None => ()
}
split(save);
match save.right {
Some(ref mut x) => { split(x) },
None => ()
}
}
2013-01-14 09:27:26 -06:00
return removed;
2013-01-14 09:27:26 -06:00
}
}
2013-01-14 09:27:26 -06:00
}
*node = None;
return true;
2013-01-14 09:27:26 -06:00
}
2013-01-14 09:27:26 -06:00
#[cfg(test)]
mod test_treemap {
use super::*;
use core::str;
2012-01-17 21:05:07 -06:00
#[test]
2013-01-14 09:27:26 -06:00
fn find_empty() {
let m = TreeMap::new::<int, int>(); assert m.find(&5) == None;
}
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();
assert m.insert(1, 2);
assert m.insert(5, 3);
assert m.insert(9, 3);
assert m.find(&2) == None;
}
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();
assert m.insert(5, 2);
assert m.insert(2, 9);
assert !m.insert(2, 11);
assert m.find(&2).unwrap() == &11;
}
2012-01-17 21:05:07 -06:00
#[test]
fn test_clear() {
let mut m = TreeMap::new();
m.clear();
assert m.insert(5, 11);
assert m.insert(12, -3);
assert m.insert(19, 2);
m.clear();
assert m.find(&5).is_none();
assert m.find(&12).is_none();
assert m.find(&19).is_none();
assert m.is_empty();
}
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();
let k1 = str::to_bytes(~"foo");
let k2 = str::to_bytes(~"bar");
let v1 = str::to_bytes(~"baz");
let v2 = str::to_bytes(~"foobar");
m.insert(copy k1, copy v1);
m.insert(copy k2, copy v2);
2013-01-14 09:27:26 -06:00
assert m.find(&k2) == Some(&v2);
assert m.find(&k1) == Some(&v1);
}
fn check_equal<K:Eq + Ord,V:Eq>(ctrl: &[(K, V)], map: &TreeMap<K, V>) {
2013-01-14 09:27:26 -06:00
assert ctrl.is_empty() == map.is_empty();
for ctrl.each |x| {
let &(k, v) = x;
assert map.find(&k).unwrap() == &v
}
2013-02-07 21:58:16 -06:00
for map.each |&(map_k, map_v)| {
2013-01-14 09:27:26 -06:00
let mut found = false;
for ctrl.each |x| {
let &(ctrl_k, ctrl_v) = x;
if *map_k == ctrl_k {
assert *map_v == ctrl_v;
found = true;
break;
}
}
assert found;
}
}
fn check_left<K:Ord,V>(node: &Option<~TreeNode<K, V>>,
2013-01-15 14:34:46 -06:00
parent: &~TreeNode<K, V>) {
2013-01-14 09:27:26 -06:00
match *node {
Some(ref r) => {
assert r.key < parent.key;
assert r.level == parent.level - 1; // left is black
check_left(&r.left, r);
check_right(&r.right, r, false);
}
None => assert parent.level == 1 // parent is leaf
}
}
fn check_right<K:Ord,V>(node: &Option<~TreeNode<K, V>>,
2013-01-14 09:27:26 -06:00
parent: &~TreeNode<K, V>, parent_red: bool) {
match *node {
Some(ref r) => {
assert r.key > parent.key;
let red = r.level == parent.level;
if parent_red { assert !red } // no dual horizontal links
2013-01-15 14:34:46 -06:00
assert red || r.level == parent.level - 1; // right red or black
2013-01-14 09:27:26 -06:00
check_left(&r.left, r);
check_right(&r.right, r, red);
}
None => assert parent.level == 1 // parent is leaf
}
}
fn check_structure<K:Ord,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);
assert map.find(&5).is_none();
let rng = rand::seeded_rng(&[42]);
2013-01-14 09:27:26 -06:00
for 3.times {
for 90.times {
let k = rng.gen_int();
let v = rng.gen_int();
if !ctrl.contains(&(k, v)) {
assert map.insert(k, v);
ctrl.push((k, v));
check_structure(&map);
check_equal(ctrl, &map);
}
}
for 30.times {
let r = rng.gen_uint_range(0, ctrl.len());
let (key, _) = vec::remove(&mut ctrl, r);
assert map.remove(&key);
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();
assert m.insert(3, 6);
assert m.len() == 1;
assert m.insert(0, 0);
assert m.len() == 2;
assert m.insert(4, 8);
assert m.len() == 3;
assert m.remove(&3);
assert m.len() == 2;
assert !m.remove(&5);
assert m.len() == 2;
assert m.insert(2, 4);
assert m.len() == 3;
assert m.insert(1, 2);
assert m.len() == 4;
}
#[test]
fn test_each() {
let mut m = TreeMap::new();
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);
let mut n = 0;
2013-02-07 21:58:16 -06:00
for m.each |&(k, v)| {
2013-01-14 09:27:26 -06:00
assert *k == n;
assert *v == n * 2;
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();
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-02-07 21:58:16 -06:00
for m.each_reverse |&(k, v)| {
2013-01-14 09:27:26 -06:00
assert *k == n;
assert *v == n * 2;
n -= 1;
2012-01-17 21:05:07 -06:00
}
}
#[test]
2013-01-14 09:27:26 -06:00
fn test_eq() {
let mut a = TreeMap::new();
let mut b = TreeMap::new();
2013-01-14 09:27:26 -06: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;
}
#[test]
fn test_lt() {
let mut a = TreeMap::new();
let mut b = TreeMap::new();
assert !(a < b) && !(b < a);
assert b.insert(0, 5);
assert a < b;
assert a.insert(0, 7);
assert !(a < b) && !(b < a);
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);
}
#[test]
fn test_ord() {
let mut a = TreeMap::new();
let mut b = TreeMap::new();
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-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);
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);
let m = m;
let mut a = m.iter();
2013-01-14 19:41:11 -06:00
2013-02-06 01:34:15 -06:00
// FIXME: #4492 (ICE): iter.get() == Some((&x1, &y1))
2013-01-14 19:41:11 -06:00
assert map_next(&mut a).unwrap() == (&x1, &y1);
assert map_next(&mut a).unwrap() == (&x2, &y2);
assert map_next(&mut a).unwrap() == (&x3, &y3);
assert map_next(&mut a).unwrap() == (&x4, &y4);
assert map_next(&mut a).unwrap() == (&x5, &y5);
assert map_next(&mut a).is_none();
let mut b = m.iter();
let expected = [(&x1, &y1), (&x2, &y2), (&x3, &y3), (&x4, &y4),
(&x5, &y5)];
let mut i = 0;
for map_advance(&mut b) |x| {
assert expected[i] == x;
i += 1;
if i == 2 {
break
}
}
for map_advance(&mut b) |x| {
assert expected[i] == x;
i += 1;
}
2013-01-14 19:41:11 -06:00
}
2013-01-14 09:27:26 -06:00
}
2013-01-14 09:27:26 -06:00
#[cfg(test)]
mod test_set {
use super::*;
#[test]
fn test_clear() {
let mut s = TreeSet::new();
s.clear();
assert s.insert(5);
assert s.insert(12);
assert s.insert(19);
s.clear();
assert !s.contains(&5);
assert !s.contains(&12);
assert !s.contains(&19);
assert s.is_empty();
}
2013-01-14 09:27:26 -06:00
#[test]
fn test_disjoint() {
let mut xs = TreeSet::new();
let mut ys = TreeSet::new();
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-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();
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();
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);
2012-01-17 21:05:07 -06:00
2013-01-14 09:27:26 -06:00
assert b.insert(5);
2012-01-17 21:05:07 -06:00
2013-01-14 09:27:26 -06:00
assert a.is_subset(&b);
assert !a.is_superset(&b);
assert !b.is_subset(&a);
assert b.is_superset(&a);
}
#[test]
fn test_each() {
let mut m = TreeSet::new();
assert m.insert(3);
assert m.insert(0);
assert m.insert(4);
assert m.insert(2);
assert m.insert(1);
let mut n = 0;
for m.each |x| {
assert *x == n;
n += 1
}
}
#[test]
fn test_each_reverse() {
let mut m = TreeSet::new();
assert m.insert(3);
assert m.insert(0);
assert m.insert(4);
assert m.insert(2);
assert m.insert(1);
let mut n = 4;
for m.each_reverse |x| {
assert *x == n;
n -= 1
}
}
#[test]
fn test_intersection() {
let mut a = TreeSet::new();
let mut b = TreeSet::new();
2013-01-15 09:10:38 -06:00
assert a.insert(11);
assert a.insert(1);
assert a.insert(3);
assert a.insert(77);
assert a.insert(103);
assert a.insert(5);
assert a.insert(-5);
assert b.insert(2);
assert b.insert(11);
assert b.insert(77);
assert b.insert(-9);
assert b.insert(-42);
assert b.insert(5);
assert b.insert(3);
2013-01-14 09:27:26 -06:00
let mut i = 0;
let expected = [3, 5, 11, 77];
for a.intersection(&b) |x| {
assert *x == expected[i];
i += 1
}
assert i == expected.len();
2012-01-17 21:05:07 -06:00
}
2013-01-15 07:55:13 -06:00
#[test]
fn test_difference() {
let mut a = TreeSet::new();
let mut b = TreeSet::new();
2013-01-15 09:10:38 -06:00
assert a.insert(1);
assert a.insert(3);
assert a.insert(5);
assert a.insert(9);
assert a.insert(11);
2013-01-15 07:55:13 -06:00
2013-01-15 09:10:38 -06:00
assert b.insert(3);
assert b.insert(9);
2013-01-15 07:55:13 -06:00
let mut i = 0;
let expected = [1, 5, 11];
for a.difference(&b) |x| {
2013-01-15 09:21:45 -06:00
assert *x == expected[i];
i += 1
}
assert i == expected.len();
}
2013-01-15 10:41:47 -06:00
#[test]
fn test_symmetric_difference() {
let mut a = TreeSet::new();
let mut b = TreeSet::new();
assert a.insert(1);
assert a.insert(3);
assert a.insert(5);
assert a.insert(9);
assert a.insert(11);
assert b.insert(-2);
assert b.insert(3);
assert b.insert(9);
assert b.insert(14);
assert b.insert(22);
let mut i = 0;
let expected = [-2, 1, 5, 11, 14, 22];
for a.symmetric_difference(&b) |x| {
assert *x == expected[i];
i += 1
}
assert i == expected.len();
}
2013-01-15 09:21:45 -06:00
#[test]
fn test_union() {
let mut a = TreeSet::new();
let mut b = TreeSet::new();
assert a.insert(1);
assert a.insert(3);
assert a.insert(5);
assert a.insert(9);
assert a.insert(11);
assert a.insert(16);
assert a.insert(19);
assert a.insert(24);
2013-01-15 09:21:45 -06:00
assert b.insert(-2);
assert b.insert(1);
assert b.insert(5);
assert b.insert(9);
assert b.insert(13);
assert b.insert(19);
let mut i = 0;
let expected = [-2, 1, 3, 5, 9, 11, 13, 16, 19, 24];
2013-01-15 09:21:45 -06:00
for a.union(&b) |x| {
2013-01-15 07:55:13 -06:00
assert *x == expected[i];
i += 1
}
assert i == expected.len();
}
2012-05-23 19:18:31 -05:00
}