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
11pub 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 pub fn as_slice(&self) -> &Slice<T> {
69 unsafe { self.iter_raw.slice.as_unsized(self.iter_raw.len) }
70 }
71
72 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 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);