diff options
| author | blake2-ppc <blake2-ppc> | 2013-07-18 17:38:17 +0200 |
|---|---|---|
| committer | blake2-ppc <blake2-ppc> | 2013-07-20 20:30:57 +0200 |
| commit | 24b6901b26f0bde00706a5cbc16ffc29296ea40d (patch) | |
| tree | f3eece8ac0576df1f1e57119a94a78944c2eedc6 /src/libstd/vec.rs | |
| parent | ffe2623e47d9c5a5914865a9556cb1298ca00058 (diff) | |
| download | rust-24b6901b26f0bde00706a5cbc16ffc29296ea40d.tar.gz rust-24b6901b26f0bde00706a5cbc16ffc29296ea40d.zip | |
std: Implement Clone for VecIterator and iterators using it
The theory is simple, the immutable iterators simply hold state variables (indicies or pointers) into frozen containers. We can freely clone these iterators, just like we can clone borrowed pointers. VecIterator needs a manual impl to handle the lifetime struct member.
Diffstat (limited to 'src/libstd/vec.rs')
| -rw-r--r-- | src/libstd/vec.rs | 17 |
1 files changed, 17 insertions, 0 deletions
diff --git a/src/libstd/vec.rs b/src/libstd/vec.rs index 03e94a902c1..877ee65b4d6 100644 --- a/src/libstd/vec.rs +++ b/src/libstd/vec.rs @@ -2232,6 +2232,10 @@ iterator!{impl VecIterator -> &'self T} double_ended_iterator!{impl VecIterator -> &'self T} pub type VecRevIterator<'self, T> = InvertIterator<&'self T, VecIterator<'self, T>>; +impl<'self, T> Clone for VecIterator<'self, T> { + fn clone(&self) -> VecIterator<'self, T> { *self } +} + //iterator!{struct VecMutIterator -> *mut T, &'self mut T} /// An iterator for mutating the elements of a vector. pub struct VecMutIterator<'self, T> { @@ -2244,6 +2248,7 @@ double_ended_iterator!{impl VecMutIterator -> &'self mut T} pub type VecMutRevIterator<'self, T> = InvertIterator<&'self mut T, VecMutIterator<'self, T>>; /// An iterator that moves out of a vector. +#[deriving(Clone)] pub struct VecConsumeIterator<T> { priv v: ~[T], priv idx: uint, @@ -2270,6 +2275,7 @@ impl<T> Iterator<T> for VecConsumeIterator<T> { } /// An iterator that moves out of a vector in reverse order. +#[deriving(Clone)] pub struct VecConsumeRevIterator<T> { priv v: ~[T] } @@ -3186,6 +3192,17 @@ mod tests { } #[test] + fn test_iter_clone() { + let xs = [1, 2, 5]; + let mut it = xs.iter(); + it.next(); + let mut jt = it.clone(); + assert_eq!(it.next(), jt.next()); + assert_eq!(it.next(), jt.next()); + assert_eq!(it.next(), jt.next()); + } + + #[test] fn test_mut_iterator() { use iterator::*; let mut xs = [1, 2, 3, 4, 5]; |
