From 101498cd880431fc44401ffa73fd8936ebe84025 Mon Sep 17 00:00:00 2001 From: Edward Wang Date: Wed, 25 Feb 2015 18:11:23 +0800 Subject: [PATCH] Tweak VecDeque's IterMut implementation So it is symmetric to its `Iter` implementation. Also kills an FIXME. --- src/libcollections/vec_deque.rs | 24 +++++++++--------------- 1 file changed, 9 insertions(+), 15 deletions(-) diff --git a/src/libcollections/vec_deque.rs b/src/libcollections/vec_deque.rs index e99d44551d5..4a2f7e378f7 100644 --- a/src/libcollections/vec_deque.rs +++ b/src/libcollections/vec_deque.rs @@ -24,7 +24,6 @@ use core::cmp::Ordering; use core::default::Default; use core::fmt; use core::iter::{self, repeat, FromIterator, IntoIterator, RandomAccessIterator}; -use core::marker; use core::mem; use core::num::{Int, UnsignedInt}; use core::ops::{Index, IndexMut}; @@ -545,9 +544,7 @@ impl VecDeque { IterMut { tail: self.tail, head: self.head, - cap: self.cap, - ptr: *self.ptr, - marker: marker::PhantomData, + ring: unsafe { self.buffer_as_mut_slice() }, } } @@ -1515,17 +1512,12 @@ impl<'a, T> RandomAccessIterator for Iter<'a, T> { } } -// FIXME This was implemented differently from Iter because of a problem -// with returning the mutable reference. I couldn't find a way to -// make the lifetime checker happy so, but there should be a way. /// `VecDeque` mutable iterator. #[stable(feature = "rust1", since = "1.0.0")] pub struct IterMut<'a, T:'a> { - ptr: *mut T, + ring: &'a mut [T], tail: usize, head: usize, - cap: usize, - marker: marker::PhantomData<&'a mut T>, } #[stable(feature = "rust1", since = "1.0.0")] @@ -1538,16 +1530,17 @@ impl<'a, T> Iterator for IterMut<'a, T> { return None; } let tail = self.tail; - self.tail = wrap_index(self.tail + 1, self.cap); + self.tail = wrap_index(self.tail + 1, self.ring.len()); unsafe { - Some(&mut *self.ptr.offset(tail as isize)) + let elem = self.ring.get_unchecked_mut(tail); + Some(&mut *(elem as *mut _)) } } #[inline] fn size_hint(&self) -> (usize, Option) { - let len = count(self.tail, self.head, self.cap); + let len = count(self.tail, self.head, self.ring.len()); (len, Some(len)) } } @@ -1559,10 +1552,11 @@ impl<'a, T> DoubleEndedIterator for IterMut<'a, T> { if self.tail == self.head { return None; } - self.head = wrap_index(self.head - 1, self.cap); + self.head = wrap_index(self.head - 1, self.ring.len()); unsafe { - Some(&mut *self.ptr.offset(self.head as isize)) + let elem = self.ring.get_unchecked_mut(self.head); + Some(&mut *(elem as *mut _)) } } }