use std::slice;
use std::vec;
+use fold::MoveMap;
+
/// A vector type optimized for cases where the size is almost always 0 or 1
pub struct SmallVector<T> {
repr: SmallVectorRepr<T>,
enum SmallVectorRepr<T> {
Zero,
One(T),
- Many(Vec<T> ),
+ Many(Vec<T>),
}
impl<T> Collection for SmallVector<T> {
pub fn as_slice<'a>(&'a self) -> &'a [T] {
match self.repr {
- Zero => &[],
+ Zero => {
+ let result: &[T] = &[];
+ result
+ }
One(ref v) => slice::ref_slice(v),
Many(ref vs) => vs.as_slice()
}
}
pub fn push_all(&mut self, other: SmallVector<T>) {
- for v in other.move_iter() {
+ for v in other.into_iter() {
self.push(v);
}
}
One(v) => v,
Many(v) => {
if v.len() == 1 {
- v.move_iter().next().unwrap()
+ v.into_iter().next().unwrap()
} else {
fail!(err)
}
}
}
+ /// Deprecated: use `into_iter`.
+ #[deprecated = "use into_iter"]
pub fn move_iter(self) -> MoveItems<T> {
+ self.into_iter()
+ }
+
+ pub fn into_iter(self) -> MoveItems<T> {
let repr = match self.repr {
Zero => ZeroIterator,
One(v) => OneIterator(v),
- Many(vs) => ManyIterator(vs.move_iter())
+ Many(vs) => ManyIterator(vs.into_iter())
};
MoveItems { repr: repr }
}
}
}
+impl<T> MoveMap<T> for SmallVector<T> {
+ fn move_map(self, f: |T| -> T) -> SmallVector<T> {
+ let repr = match self.repr {
+ Zero => Zero,
+ One(v) => One(f(v)),
+ Many(vs) => Many(vs.move_map(f))
+ };
+ SmallVector { repr: repr }
+ }
+}
+
#[cfg(test)]
mod test {
use super::*;
let v: SmallVector<int> = SmallVector::zero();
assert_eq!(0, v.len());
- assert_eq!(1, SmallVector::one(1).len());
- assert_eq!(5, SmallVector::many(vec!(1, 2, 3, 4, 5)).len());
+ assert_eq!(1, SmallVector::one(1i).len());
+ assert_eq!(5, SmallVector::many(vec!(1i, 2, 3, 4, 5)).len());
}
#[test]
#[test]
fn test_from_iter() {
- let v: SmallVector<int> = (vec!(1i, 2, 3)).move_iter().collect();
+ let v: SmallVector<int> = (vec!(1i, 2, 3)).into_iter().collect();
assert_eq!(3, v.len());
assert_eq!(&1, v.get(0));
assert_eq!(&2, v.get(1));
#[test]
fn test_move_iter() {
let v = SmallVector::zero();
- let v: Vec<int> = v.move_iter().collect();
+ let v: Vec<int> = v.into_iter().collect();
assert_eq!(Vec::new(), v);
let v = SmallVector::one(1i);
- assert_eq!(vec!(1i), v.move_iter().collect());
+ assert_eq!(vec!(1i), v.into_iter().collect());
let v = SmallVector::many(vec!(1i, 2i, 3i));
- assert_eq!(vec!(1i, 2i, 3i), v.move_iter().collect());
+ assert_eq!(vec!(1i, 2i, 3i), v.into_iter().collect());
}
#[test]
#[test]
#[should_fail]
fn test_expect_one_many() {
- SmallVector::many(vec!(1, 2)).expect_one("");
+ SmallVector::many(vec!(1i, 2)).expect_one("");
}
#[test]