diff options
| author | Steven Fackler <sfackler@gmail.com> | 2013-07-13 19:44:36 -0700 |
|---|---|---|
| committer | Steven Fackler <sfackler@gmail.com> | 2013-07-13 19:44:36 -0700 |
| commit | 6b37b5bab74a87c4f05274e6a49d9e28a4c0f4e1 (patch) | |
| tree | 1a92b4e674126ff3bf2a9e6204a25a2ae30071b4 /src/libextra | |
| parent | 8d0feb58e7f5ae67546db9c3cd7fdf4ab792d839 (diff) | |
| download | rust-6b37b5bab74a87c4f05274e6a49d9e28a4c0f4e1.tar.gz rust-6b37b5bab74a87c4f05274e6a49d9e28a4c0f4e1.zip | |
Split mutable methods out of Set and Map
Fixes most of #4989. I didn't add Persistent{Set,Map} since the only
persistent data structure is fun_treemap and its functionality is
currently too limited to build a trait out of.
Diffstat (limited to 'src/libextra')
| -rw-r--r-- | src/libextra/bitv.rs | 66 | ||||
| -rw-r--r-- | src/libextra/smallintmap.rs | 23 | ||||
| -rw-r--r-- | src/libextra/treemap.rs | 24 |
3 files changed, 61 insertions, 52 deletions
diff --git a/src/libextra/bitv.rs b/src/libextra/bitv.rs index 7a0db7a1de7..49cedac399e 100644 --- a/src/libextra/bitv.rs +++ b/src/libextra/bitv.rs @@ -718,38 +718,6 @@ impl Set<uint> for BitvSet { *value < self.bitv.storage.len() * uint::bits && self.bitv.get(*value) } - fn insert(&mut self, value: uint) -> bool { - if self.contains(&value) { - return false; - } - let nbits = self.capacity(); - if value >= nbits { - let newsize = num::max(value, nbits * 2) / uint::bits + 1; - assert!(newsize > self.bitv.storage.len()); - self.bitv.storage.grow(newsize, &0); - } - self.size += 1; - self.bitv.set(value, true); - return true; - } - - fn remove(&mut self, value: &uint) -> bool { - if !self.contains(value) { - return false; - } - self.size -= 1; - self.bitv.set(*value, false); - - // Attempt to truncate our storage - let mut i = self.bitv.storage.len(); - while i > 1 && self.bitv.storage[i - 1] == 0 { - i -= 1; - } - self.bitv.storage.truncate(i); - - return true; - } - fn is_disjoint(&self, other: &BitvSet) -> bool { for self.intersection(other) |_| { return false; @@ -816,6 +784,40 @@ impl Set<uint> for BitvSet { } } +impl MutableSet<uint> for BitvSet { + fn insert(&mut self, value: uint) -> bool { + if self.contains(&value) { + return false; + } + let nbits = self.capacity(); + if value >= nbits { + let newsize = num::max(value, nbits * 2) / uint::bits + 1; + assert!(newsize > self.bitv.storage.len()); + self.bitv.storage.grow(newsize, &0); + } + self.size += 1; + self.bitv.set(value, true); + return true; + } + + fn remove(&mut self, value: &uint) -> bool { + if !self.contains(value) { + return false; + } + self.size -= 1; + self.bitv.set(*value, false); + + // Attempt to truncate our storage + let mut i = self.bitv.storage.len(); + while i > 1 && self.bitv.storage[i - 1] == 0 { + i -= 1; + } + self.bitv.storage.truncate(i); + + return true; + } +} + impl BitvSet { /// Visits each of the words that the two bit vectors (self and other) /// both have in common. The three yielded arguments are (bit location, diff --git a/src/libextra/smallintmap.rs b/src/libextra/smallintmap.rs index d79a8cc426a..27e9f8cd60f 100644 --- a/src/libextra/smallintmap.rs +++ b/src/libextra/smallintmap.rs @@ -17,8 +17,7 @@ use std::cmp; -use std::container::{Container, Mutable, Map, Set}; -use std::iterator::*; +use std::iterator::{Iterator,IteratorUtil,ZipIterator,Counter,EnumerateIterator,FilterMapIterator}; use std::uint; use std::util::replace; use std::vec::{VecIterator,VecMutIterator,VecRevIterator,VecMutRevIterator}; @@ -68,7 +67,9 @@ impl<V> Map<uint, V> for SmallIntMap<V> { None } } +} +impl<V> MutableMap<uint, V> for SmallIntMap<V> { /// Return a mutable reference to the value corresponding to the key fn find_mut<'a>(&'a mut self, key: &uint) -> Option<&'a mut V> { if *key < self.v.len() { @@ -349,14 +350,6 @@ impl Set<uint> for SmallIntSet { /// Return true if the set contains a value fn contains(&self, value: &uint) -> 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: uint) -> 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: &uint) -> bool { self.map.remove(value) } - /// Return true if the set has no elements in common with `other`. /// This is equivalent to checking for an empty uintersection. fn is_disjoint(&self, other: &SmallIntSet) -> bool { @@ -412,6 +405,16 @@ impl Set<uint> for SmallIntSet { } } +impl MutableSet<uint> for SmallIntSet { + /// Add a value to the set. Return true if the value was not already + /// present in the set. + fn insert(&mut self, value: uint) -> 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: &uint) -> bool { self.map.remove(value) } +} + impl SmallIntSet { /// Create an empty SmallIntSet pub fn new() -> SmallIntSet { SmallIntSet{map: SmallIntMap::new()} } diff --git a/src/libextra/treemap.rs b/src/libextra/treemap.rs index 8fac055d26f..05a941b4925 100644 --- a/src/libextra/treemap.rs +++ b/src/libextra/treemap.rs @@ -124,7 +124,9 @@ impl<K: TotalOrd, V> Map<K, V> for TreeMap<K, V> { } } } +} +impl<K: TotalOrd, V> MutableMap<K, V> for TreeMap<K, V> { /// Return a mutable reference to the value corresponding to the key #[inline] fn find_mut<'a>(&'a mut self, key: &K) -> Option<&'a mut V> { @@ -293,16 +295,6 @@ impl<T: TotalOrd> Set<T> for TreeSet<T> { self.map.contains_key(value) } - /// Add a value to the set. Return true if the value was not already - /// present in the set. - #[inline] - 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. - #[inline] - fn remove(&mut self, value: &T) -> bool { self.map.remove(value) } - /// Return true if the set has no elements in common with `other`. /// This is equivalent to checking for an empty intersection. fn is_disjoint(&self, other: &TreeSet<T>) -> bool { @@ -475,6 +467,18 @@ impl<T: TotalOrd> Set<T> for TreeSet<T> { } } +impl<T: TotalOrd> MutableSet<T> for TreeSet<T> { + /// Add a value to the set. Return true if the value was not already + /// present in the set. + #[inline] + 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. + #[inline] + fn remove(&mut self, value: &T) -> bool { self.map.remove(value) } +} + impl<T: TotalOrd> TreeSet<T> { /// Create an empty TreeSet #[inline] |
