soa_rs/
iter_mut.rs

1use crate::{
2    iter_raw::{iter_with_raw, IterRaw, IterRawAdapter},
3    Slice, SliceMut, SoaRaw, Soars,
4};
5use std::{
6    fmt::{self, Debug, Formatter},
7    iter::FusedIterator,
8    marker::PhantomData,
9};
10
11/// Mutable [`Slice`] iterator.
12///
13/// This struct is created by the [`iter_mut`] method.
14///
15/// [`Slice`]: crate::Slice
16/// [`iter_mut`]: crate::Slice::iter_mut
17pub struct IterMut<'a, T>
18where
19    T: 'a + Soars,
20{
21    pub(crate) iter_raw: IterRaw<T, Self>,
22    pub(crate) _marker: PhantomData<&'a mut T>,
23}
24
25impl<T> Debug for IterMut<'_, T>
26where
27    T: Soars,
28    for<'b> T::Ref<'b>: Debug,
29{
30    fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result {
31        write!(f, "{:?}", self.as_slice())
32    }
33}
34
35impl<T> Default for IterMut<'_, T>
36where
37    T: Soars,
38{
39    fn default() -> Self {
40        Self {
41            iter_raw: IterRaw {
42                slice: Slice::empty(),
43                len: 0,
44                adapter: PhantomData,
45            },
46            _marker: PhantomData,
47        }
48    }
49}
50
51impl<'a, T> IterRawAdapter<T> for IterMut<'a, T>
52where
53    T: Soars,
54{
55    type Item = T::RefMut<'a>;
56
57    unsafe fn item_from_raw(raw: <T as Soars>::Raw) -> Self::Item {
58        unsafe { raw.get_mut() }
59    }
60}
61
62impl<'a, T> IterMut<'a, T>
63where
64    T: Soars,
65{
66    /// Returns an immutable slice of all elements that have not been yielded
67    /// yet.
68    pub fn as_slice(&self) -> &Slice<T> {
69        unsafe { self.iter_raw.slice.as_unsized(self.iter_raw.len) }
70    }
71
72    /// Returns a mutable slice of all elements that have not been yielded yet.
73    pub fn as_mut_slice(&mut self) -> &mut Slice<T> {
74        unsafe { self.iter_raw.slice.as_unsized_mut(self.iter_raw.len) }
75    }
76
77    /// Returns a mutable slice of all elements that have not been yielded yet.
78    ///
79    /// To avoid creating `&mut` references that alias, this is forced to
80    /// consume the iterator.
81    pub fn into_slice(self) -> SliceMut<'a, T> {
82        SliceMut {
83            slice: self.iter_raw.slice,
84            len: self.iter_raw.len,
85            marker: PhantomData,
86        }
87    }
88}
89
90iter_with_raw!(IterMut<'a, T>, 'a);