Mutable iterator for CxxVector
diff --git a/src/cxx_vector.rs b/src/cxx_vector.rs
index 191b643..4bfb7a2 100644
--- a/src/cxx_vector.rs
+++ b/src/cxx_vector.rs
@@ -129,6 +129,11 @@
pub fn iter(&self) -> Iter<T> {
Iter { v: self, index: 0 }
}
+
+ /// Returns an iterator over elements of type `Pin<&mut T>`.
+ pub fn iter_mut(&mut self) -> IterMut<T> {
+ IterMut { v: self, index: 0 }
+ }
}
/// Iterator over elements of a `CxxVector` by shared reference.
@@ -180,6 +185,60 @@
impl<'a, T> FusedIterator for Iter<'a, T> where T: VectorElement {}
+/// Iterator over elements of a `CxxVector` by pinned mutable reference.
+///
+/// The iterator element type is `Pin<&'a mut T>`.
+pub struct IterMut<'a, T> {
+ v: &'a mut CxxVector<T>,
+ index: usize,
+}
+
+impl<'a, T> IntoIterator for &'a mut CxxVector<T>
+where
+ T: VectorElement,
+{
+ type Item = Pin<&'a mut T>;
+ type IntoIter = IterMut<'a, T>;
+
+ fn into_iter(self) -> Self::IntoIter {
+ self.iter_mut()
+ }
+}
+
+impl<'a, T> Iterator for IterMut<'a, T>
+where
+ T: VectorElement,
+{
+ type Item = Pin<&'a mut T>;
+
+ fn next(&mut self) -> Option<Self::Item> {
+ let next = self.v.get_mut(self.index)?;
+ self.index += 1;
+ // Extend lifetime to allow simultaneous holding of nonoverlapping
+ // elements, analogous to slice::split_first_mut.
+ unsafe {
+ let ptr = Pin::into_inner_unchecked(next) as *mut T;
+ Some(Pin::new_unchecked(&mut *ptr))
+ }
+ }
+
+ fn size_hint(&self) -> (usize, Option<usize>) {
+ let len = self.len();
+ (len, Some(len))
+ }
+}
+
+impl<'a, T> ExactSizeIterator for IterMut<'a, T>
+where
+ T: VectorElement,
+{
+ fn len(&self) -> usize {
+ self.v.len() - self.index
+ }
+}
+
+impl<'a, T> FusedIterator for IterMut<'a, T> where T: VectorElement {}
+
impl<T> Debug for CxxVector<T>
where
T: VectorElement + Debug,