diff options
| author | bors <bors@rust-lang.org> | 2013-07-29 19:04:22 -0700 |
|---|---|---|
| committer | bors <bors@rust-lang.org> | 2013-07-29 19:04:22 -0700 |
| commit | e94e4d51ca01db908748ab79bafe3254bede645b (patch) | |
| tree | 304e61473a12f05f2def76160068ba68b579442e /src/libstd/vec.rs | |
| parent | bb996bf92edc5c9a34275bae6143f1ada73e6c7f (diff) | |
| parent | 99490ad5ba61b2ee69c2cdd70c70857eaf0b895f (diff) | |
| download | rust-e94e4d51ca01db908748ab79bafe3254bede645b.tar.gz rust-e94e4d51ca01db908748ab79bafe3254bede645b.zip | |
auto merge of #8120 : blake2-ppc/rust/iterator-fixes, r=thestinger
Implement RandomAccessIterator (RAI) where possible, for Iterator adaptors such as Map, Enumerate, Peek, Skip, Take, Cycle, where the adapted iterator is already RAI, and for collections where it is relevant (ringbuf and bitv). After discussion with thestinger, remove the RAI impl for VecMutIterator, we cannot soundly provide mutable access with this trait. Implement Extendable everywhere FromIterator is already implemented. Fixes issue #8108.
Diffstat (limited to 'src/libstd/vec.rs')
| -rw-r--r-- | src/libstd/vec.rs | 33 |
1 files changed, 14 insertions, 19 deletions
diff --git a/src/libstd/vec.rs b/src/libstd/vec.rs index fdfe357ae51..cfd28fcfc5e 100644 --- a/src/libstd/vec.rs +++ b/src/libstd/vec.rs @@ -2106,7 +2106,8 @@ macro_rules! iterator { #[inline] fn size_hint(&self) -> (uint, Option<uint>) { - let exact = self.indexable(); + let diff = (self.end as uint) - (self.ptr as uint); + let exact = diff / sys::nonzero_size_of::<T>(); (exact, Some(exact)) } } @@ -2134,23 +2135,19 @@ macro_rules! double_ended_iterator { } } -macro_rules! random_access_iterator { - (impl $name:ident -> $elem:ty) => { - impl<'self, T> RandomAccessIterator<$elem> for $name<'self, T> { - #[inline] - fn indexable(&self) -> uint { - let diff = (self.end as uint) - (self.ptr as uint); - diff / sys::nonzero_size_of::<T>() - } +impl<'self, T> RandomAccessIterator<&'self T> for VecIterator<'self, T> { + #[inline] + fn indexable(&self) -> uint { + let (exact, _) = self.size_hint(); + exact + } - fn idx(&self, index: uint) -> Option<$elem> { - unsafe { - if index < self.indexable() { - cast::transmute(self.ptr.offset(index)) - } else { - None - } - } + fn idx(&self, index: uint) -> Option<&'self T> { + unsafe { + if index < self.indexable() { + cast::transmute(self.ptr.offset(index)) + } else { + None } } } @@ -2165,7 +2162,6 @@ pub struct VecIterator<'self, T> { } iterator!{impl VecIterator -> &'self T} double_ended_iterator!{impl VecIterator -> &'self T} -random_access_iterator!{impl VecIterator -> &'self T} pub type RevIterator<'self, T> = Invert<VecIterator<'self, T>>; impl<'self, T> Clone for VecIterator<'self, T> { @@ -2181,7 +2177,6 @@ pub struct VecMutIterator<'self, T> { } iterator!{impl VecMutIterator -> &'self mut T} double_ended_iterator!{impl VecMutIterator -> &'self mut T} -random_access_iterator!{impl VecMutIterator -> &'self mut T} pub type MutRevIterator<'self, T> = Invert<VecMutIterator<'self, T>>; /// An iterator that moves out of a vector. |
