auto merge of #14709 : alexcrichton/rust/collections, r=brson
This is mostly just a cosmetic change, continuing the work from #14333.
This commit is contained in:
commit
e55f64f997
@ -20,6 +20,7 @@
|
||||
use core::uint;
|
||||
use std::hash;
|
||||
|
||||
use {Collection, Mutable, Set, MutableSet};
|
||||
use vec::Vec;
|
||||
|
||||
#[deriving(Clone)]
|
||||
@ -857,7 +858,7 @@ fn hash(&self, state: &mut S) {
|
||||
}
|
||||
}
|
||||
|
||||
impl Container for BitvSet {
|
||||
impl Collection for BitvSet {
|
||||
#[inline]
|
||||
fn len(&self) -> uint { self.size }
|
||||
}
|
||||
@ -1008,6 +1009,7 @@ mod tests {
|
||||
use std::rand::Rng;
|
||||
use test::Bencher;
|
||||
|
||||
use {Set, Mutable, MutableSet};
|
||||
use bitv::{Bitv, SmallBitv, BigBitv, BitvSet, from_bools, from_fn,
|
||||
from_bytes};
|
||||
use bitv;
|
||||
|
@ -24,6 +24,7 @@
|
||||
use core::fmt;
|
||||
use core::fmt::Show;
|
||||
|
||||
use Collection;
|
||||
use vec::Vec;
|
||||
|
||||
#[allow(missing_doc)]
|
||||
|
@ -10,41 +10,13 @@
|
||||
|
||||
//! Container traits for collections
|
||||
|
||||
use core::prelude::*;
|
||||
|
||||
/// A double-ended sequence that allows querying, insertion and deletion at both ends.
|
||||
pub trait Deque<T> : Mutable {
|
||||
/// Provide a reference to the front element, or None if the sequence is empty
|
||||
fn front<'a>(&'a self) -> Option<&'a T>;
|
||||
|
||||
/// Provide a mutable reference to the front element, or None if the sequence is empty
|
||||
fn front_mut<'a>(&'a mut self) -> Option<&'a mut T>;
|
||||
|
||||
/// Provide a reference to the back element, or None if the sequence is empty
|
||||
fn back<'a>(&'a self) -> Option<&'a T>;
|
||||
|
||||
/// Provide a mutable reference to the back element, or None if the sequence is empty
|
||||
fn back_mut<'a>(&'a mut self) -> Option<&'a mut T>;
|
||||
|
||||
/// Insert an element first in the sequence
|
||||
fn push_front(&mut self, elt: T);
|
||||
|
||||
/// Insert an element last in the sequence
|
||||
fn push_back(&mut self, elt: T);
|
||||
|
||||
/// Remove the last element and return it, or None if the sequence is empty
|
||||
fn pop_back(&mut self) -> Option<T>;
|
||||
|
||||
/// Remove the first element and return it, or None if the sequence is empty
|
||||
fn pop_front(&mut self) -> Option<T>;
|
||||
}
|
||||
|
||||
#[cfg(test)]
|
||||
pub mod bench {
|
||||
use std::prelude::*;
|
||||
use std::rand;
|
||||
use std::rand::Rng;
|
||||
use test::Bencher;
|
||||
use MutableMap;
|
||||
|
||||
pub fn insert_rand_n<M:MutableMap<uint,uint>>(n: uint,
|
||||
map: &mut M,
|
||||
@ -121,3 +93,4 @@ pub fn find_seq_n<M:MutableMap<uint,uint>>(n: uint,
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -13,7 +13,7 @@
|
||||
//! The DList allows pushing and popping elements at either end.
|
||||
//!
|
||||
//! DList implements the trait Deque. It should be imported with `use
|
||||
//! collections::deque::Deque`.
|
||||
//! collections::Deque`.
|
||||
|
||||
// DList is constructed like a singly-linked list over the field `next`.
|
||||
// including the last link being None; each Node owns its `next` field.
|
||||
@ -29,7 +29,7 @@
|
||||
use core::mem;
|
||||
use core::ptr;
|
||||
|
||||
use deque::Deque;
|
||||
use {Collection, Mutable, Deque};
|
||||
|
||||
/// A doubly-linked list.
|
||||
pub struct DList<T> {
|
||||
@ -125,7 +125,7 @@ fn link_with_prev<T>(mut next: Box<Node<T>>, prev: Rawlink<Node<T>>)
|
||||
Some(next)
|
||||
}
|
||||
|
||||
impl<T> Container for DList<T> {
|
||||
impl<T> Collection for DList<T> {
|
||||
/// O(1)
|
||||
#[inline]
|
||||
fn is_empty(&self) -> bool {
|
||||
@ -629,7 +629,7 @@ mod tests {
|
||||
use test::Bencher;
|
||||
use test;
|
||||
|
||||
use deque::Deque;
|
||||
use Deque;
|
||||
use super::{DList, Node, ListInsertion};
|
||||
use vec::Vec;
|
||||
|
||||
|
@ -32,9 +32,11 @@
|
||||
#[cfg(test)] #[phase(syntax, link)] extern crate std;
|
||||
#[cfg(test)] #[phase(syntax, link)] extern crate log;
|
||||
|
||||
use core::prelude::*;
|
||||
|
||||
pub use core::collections::Collection;
|
||||
pub use bitv::{Bitv, BitvSet};
|
||||
pub use btree::BTree;
|
||||
pub use deque::Deque;
|
||||
pub use dlist::DList;
|
||||
pub use enum_set::EnumSet;
|
||||
pub use priority_queue::PriorityQueue;
|
||||
@ -47,7 +49,6 @@
|
||||
|
||||
pub mod bitv;
|
||||
pub mod btree;
|
||||
pub mod deque;
|
||||
pub mod dlist;
|
||||
pub mod enum_set;
|
||||
pub mod priority_queue;
|
||||
@ -64,14 +65,122 @@
|
||||
// Internal unicode fiddly bits for the str module
|
||||
mod unicode;
|
||||
|
||||
// FIXME(#14008) should this actually exist, or should a method be added?
|
||||
fn expect<T>(a: core::option::Option<T>, b: &str) -> T {
|
||||
match a {
|
||||
core::option::Some(a) => a,
|
||||
core::option::None => fail!("{}", b),
|
||||
mod deque;
|
||||
|
||||
/// A trait to represent mutable containers
|
||||
pub trait Mutable: Collection {
|
||||
/// Clear the container, removing all values.
|
||||
fn clear(&mut self);
|
||||
}
|
||||
|
||||
/// A map is a key-value store where values may be looked up by their keys. This
|
||||
/// trait provides basic operations to operate on these stores.
|
||||
pub trait Map<K, V>: Collection {
|
||||
/// Return a reference to the value corresponding to the key
|
||||
fn find<'a>(&'a self, key: &K) -> Option<&'a V>;
|
||||
|
||||
/// Return true if the map contains a value for the specified key
|
||||
#[inline]
|
||||
fn contains_key(&self, key: &K) -> bool {
|
||||
self.find(key).is_some()
|
||||
}
|
||||
}
|
||||
|
||||
/// This trait provides basic operations to modify the contents of a map.
|
||||
pub trait MutableMap<K, V>: Map<K, V> + Mutable {
|
||||
/// 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.
|
||||
#[inline]
|
||||
fn insert(&mut self, key: K, value: V) -> bool {
|
||||
self.swap(key, value).is_none()
|
||||
}
|
||||
|
||||
/// Remove a key-value pair from the map. Return true if the key
|
||||
/// was present in the map, otherwise false.
|
||||
#[inline]
|
||||
fn remove(&mut self, key: &K) -> bool {
|
||||
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, k: K, v: V) -> Option<V>;
|
||||
|
||||
/// Removes a key from the map, returning the value at the key if the key
|
||||
/// was previously in the map.
|
||||
fn pop(&mut self, k: &K) -> Option<V>;
|
||||
|
||||
/// Return a mutable reference to the value corresponding to the key
|
||||
fn find_mut<'a>(&'a mut self, key: &K) -> Option<&'a mut V>;
|
||||
}
|
||||
|
||||
/// A set is a group of objects which are each distinct from one another. This
|
||||
/// trait represents actions which can be performed on sets to iterate over
|
||||
/// them.
|
||||
pub trait Set<T>: Collection {
|
||||
/// Return true if the set contains a value
|
||||
fn contains(&self, value: &T) -> bool;
|
||||
|
||||
/// 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: &Self) -> bool;
|
||||
|
||||
/// Return true if the set is a subset of another
|
||||
fn is_subset(&self, other: &Self) -> bool;
|
||||
|
||||
/// Return true if the set is a superset of another
|
||||
fn is_superset(&self, other: &Self) -> bool {
|
||||
other.is_subset(self)
|
||||
}
|
||||
|
||||
// FIXME #8154: Add difference, sym. difference, intersection and union iterators
|
||||
}
|
||||
|
||||
/// This trait represents actions which can be performed on sets to mutate
|
||||
/// them.
|
||||
pub trait MutableSet<T>: Set<T> + Mutable {
|
||||
/// 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;
|
||||
|
||||
/// Remove a value from the set. Return true if the value was
|
||||
/// present in the set.
|
||||
fn remove(&mut self, value: &T) -> bool;
|
||||
}
|
||||
|
||||
/// A double-ended sequence that allows querying, insertion and deletion at both
|
||||
/// ends.
|
||||
pub trait Deque<T> : Mutable {
|
||||
/// Provide a reference to the front element, or None if the sequence is
|
||||
/// empty
|
||||
fn front<'a>(&'a self) -> Option<&'a T>;
|
||||
|
||||
/// Provide a mutable reference to the front element, or None if the
|
||||
/// sequence is empty
|
||||
fn front_mut<'a>(&'a mut self) -> Option<&'a mut T>;
|
||||
|
||||
/// Provide a reference to the back element, or None if the sequence is
|
||||
/// empty
|
||||
fn back<'a>(&'a self) -> Option<&'a T>;
|
||||
|
||||
/// Provide a mutable reference to the back element, or None if the sequence
|
||||
/// is empty
|
||||
fn back_mut<'a>(&'a mut self) -> Option<&'a mut T>;
|
||||
|
||||
/// Insert an element first in the sequence
|
||||
fn push_front(&mut self, elt: T);
|
||||
|
||||
/// Insert an element last in the sequence
|
||||
fn push_back(&mut self, elt: T);
|
||||
|
||||
/// Remove the last element and return it, or None if the sequence is empty
|
||||
fn pop_back(&mut self) -> Option<T>;
|
||||
|
||||
/// Remove the first element and return it, or None if the sequence is empty
|
||||
fn pop_front(&mut self) -> Option<T>;
|
||||
}
|
||||
|
||||
// FIXME(#14344) this shouldn't be necessary
|
||||
#[doc(hidden)]
|
||||
pub fn fixme_14344_be_sure_to_link_to_collections() {}
|
||||
|
@ -17,6 +17,7 @@
|
||||
use core::mem::{zeroed, replace, swap};
|
||||
use core::ptr;
|
||||
|
||||
use {Collection, Mutable};
|
||||
use slice;
|
||||
use vec::Vec;
|
||||
|
||||
@ -26,7 +27,7 @@ pub struct PriorityQueue<T> {
|
||||
data: Vec<T>,
|
||||
}
|
||||
|
||||
impl<T: Ord> Container for PriorityQueue<T> {
|
||||
impl<T: Ord> Collection for PriorityQueue<T> {
|
||||
/// Returns the length of the queue
|
||||
fn len(&self) -> uint { self.data.len() }
|
||||
}
|
||||
|
@ -11,7 +11,7 @@
|
||||
//! A double-ended queue implemented as a circular buffer
|
||||
//!
|
||||
//! RingBuf implements the trait Deque. It should be imported with `use
|
||||
//! collections::deque::Deque`.
|
||||
//! collections::Deque`.
|
||||
|
||||
use core::prelude::*;
|
||||
|
||||
@ -19,7 +19,7 @@
|
||||
use core::fmt;
|
||||
use core::iter::RandomAccessIterator;
|
||||
|
||||
use deque::Deque;
|
||||
use {Deque, Collection, Mutable};
|
||||
use vec::Vec;
|
||||
|
||||
static INITIAL_CAPACITY: uint = 8u; // 2^3
|
||||
@ -33,7 +33,7 @@ pub struct RingBuf<T> {
|
||||
elts: Vec<Option<T>>
|
||||
}
|
||||
|
||||
impl<T> Container for RingBuf<T> {
|
||||
impl<T> Collection for RingBuf<T> {
|
||||
/// Return the number of elements in the RingBuf
|
||||
fn len(&self) -> uint { self.nelts }
|
||||
}
|
||||
@ -415,7 +415,7 @@ mod tests {
|
||||
use test::Bencher;
|
||||
use test;
|
||||
|
||||
use deque::Deque;
|
||||
use {Deque, Mutable};
|
||||
use super::RingBuf;
|
||||
use vec::Vec;
|
||||
|
||||
|
@ -109,6 +109,8 @@
|
||||
use core::mem;
|
||||
use core::ptr;
|
||||
use core::iter::{range_step, MultiplicativeIterator};
|
||||
|
||||
use Collection;
|
||||
use vec::Vec;
|
||||
|
||||
pub use core::slice::{ref_slice, mut_ref_slice, Splits, Windows};
|
||||
@ -296,9 +298,9 @@ fn to_owned(&self) -> ~[T] {
|
||||
|
||||
let len = self.len();
|
||||
let data_size = len.checked_mul(&mem::size_of::<T>());
|
||||
let data_size = ::expect(data_size, "overflow in to_owned()");
|
||||
let data_size = data_size.expect("overflow in to_owned()");
|
||||
let size = mem::size_of::<RawVec<()>>().checked_add(&data_size);
|
||||
let size = ::expect(size, "overflow in to_owned()");
|
||||
let size = size.expect("overflow in to_owned()");
|
||||
|
||||
unsafe {
|
||||
// this should pass the real required alignment
|
||||
@ -865,6 +867,7 @@ mod tests {
|
||||
use std::rt;
|
||||
use slice::*;
|
||||
|
||||
use Mutable;
|
||||
use vec::Vec;
|
||||
|
||||
fn square(n: uint) -> uint { n * n }
|
||||
|
@ -21,6 +21,7 @@
|
||||
use core::iter::{Enumerate, FilterMap};
|
||||
use core::mem::replace;
|
||||
|
||||
use {Collection, Mutable, Map, MutableMap};
|
||||
use {vec, slice};
|
||||
use vec::Vec;
|
||||
|
||||
@ -29,7 +30,7 @@ pub struct SmallIntMap<T> {
|
||||
v: Vec<Option<T>>,
|
||||
}
|
||||
|
||||
impl<V> Container for SmallIntMap<V> {
|
||||
impl<V> Collection for SmallIntMap<V> {
|
||||
/// Return the number of elements in the map
|
||||
fn len(&self) -> uint {
|
||||
self.v.iter().filter(|elt| elt.is_some()).count()
|
||||
@ -123,7 +124,7 @@ pub fn with_capacity(capacity: uint) -> SmallIntMap<V> {
|
||||
}
|
||||
|
||||
pub fn get<'a>(&'a self, key: &uint) -> &'a V {
|
||||
::expect(self.find(key), "key not present")
|
||||
self.find(key).expect("key not present")
|
||||
}
|
||||
|
||||
/// An iterator visiting all key-value pairs in ascending order by the keys.
|
||||
@ -264,6 +265,7 @@ pub struct MutEntries<'a, T> {
|
||||
mod test_map {
|
||||
use std::prelude::*;
|
||||
|
||||
use {Map, MutableMap, Mutable};
|
||||
use super::SmallIntMap;
|
||||
|
||||
#[test]
|
||||
|
@ -76,6 +76,7 @@ fn main() {
|
||||
use core::iter::AdditiveIterator;
|
||||
use core::mem;
|
||||
|
||||
use Collection;
|
||||
use hash;
|
||||
use string::String;
|
||||
use vec::Vec;
|
||||
@ -610,7 +611,7 @@ fn into_string(self) -> String {
|
||||
}
|
||||
}
|
||||
|
||||
impl<'a> Container for MaybeOwned<'a> {
|
||||
impl<'a> Collection for MaybeOwned<'a> {
|
||||
#[inline]
|
||||
fn len(&self) -> uint { self.as_slice().len() }
|
||||
}
|
||||
@ -2036,7 +2037,7 @@ fn t<S: Default + Str>() {
|
||||
|
||||
#[test]
|
||||
fn test_str_container() {
|
||||
fn sum_len<S: Container>(v: &[S]) -> uint {
|
||||
fn sum_len<S: Collection>(v: &[S]) -> uint {
|
||||
v.iter().map(|x| x.len()).sum()
|
||||
}
|
||||
|
||||
|
@ -18,6 +18,7 @@
|
||||
use core::ptr;
|
||||
use core::raw::Slice;
|
||||
|
||||
use {Collection, Mutable};
|
||||
use hash;
|
||||
use str;
|
||||
use str::{CharRange, StrAllocating};
|
||||
@ -279,7 +280,7 @@ pub unsafe fn as_mut_vec<'a>(&'a mut self) -> &'a mut Vec<u8> {
|
||||
}
|
||||
}
|
||||
|
||||
impl Container for String {
|
||||
impl Collection for String {
|
||||
#[inline]
|
||||
fn len(&self) -> uint {
|
||||
self.vec.len()
|
||||
@ -356,6 +357,7 @@ mod tests {
|
||||
use std::prelude::*;
|
||||
use test::Bencher;
|
||||
|
||||
use Mutable;
|
||||
use str::{Str, StrSlice};
|
||||
use super::String;
|
||||
|
||||
|
@ -22,6 +22,7 @@
|
||||
use core::mem::{replace, swap};
|
||||
use core::ptr;
|
||||
|
||||
use {Collection, Mutable, Set, MutableSet, MutableMap, Map};
|
||||
use vec::Vec;
|
||||
|
||||
// This is implemented as an AA tree, which is a simplified variation of
|
||||
@ -86,7 +87,7 @@ fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
|
||||
}
|
||||
}
|
||||
|
||||
impl<K: Ord, V> Container for TreeMap<K, V> {
|
||||
impl<K: Ord, V> Collection for TreeMap<K, V> {
|
||||
fn len(&self) -> uint { self.length }
|
||||
}
|
||||
|
||||
@ -579,7 +580,7 @@ fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
|
||||
}
|
||||
}
|
||||
|
||||
impl<T: Ord> Container for TreeSet<T> {
|
||||
impl<T: Ord> Collection for TreeSet<T> {
|
||||
#[inline]
|
||||
fn len(&self) -> uint { self.map.len() }
|
||||
}
|
||||
@ -1006,6 +1007,7 @@ mod test_treemap {
|
||||
use std::rand::Rng;
|
||||
use std::rand;
|
||||
|
||||
use {Map, MutableMap, Mutable};
|
||||
use super::{TreeMap, TreeNode};
|
||||
|
||||
#[test]
|
||||
@ -1437,7 +1439,6 @@ fn test_from_iter() {
|
||||
|
||||
#[cfg(test)]
|
||||
mod bench {
|
||||
use std::prelude::*;
|
||||
use test::Bencher;
|
||||
|
||||
use super::TreeMap;
|
||||
@ -1500,6 +1501,7 @@ pub fn find_seq_10_000(b: &mut Bencher) {
|
||||
mod test_set {
|
||||
use std::prelude::*;
|
||||
|
||||
use {Set, MutableSet, Mutable, MutableMap};
|
||||
use super::{TreeMap, TreeSet};
|
||||
|
||||
#[test]
|
||||
|
@ -17,6 +17,7 @@
|
||||
use core::mem;
|
||||
use core::uint;
|
||||
|
||||
use {Collection, Mutable, Map, MutableMap, Set, MutableSet};
|
||||
use slice::{Items, MutItems};
|
||||
use slice;
|
||||
|
||||
@ -38,7 +39,7 @@ pub struct TrieMap<T> {
|
||||
length: uint
|
||||
}
|
||||
|
||||
impl<T> Container for TrieMap<T> {
|
||||
impl<T> Collection for TrieMap<T> {
|
||||
/// Return the number of elements in the map
|
||||
#[inline]
|
||||
fn len(&self) -> uint { self.length }
|
||||
@ -285,7 +286,7 @@ pub struct TrieSet {
|
||||
map: TrieMap<()>
|
||||
}
|
||||
|
||||
impl Container for TrieSet {
|
||||
impl Collection for TrieSet {
|
||||
/// Return the number of elements in the set
|
||||
#[inline]
|
||||
fn len(&self) -> uint { self.map.len() }
|
||||
@ -645,6 +646,7 @@ mod test_map {
|
||||
use std::iter::range_step;
|
||||
use std::uint;
|
||||
|
||||
use {MutableMap, Map};
|
||||
use super::{TrieMap, TrieNode, Internal, External, Nothing};
|
||||
|
||||
fn check_integrity<T>(trie: &TrieNode<T>) {
|
||||
@ -923,6 +925,7 @@ mod bench_map {
|
||||
use std::rand::{weak_rng, Rng};
|
||||
use test::Bencher;
|
||||
|
||||
use MutableMap;
|
||||
use super::TrieMap;
|
||||
|
||||
#[bench]
|
||||
@ -1031,6 +1034,7 @@ mod test_set {
|
||||
use std::prelude::*;
|
||||
use std::uint;
|
||||
|
||||
use {MutableSet, Set};
|
||||
use super::TrieSet;
|
||||
|
||||
#[test]
|
||||
|
@ -24,6 +24,7 @@
|
||||
use core::ptr;
|
||||
use core::uint;
|
||||
|
||||
use {Collection, Mutable};
|
||||
use slice::{MutableOrdVector, OwnedVector, MutableVectorAllocating};
|
||||
use slice::{Items, MutItems};
|
||||
|
||||
@ -91,8 +92,8 @@ pub fn with_capacity(capacity: uint) -> Vec<T> {
|
||||
} else if capacity == 0 {
|
||||
Vec::new()
|
||||
} else {
|
||||
let size = ::expect(capacity.checked_mul(&mem::size_of::<T>()),
|
||||
"capacity overflow");
|
||||
let size = capacity.checked_mul(&mem::size_of::<T>())
|
||||
.expect("capacity overflow");
|
||||
let ptr = unsafe { allocate(size, mem::min_align_of::<T>()) };
|
||||
Vec { len: 0, cap: capacity, ptr: ptr as *mut T }
|
||||
}
|
||||
@ -393,7 +394,7 @@ fn cmp(&self, other: &Vec<T>) -> Ordering {
|
||||
}
|
||||
}
|
||||
|
||||
impl<T> Container for Vec<T> {
|
||||
impl<T> Collection for Vec<T> {
|
||||
#[inline]
|
||||
fn len(&self) -> uint {
|
||||
self.len
|
||||
@ -499,8 +500,8 @@ pub fn reserve_exact(&mut self, capacity: uint) {
|
||||
if mem::size_of::<T>() == 0 { return }
|
||||
|
||||
if capacity > self.cap {
|
||||
let size = ::expect(capacity.checked_mul(&mem::size_of::<T>()),
|
||||
"capacity overflow");
|
||||
let size = capacity.checked_mul(&mem::size_of::<T>())
|
||||
.expect("capacity overflow");
|
||||
unsafe {
|
||||
self.ptr = alloc_or_realloc(self.ptr, size,
|
||||
self.cap * mem::size_of::<T>());
|
||||
@ -579,7 +580,7 @@ pub fn pop(&mut self) -> Option<T> {
|
||||
pub fn push(&mut self, value: T) {
|
||||
if mem::size_of::<T>() == 0 {
|
||||
// zero-size types consume no memory, so we can't rely on the address space running out
|
||||
self.len = ::expect(self.len.checked_add(&1), "length overflow");
|
||||
self.len = self.len.checked_add(&1).expect("length overflow");
|
||||
unsafe { mem::forget(value); }
|
||||
return
|
||||
}
|
||||
@ -1526,9 +1527,9 @@ impl<T> FromVec<T> for ~[T] {
|
||||
fn from_vec(mut v: Vec<T>) -> ~[T] {
|
||||
let len = v.len();
|
||||
let data_size = len.checked_mul(&mem::size_of::<T>());
|
||||
let data_size = ::expect(data_size, "overflow in from_vec()");
|
||||
let data_size = data_size.expect("overflow in from_vec()");
|
||||
let size = mem::size_of::<RawVec<()>>().checked_add(&data_size);
|
||||
let size = ::expect(size, "overflow in from_vec()");
|
||||
let size = size.expect("overflow in from_vec()");
|
||||
|
||||
// In a post-DST world, we can attempt to reuse the Vec allocation by calling
|
||||
// shrink_to_fit() on it. That may involve a reallocation+memcpy, but that's no
|
||||
|
24
src/libcore/collections.rs
Normal file
24
src/libcore/collections.rs
Normal file
@ -0,0 +1,24 @@
|
||||
// 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.
|
||||
|
||||
//! Traits for generic collections
|
||||
|
||||
/// A trait to represent the abstract idea of a container. The only concrete
|
||||
/// knowledge known is the number of elements contained within.
|
||||
pub trait Collection {
|
||||
/// Return the number of elements in the container
|
||||
fn len(&self) -> uint;
|
||||
|
||||
/// Return true if the container contains no elements
|
||||
#[inline]
|
||||
fn is_empty(&self) -> bool {
|
||||
self.len() == 0
|
||||
}
|
||||
}
|
@ -1,108 +0,0 @@
|
||||
// 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.
|
||||
|
||||
//! Traits for generic containers (including `Map` and `Set`)
|
||||
|
||||
use option::Option;
|
||||
|
||||
/// A trait to represent the abstract idea of a container. The only concrete
|
||||
/// knowledge known is the number of elements contained within.
|
||||
pub trait Container {
|
||||
/// Return the number of elements in the container
|
||||
fn len(&self) -> uint;
|
||||
|
||||
/// Return true if the container contains no elements
|
||||
#[inline]
|
||||
fn is_empty(&self) -> bool {
|
||||
self.len() == 0
|
||||
}
|
||||
}
|
||||
|
||||
/// A trait to represent mutable containers
|
||||
pub trait Mutable: Container {
|
||||
/// Clear the container, removing all values.
|
||||
fn clear(&mut self);
|
||||
}
|
||||
|
||||
/// A map is a key-value store where values may be looked up by their keys. This
|
||||
/// trait provides basic operations to operate on these stores.
|
||||
pub trait Map<K, V>: Container {
|
||||
/// Return a reference to the value corresponding to the key
|
||||
fn find<'a>(&'a self, key: &K) -> Option<&'a V>;
|
||||
|
||||
/// Return true if the map contains a value for the specified key
|
||||
#[inline]
|
||||
fn contains_key(&self, key: &K) -> bool {
|
||||
self.find(key).is_some()
|
||||
}
|
||||
}
|
||||
|
||||
/// This trait provides basic operations to modify the contents of a map.
|
||||
pub trait MutableMap<K, V>: Map<K, V> + Mutable {
|
||||
/// 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.
|
||||
#[inline]
|
||||
fn insert(&mut self, key: K, value: V) -> bool {
|
||||
self.swap(key, value).is_none()
|
||||
}
|
||||
|
||||
/// Remove a key-value pair from the map. Return true if the key
|
||||
/// was present in the map, otherwise false.
|
||||
#[inline]
|
||||
fn remove(&mut self, key: &K) -> bool {
|
||||
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, k: K, v: V) -> Option<V>;
|
||||
|
||||
/// Removes a key from the map, returning the value at the key if the key
|
||||
/// was previously in the map.
|
||||
fn pop(&mut self, k: &K) -> Option<V>;
|
||||
|
||||
/// Return a mutable reference to the value corresponding to the key
|
||||
fn find_mut<'a>(&'a mut self, key: &K) -> Option<&'a mut V>;
|
||||
}
|
||||
|
||||
/// A set is a group of objects which are each distinct from one another. This
|
||||
/// trait represents actions which can be performed on sets to iterate over
|
||||
/// them.
|
||||
pub trait Set<T>: Container {
|
||||
/// Return true if the set contains a value
|
||||
fn contains(&self, value: &T) -> bool;
|
||||
|
||||
/// 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: &Self) -> bool;
|
||||
|
||||
/// Return true if the set is a subset of another
|
||||
fn is_subset(&self, other: &Self) -> bool;
|
||||
|
||||
/// Return true if the set is a superset of another
|
||||
fn is_superset(&self, other: &Self) -> bool {
|
||||
other.is_subset(self)
|
||||
}
|
||||
|
||||
// FIXME #8154: Add difference, sym. difference, intersection and union iterators
|
||||
}
|
||||
|
||||
/// This trait represents actions which can be performed on sets to mutate
|
||||
/// them.
|
||||
pub trait MutableSet<T>: Set<T> + Mutable {
|
||||
/// 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;
|
||||
|
||||
/// Remove a value from the set. Return true if the value was
|
||||
/// present in the set.
|
||||
fn remove(&mut self, value: &T) -> bool;
|
||||
}
|
@ -11,7 +11,7 @@
|
||||
#![allow(missing_doc)]
|
||||
|
||||
use char;
|
||||
use container::Container;
|
||||
use collections::Collection;
|
||||
use fmt;
|
||||
use iter::{Iterator, range, DoubleEndedIterator};
|
||||
use num::{Float, FPNaN, FPInfinite, ToPrimitive, Primitive};
|
||||
|
@ -15,7 +15,7 @@
|
||||
use any;
|
||||
use cell::Cell;
|
||||
use char::Char;
|
||||
use container::Container;
|
||||
use collections::Collection;
|
||||
use iter::{Iterator, range};
|
||||
use kinds::Copy;
|
||||
use mem;
|
||||
|
@ -14,7 +14,7 @@
|
||||
|
||||
#![allow(unsigned_negate)]
|
||||
|
||||
use container::Container;
|
||||
use collections::Collection;
|
||||
use fmt;
|
||||
use iter::{Iterator, DoubleEndedIterator};
|
||||
use num::{Int, cast, zero};
|
||||
|
@ -108,7 +108,7 @@
|
||||
#[cfg(not(test))] pub mod cmp;
|
||||
pub mod clone;
|
||||
pub mod default;
|
||||
pub mod container;
|
||||
pub mod collections;
|
||||
|
||||
/* Core types and methods on primitives */
|
||||
|
||||
|
@ -47,7 +47,7 @@
|
||||
pub use clone::Clone;
|
||||
pub use cmp::{PartialEq, PartialOrd, Eq, Ord};
|
||||
pub use cmp::{Ordering, Less, Equal, Greater, Equiv};
|
||||
pub use container::{Container, Mutable, Map, MutableMap, Set, MutableSet};
|
||||
pub use collections::Collection;
|
||||
pub use iter::{FromIterator, Extendable};
|
||||
pub use iter::{Iterator, DoubleEndedIterator, RandomAccessIterator, CloneableIterator};
|
||||
pub use iter::{OrdIterator, MutableDoubleEndedIterator, ExactSize};
|
||||
|
@ -25,7 +25,7 @@
|
||||
// Currently, no progress has been made on this list.
|
||||
|
||||
use clone::Clone;
|
||||
use container::Container;
|
||||
use collections::Collection;
|
||||
use finally::try_finally;
|
||||
use intrinsics;
|
||||
use iter::{range, Iterator};
|
||||
|
@ -16,7 +16,7 @@
|
||||
|
||||
use mem::transmute;
|
||||
use clone::Clone;
|
||||
use container::Container;
|
||||
use collections::Collection;
|
||||
use cmp::{PartialEq, Ord, Ordering, Less, Equal, Greater};
|
||||
use cmp;
|
||||
use default::Default;
|
||||
@ -253,7 +253,7 @@ pub mod traits {
|
||||
|
||||
use cmp::{PartialEq, PartialOrd, Eq, Ord, Ordering, Equiv};
|
||||
use iter::order;
|
||||
use container::Container;
|
||||
use collections::Collection;
|
||||
|
||||
impl<'a,T:PartialEq> PartialEq for &'a [T] {
|
||||
fn eq(&self, other: & &'a [T]) -> bool {
|
||||
@ -347,7 +347,7 @@ impl<T> Vector<T> for ~[T] {
|
||||
fn as_slice<'a>(&'a self) -> &'a [T] { let v: &'a [T] = *self; v }
|
||||
}
|
||||
|
||||
impl<'a, T> Container for &'a [T] {
|
||||
impl<'a, T> Collection for &'a [T] {
|
||||
/// Returns the length of a vector
|
||||
#[inline]
|
||||
fn len(&self) -> uint {
|
||||
@ -355,7 +355,7 @@ fn len(&self) -> uint {
|
||||
}
|
||||
}
|
||||
|
||||
impl<T> Container for ~[T] {
|
||||
impl<T> Collection for ~[T] {
|
||||
/// Returns the length of a vector
|
||||
#[inline]
|
||||
fn len(&self) -> uint {
|
||||
@ -1205,7 +1205,7 @@ pub unsafe fn pop_ptr<T>(slice: &mut Slice<T>) -> Option<*T> {
|
||||
|
||||
/// Operations on `[u8]`.
|
||||
pub mod bytes {
|
||||
use container::Container;
|
||||
use collections::Collection;
|
||||
use ptr;
|
||||
use slice::MutableVector;
|
||||
|
||||
|
@ -19,7 +19,7 @@
|
||||
use clone::Clone;
|
||||
use cmp;
|
||||
use cmp::{PartialEq, Eq};
|
||||
use container::Container;
|
||||
use collections::Collection;
|
||||
use default::Default;
|
||||
use iter::{Filter, Map, Iterator};
|
||||
use iter::{DoubleEndedIterator, ExactSize};
|
||||
@ -866,7 +866,7 @@ macro_rules! utf8_acc_cont_byte(
|
||||
/// Unsafe operations
|
||||
pub mod raw {
|
||||
use mem;
|
||||
use container::Container;
|
||||
use collections::Collection;
|
||||
use ptr::RawPtr;
|
||||
use raw::Slice;
|
||||
use slice::{ImmutableVector};
|
||||
@ -930,8 +930,8 @@ pub unsafe fn slice_unchecked<'a>(s: &'a str, begin: uint, end: uint) -> &'a str
|
||||
#[cfg(not(test))]
|
||||
#[allow(missing_doc)]
|
||||
pub mod traits {
|
||||
use container::Container;
|
||||
use cmp::{Ord, Ordering, Less, Equal, Greater, PartialEq, PartialOrd, Equiv, Eq};
|
||||
use collections::Collection;
|
||||
use iter::Iterator;
|
||||
use option::{Some, None};
|
||||
use str::{Str, StrSlice, eq_slice};
|
||||
@ -987,7 +987,7 @@ impl<'a> Str for &'a str {
|
||||
fn as_slice<'a>(&'a self) -> &'a str { *self }
|
||||
}
|
||||
|
||||
impl<'a> Container for &'a str {
|
||||
impl<'a> Collection for &'a str {
|
||||
#[inline]
|
||||
fn len(&self) -> uint {
|
||||
self.repr().len
|
||||
|
@ -775,7 +775,7 @@ pub fn expand(&self, text: &str) -> String {
|
||||
}
|
||||
}
|
||||
|
||||
impl<'t> Container for Captures<'t> {
|
||||
impl<'t> Collection for Captures<'t> {
|
||||
/// Returns the number of captured groups.
|
||||
#[inline]
|
||||
fn len(&self) -> uint {
|
||||
|
@ -45,7 +45,6 @@
|
||||
|
||||
#![allow(unsigned_negate)]
|
||||
|
||||
use std::container::Map;
|
||||
use libc::c_ulonglong;
|
||||
use std::num::{Bitwise};
|
||||
use std::rc::Rc;
|
||||
|
@ -229,7 +229,7 @@ fn drop(&mut self) {
|
||||
}
|
||||
}
|
||||
|
||||
impl Container for CString {
|
||||
impl Collection for CString {
|
||||
/// Return the number of bytes in the CString (not including the NUL terminator).
|
||||
///
|
||||
/// # Failure
|
||||
|
@ -10,7 +10,7 @@
|
||||
|
||||
//! Operations on ASCII strings and characters
|
||||
|
||||
use container::Container;
|
||||
use collections::Collection;
|
||||
use fmt;
|
||||
use iter::Iterator;
|
||||
use mem;
|
||||
|
@ -33,7 +33,7 @@
|
||||
//! handled correctly, i.e. that allocated memory is eventually freed
|
||||
//! if necessary.
|
||||
|
||||
use container::Container;
|
||||
use collections::Collection;
|
||||
use kinds::Send;
|
||||
use mem;
|
||||
use ops::Drop;
|
||||
@ -149,7 +149,7 @@ pub unsafe fn unwrap(mut self) -> *mut T {
|
||||
}
|
||||
}
|
||||
|
||||
impl<T> Container for CVec<T> {
|
||||
impl<T> Collection for CVec<T> {
|
||||
fn len(&self) -> uint { self.len }
|
||||
}
|
||||
|
||||
|
@ -12,7 +12,7 @@
|
||||
|
||||
use clone::Clone;
|
||||
use cmp::{max, Eq, Equiv, PartialEq};
|
||||
use container::{Container, Mutable, Set, MutableSet, Map, MutableMap};
|
||||
use collections::{Collection, Mutable, Set, MutableSet, Map, MutableMap};
|
||||
use default::Default;
|
||||
use fmt::Show;
|
||||
use fmt;
|
||||
@ -930,7 +930,7 @@ pub fn pop_equiv<Q:Hash<S> + Equiv<K>>(&mut self, k: &Q) -> Option<V> {
|
||||
}
|
||||
}
|
||||
|
||||
impl<K: Eq + Hash<S>, V, S, H: Hasher<S>> Container for HashMap<K, V, H> {
|
||||
impl<K: Eq + Hash<S>, V, S, H: Hasher<S>> Collection for HashMap<K, V, H> {
|
||||
/// Return the number of elements in the map
|
||||
fn len(&self) -> uint { self.table.size() }
|
||||
}
|
||||
@ -1504,7 +1504,7 @@ fn eq(&self, other: &HashSet<T, H>) -> bool {
|
||||
|
||||
impl<T: Eq + Hash<S>, S, H: Hasher<S>> Eq for HashSet<T, H> {}
|
||||
|
||||
impl<T: Eq + Hash<S>, S, H: Hasher<S>> Container for HashSet<T, H> {
|
||||
impl<T: Eq + Hash<S>, S, H: Hasher<S>> Collection for HashSet<T, H> {
|
||||
fn len(&self) -> uint { self.map.len() }
|
||||
}
|
||||
|
||||
@ -2159,8 +2159,8 @@ mod test_set {
|
||||
use prelude::*;
|
||||
|
||||
use super::HashSet;
|
||||
use container::Container;
|
||||
use slice::ImmutableEqVector;
|
||||
use collections::Collection;
|
||||
|
||||
#[test]
|
||||
fn test_disjoint() {
|
||||
|
@ -38,8 +38,7 @@
|
||||
//! ```
|
||||
|
||||
use cmp::{PartialEq, Eq};
|
||||
use collections::HashMap;
|
||||
use container::{Container, Mutable, MutableMap};
|
||||
use collections::{HashMap, Collection, Mutable, MutableMap};
|
||||
use fmt;
|
||||
use hash::Hash;
|
||||
use iter::{range, Iterator};
|
||||
@ -227,7 +226,7 @@ fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
|
||||
}
|
||||
}
|
||||
|
||||
impl<K: Hash + Eq, V> Container for LruCache<K, V> {
|
||||
impl<K: Hash + Eq, V> Collection for LruCache<K, V> {
|
||||
/// Return the number of key-value pairs in the cache.
|
||||
fn len(&self) -> uint {
|
||||
self.map.len()
|
||||
|
@ -12,10 +12,12 @@
|
||||
* Collection types.
|
||||
*/
|
||||
|
||||
pub use core_collections::{Bitv, BitvSet, BTree, Deque, DList, EnumSet};
|
||||
pub use core_collections::{Collection, Mutable, Map, MutableMap};
|
||||
pub use core_collections::{Set, MutableSet, Deque};
|
||||
pub use core_collections::{Bitv, BitvSet, BTree, DList, EnumSet};
|
||||
pub use core_collections::{PriorityQueue, RingBuf, SmallIntMap};
|
||||
pub use core_collections::{TreeMap, TreeSet, TrieMap, TrieSet};
|
||||
pub use core_collections::{bitv, btree, deque, dlist, enum_set};
|
||||
pub use core_collections::{bitv, btree, dlist, enum_set};
|
||||
pub use core_collections::{priority_queue, ringbuf, smallintmap, treemap, trie};
|
||||
|
||||
pub use self::hashmap::{HashMap, HashSet};
|
||||
|
@ -33,7 +33,7 @@
|
||||
/// of a synchronous channel. There are a few branches for the unbuffered case,
|
||||
/// but they're mostly just relevant to blocking senders.
|
||||
|
||||
use container::Container;
|
||||
use collections::Collection;
|
||||
use iter::Iterator;
|
||||
use kinds::Send;
|
||||
use mem;
|
||||
|
@ -11,7 +11,7 @@
|
||||
//! Buffering wrappers for I/O traits
|
||||
|
||||
use cmp;
|
||||
use container::Container;
|
||||
use collections::Collection;
|
||||
use io::{Reader, Writer, Stream, Buffer, DEFAULT_BUF_SIZE, IoResult};
|
||||
use iter::ExactSize;
|
||||
use ops::Drop;
|
||||
|
@ -10,7 +10,7 @@
|
||||
|
||||
use clone::Clone;
|
||||
use cmp;
|
||||
use container::Container;
|
||||
use collections::Collection;
|
||||
use comm::{Sender, Receiver};
|
||||
use io;
|
||||
use option::{None, Option, Some};
|
||||
|
@ -15,7 +15,7 @@
|
||||
// FIXME: Not sure how this should be structured
|
||||
// FIXME: Iteration should probably be considered separately
|
||||
|
||||
use container::Container;
|
||||
use collections::Collection;
|
||||
use iter::Iterator;
|
||||
use option::{Option, Some, None};
|
||||
use result::{Ok, Err};
|
||||
@ -504,7 +504,7 @@ fn test_u64_from_be_bytes() {
|
||||
mod bench {
|
||||
extern crate test;
|
||||
|
||||
use container::Container;
|
||||
use collections::Collection;
|
||||
use prelude::*;
|
||||
use self::test::Bencher;
|
||||
|
||||
|
@ -51,7 +51,7 @@
|
||||
|
||||
use c_str::ToCStr;
|
||||
use clone::Clone;
|
||||
use container::Container;
|
||||
use collections::Collection;
|
||||
use io;
|
||||
use iter::Iterator;
|
||||
use kinds::Send;
|
||||
|
@ -11,7 +11,7 @@
|
||||
//! Readers and Writers for in-memory buffers
|
||||
|
||||
use cmp::min;
|
||||
use container::Container;
|
||||
use collections::Collection;
|
||||
use option::None;
|
||||
use result::{Err, Ok};
|
||||
use io;
|
||||
|
@ -214,7 +214,7 @@ fn file_product(p: &Path) -> IoResult<u32> {
|
||||
#![deny(unused_must_use)]
|
||||
|
||||
use char::Char;
|
||||
use container::Container;
|
||||
use collections::Collection;
|
||||
use fmt;
|
||||
use int;
|
||||
use iter::Iterator;
|
||||
|
@ -15,7 +15,7 @@
|
||||
|
||||
#![allow(missing_doc)]
|
||||
|
||||
use container::Container;
|
||||
use collections::Collection;
|
||||
use fmt;
|
||||
use from_str::FromStr;
|
||||
use iter::Iterator;
|
||||
|
@ -144,7 +144,6 @@
|
||||
pub use core::char;
|
||||
pub use core::clone;
|
||||
#[cfg(not(test))] pub use core::cmp;
|
||||
pub use core::container;
|
||||
pub use core::default;
|
||||
pub use core::finally;
|
||||
pub use core::intrinsics;
|
||||
|
@ -12,7 +12,7 @@
|
||||
|
||||
use char;
|
||||
use clone::Clone;
|
||||
use container::Container;
|
||||
use collections::Collection;
|
||||
use num::{NumCast, Zero, One, cast, Int};
|
||||
use num::{Float, FPNaN, FPInfinite, ToPrimitive};
|
||||
use num;
|
||||
|
@ -30,7 +30,7 @@
|
||||
#![allow(non_snake_case_functions)]
|
||||
|
||||
use clone::Clone;
|
||||
use container::Container;
|
||||
use collections::Collection;
|
||||
use fmt;
|
||||
use iter::Iterator;
|
||||
use libc::{c_void, c_int};
|
||||
|
@ -65,7 +65,7 @@
|
||||
|
||||
#![deny(deprecated_owned_vector)]
|
||||
|
||||
use container::Container;
|
||||
use collections::Collection;
|
||||
use c_str::CString;
|
||||
use clone::Clone;
|
||||
use fmt;
|
||||
|
@ -13,7 +13,7 @@
|
||||
use c_str::{CString, ToCStr};
|
||||
use clone::Clone;
|
||||
use cmp::{PartialEq, Eq};
|
||||
use container::Container;
|
||||
use collections::Collection;
|
||||
use from_str::FromStr;
|
||||
use hash;
|
||||
use io::Writer;
|
||||
|
@ -14,7 +14,7 @@
|
||||
use c_str::{CString, ToCStr};
|
||||
use clone::Clone;
|
||||
use cmp::{PartialEq, Eq};
|
||||
use container::Container;
|
||||
use collections::Collection;
|
||||
use from_str::FromStr;
|
||||
use hash;
|
||||
use io::Writer;
|
||||
|
@ -60,8 +60,8 @@
|
||||
#[doc(no_inline)] pub use clone::Clone;
|
||||
#[doc(no_inline)] pub use cmp::{PartialEq, PartialOrd, Eq, Ord};
|
||||
#[doc(no_inline)] pub use cmp::{Ordering, Less, Equal, Greater, Equiv};
|
||||
#[doc(no_inline)] pub use container::{Container, Mutable, Map, MutableMap};
|
||||
#[doc(no_inline)] pub use container::{Set, MutableSet};
|
||||
#[doc(no_inline)] pub use collections::{Collection, Mutable, Map, MutableMap};
|
||||
#[doc(no_inline)] pub use collections::{Set, MutableSet};
|
||||
#[doc(no_inline)] pub use iter::{FromIterator, Extendable, ExactSize};
|
||||
#[doc(no_inline)] pub use iter::{Iterator, DoubleEndedIterator};
|
||||
#[doc(no_inline)] pub use iter::{RandomAccessIterator, CloneableIterator};
|
||||
|
@ -62,7 +62,7 @@ fn fill_bytes(&mut self, v: &mut [u8]) {
|
||||
mod imp {
|
||||
extern crate libc;
|
||||
|
||||
use container::Container;
|
||||
use core_collections::Collection;
|
||||
use io::{IoResult, IoError};
|
||||
use mem;
|
||||
use ops::Drop;
|
||||
|
@ -10,7 +10,7 @@
|
||||
|
||||
//! A wrapper around any Reader to treat it as an RNG.
|
||||
|
||||
use container::Container;
|
||||
use collections::Collection;
|
||||
use io::Reader;
|
||||
use rand::Rng;
|
||||
use result::{Ok, Err};
|
||||
|
@ -13,7 +13,7 @@
|
||||
#![allow(non_camel_case_types)]
|
||||
|
||||
use char::Char;
|
||||
use container::Container;
|
||||
use collections::Collection;
|
||||
use from_str::from_str;
|
||||
use io::{IoResult, Writer};
|
||||
use iter::Iterator;
|
||||
@ -348,7 +348,7 @@ fn dladdr(addr: *libc::c_void,
|
||||
|
||||
#[cfg(not(target_os = "macos"))]
|
||||
fn print(w: &mut Writer, idx: int, addr: *libc::c_void) -> IoResult<()> {
|
||||
use container::Container;
|
||||
use collections::Collection;
|
||||
use iter::Iterator;
|
||||
use os;
|
||||
use path::GenericPath;
|
||||
@ -602,7 +602,7 @@ pub unsafe fn _Unwind_FindEnclosingFunction(pc: *libc::c_void)
|
||||
#[allow(dead_code, uppercase_variables)]
|
||||
mod imp {
|
||||
use c_str::CString;
|
||||
use container::Container;
|
||||
use core_collections::Collection;
|
||||
use intrinsics;
|
||||
use io::{IoResult, Writer};
|
||||
use libc;
|
||||
|
@ -121,7 +121,7 @@ fn eq(&self, other: &OwnedSlice<T>) -> bool {
|
||||
|
||||
impl<T: Eq> Eq for OwnedSlice<T> {}
|
||||
|
||||
impl<T> Container for OwnedSlice<T> {
|
||||
impl<T> Collection for OwnedSlice<T> {
|
||||
fn len(&self) -> uint { self.len }
|
||||
}
|
||||
|
||||
|
@ -23,7 +23,7 @@ enum SmallVectorRepr<T> {
|
||||
Many(Vec<T> ),
|
||||
}
|
||||
|
||||
impl<T> Container for SmallVector<T> {
|
||||
impl<T> Collection for SmallVector<T> {
|
||||
fn len(&self) -> uint {
|
||||
match self.repr {
|
||||
Zero => 0,
|
||||
|
@ -18,6 +18,6 @@ fn main() {
|
||||
let x: Box<HashMap<int, int>> = box HashMap::new();
|
||||
let x: Box<Map<int, int>> = x;
|
||||
let y: Box<Map<uint, int>> = box x;
|
||||
//~^ ERROR failed to find an implementation of trait core::container::Map<uint,int>
|
||||
// for ~core::container::Map<int,int>:Send
|
||||
//~^ ERROR failed to find an implementation of trait collections::Map<uint,int>
|
||||
// for ~collections::Map<int,int>:Send
|
||||
}
|
||||
|
@ -48,7 +48,7 @@ pub fn eat(&mut self) -> bool {
|
||||
}
|
||||
}
|
||||
|
||||
impl<T> Container for cat<T> {
|
||||
impl<T> Collection for cat<T> {
|
||||
fn len(&self) -> uint { self.meows as uint }
|
||||
fn is_empty(&self) -> bool { self.meows == 0 }
|
||||
}
|
||||
|
@ -10,7 +10,7 @@
|
||||
|
||||
extern crate collections;
|
||||
|
||||
use std::container::{Map, MutableMap};
|
||||
use std::collections::{Map, MutableMap};
|
||||
use std::str::{SendStr, Owned, Slice};
|
||||
use std::collections::HashMap;
|
||||
use std::option::Some;
|
||||
|
@ -10,7 +10,7 @@
|
||||
|
||||
extern crate collections;
|
||||
|
||||
use std::container::{ Map, MutableMap};
|
||||
use std::collections::{ Map, MutableMap};
|
||||
use std::str::{SendStr, Owned, Slice};
|
||||
use std::to_str::ToStr;
|
||||
use self::collections::TreeMap;
|
||||
|
Loading…
Reference in New Issue
Block a user