pub struct SliceMut<'a, T>where
T: 'a + Soars,{ /* private fields */ }Expand description
Methods from Deref<Target = Slice<T>>§
Sourcepub fn len(&self) -> usize
pub fn len(&self) -> usize
Returns the number of elements in the slice, also referred to as its length.
§Examples
let soa = soa![Foo(1), Foo(2), Foo(3)];
assert_eq!(soa.len(), 3);Sourcepub fn is_empty(&self) -> bool
pub fn is_empty(&self) -> bool
Returns true if the slice contains no elements.
§Examples
let mut soa = Soa::<Foo>::new();
assert!(soa.is_empty());
soa.push(Foo(1));
assert!(!soa.is_empty());Sourcepub fn iter(&self) -> Iter<'_, T> ⓘ
pub fn iter(&self) -> Iter<'_, T> ⓘ
Returns an iterator over the elements.
The iterator yields all items from start to end.
§Examples
let soa = soa![Foo(1), Foo(2), Foo(4)];
let mut iter = soa.iter();
assert_eq!(iter.next(), Some(FooRef(&1)));
assert_eq!(iter.next(), Some(FooRef(&2)));
assert_eq!(iter.next(), Some(FooRef(&4)));
assert_eq!(iter.next(), None);Sourcepub fn iter_mut(&mut self) -> IterMut<'_, T> ⓘ
pub fn iter_mut(&mut self) -> IterMut<'_, T> ⓘ
Returns an iterator over the elements that allows modifying each value.
The iterator yields all items from start to end.
§Examples
let mut soa = soa![Foo(1), Foo(2), Foo(4)];
for mut elem in soa.iter_mut() {
*elem.0 *= 2;
}
assert_eq!(soa, soa![Foo(2), Foo(4), Foo(8)]);Sourcepub fn get<I>(&self, index: I) -> Option<I::Output<'_>>where
I: SoaIndex<T>,
pub fn get<I>(&self, index: I) -> Option<I::Output<'_>>where
I: SoaIndex<T>,
Returns a reference to an element or subslice depending on the type of index.
-
If given a position, returns a reference to the element at that position or None if out of bounds.
-
If given a range, returns the subslice corresponding to that range, or None if out of bounds.
§Examples
let soa = soa![Foo(10), Foo(40), Foo(30), Foo(20)];
assert_eq!(soa.get(1), Some(FooRef(&40)));
assert!(soa.get(4).is_none());
assert_eq!(soa.get(..), Some(soa![Foo(10), Foo(40), Foo(30), Foo(20)].as_slice()));
assert_eq!(soa.get(..2), Some(soa![Foo(10), Foo(40)].as_slice()));
assert_eq!(soa.get(..=2), Some(soa![Foo(10), Foo(40), Foo(30)].as_slice()));
assert_eq!(soa.get(2..), Some(soa![Foo(30), Foo(20)].as_slice()));
assert_eq!(soa.get(1..3), Some(soa![Foo(40), Foo(30)].as_slice()));
assert_eq!(soa.get(1..=3), Some(soa![Foo(40), Foo(30), Foo(20)].as_slice()));
assert!(soa.get(2..5).is_none());Sourcepub fn idx<I>(&self, index: I) -> I::Output<'_>where
I: SoaIndex<T>,
pub fn idx<I>(&self, index: I) -> I::Output<'_>where
I: SoaIndex<T>,
Returns a reference to the element at the given index.
This is similar to Index, which is not implementable for this type.
See get for a non-panicking version.
§Panics
Panics if the index is out-of-bounds, which is whenever
SoaIndex::get returns None.
§Examples
let soa = soa![Foo(10), Foo(40), Foo(30), Foo(90)];
assert_eq!(soa.idx(3), FooRef(&90));
assert_eq!(soa.idx(1..3), soa![Foo(40), Foo(30)]);Sourcepub fn idx_mut<I>(&mut self, index: I) -> I::OutputMut<'_>where
I: SoaIndex<T>,
pub fn idx_mut<I>(&mut self, index: I) -> I::OutputMut<'_>where
I: SoaIndex<T>,
Returns a mutable reference to the element at the given index.
This is similar to IndexMut, which is not implementable for this
type. See get_mut for a non-panicking version.
§Panics
Panics if the index is out-of-bounds, which is whenever
SoaIndex::get_mut returns None.
§Examples
let mut soa = soa![Foo(10), Foo(20), Foo(30)];
*soa.idx_mut(1).0 = 42;
assert_eq!(soa, soa![Foo(10), Foo(42), Foo(30)]);Sourcepub fn split_at(&self, mid: usize) -> (SliceRef<'_, T>, SliceRef<'_, T>)
pub fn split_at(&self, mid: usize) -> (SliceRef<'_, T>, SliceRef<'_, T>)
Divides one slice into two at an index.
The first will contain all indices from [0, mid) (excluding
the index mid itself) and the second will contain all
indices from [mid, len) (excluding the index len itself).
§Panics
Panics if mid > len. For a non-panicking alternative see
split_at_checked.
§Examples
let soa = soa![Foo(1), Foo(2), Foo(3), Foo(4), Foo(5)];
let (l, r) = soa.split_at(3);
assert_eq!(l, soa![Foo(1), Foo(2), Foo(3)]);
assert_eq!(r, soa![Foo(4), Foo(5)]);Sourcepub fn split_at_mut(&mut self, mid: usize) -> (SliceMut<'_, T>, SliceMut<'_, T>)
pub fn split_at_mut(&mut self, mid: usize) -> (SliceMut<'_, T>, SliceMut<'_, T>)
Divides one mutable slice into two at an index.
The first will contain all indices from [0, mid) (excluding
the index mid itself) and the second will contain all
indices from [mid, len) (excluding the index len itself).
§Panics
Panics if mid > len. For a non-panicking alternative see
split_at_mut_checked.
§Examples
let mut soa = soa![Foo(1), Foo(2), Foo(3), Foo(4), Foo(5)];
let (l, r) = soa.split_at_mut(3);
assert_eq!(l, soa![Foo(1), Foo(2), Foo(3)]);
assert_eq!(r, soa![Foo(4), Foo(5)]);Sourcepub fn split_at_checked(
&self,
mid: usize,
) -> Option<(SliceRef<'_, T>, SliceRef<'_, T>)>
pub fn split_at_checked( &self, mid: usize, ) -> Option<(SliceRef<'_, T>, SliceRef<'_, T>)>
Divides one slice into two at an index,
returning None if the slice is too short.
If mid ≤ len returns a pair of slices where the first will contain all
indices from [0, mid) (excluding the index mid itself) and the
second will contain all indices from [mid, len) (excluding the index
len itself).
Otherwise, if mid > len, returns None.
§Examples
let soa = soa![Foo(1), Foo(2), Foo(3), Foo(4)];
{
let (l, r) = soa.split_at_checked(0).unwrap();
assert_eq!(l, soa![]);
assert_eq!(r, soa);
}
{
let (l, r) = soa.split_at_checked(2).unwrap();
assert_eq!(l, soa![Foo(1), Foo(2)]);
assert_eq!(r, soa![Foo(3), Foo(4)]);
}
{
let (l, r) = soa.split_at_checked(4).unwrap();
assert_eq!(l, soa);
assert_eq!(r, soa![]);
}
assert_eq!(None, soa.split_at_checked(5));Sourcepub fn split_at_mut_checked(
&mut self,
mid: usize,
) -> Option<(SliceMut<'_, T>, SliceMut<'_, T>)>
pub fn split_at_mut_checked( &mut self, mid: usize, ) -> Option<(SliceMut<'_, T>, SliceMut<'_, T>)>
Divides one mutable slice into two at an index,
returning None if the slice is too short.
If mid ≤ len returns a pair of slices where the first will contain all
indices from [0, mid) (excluding the index mid itself) and the
second will contain all indices from [mid, len) (excluding the index
len itself).
Otherwise, if mid > len, returns None.
§Examples
let mut soa = soa![Foo(1), Foo(2), Foo(3), Foo(4)];
{
let (l, r) = soa.split_at_mut_checked(0).unwrap();
assert_eq!(l, soa![]);
assert_eq!(r, soa![Foo(1), Foo(2), Foo(3), Foo(4)]);
}
{
let (l, r) = soa.split_at_mut_checked(2).unwrap();
assert_eq!(l, soa![Foo(1), Foo(2)]);
assert_eq!(r, soa![Foo(3), Foo(4)]);
}
{
let (l, r) = soa.split_at_mut_checked(4).unwrap();
assert_eq!(l, soa![Foo(1), Foo(2), Foo(3), Foo(4)]);
assert_eq!(r, soa![]);
}
assert_eq!(None, soa.split_at_mut_checked(5));Sourcepub unsafe fn split_at_unchecked(
&self,
mid: usize,
) -> (SliceRef<'_, T>, SliceRef<'_, T>)
pub unsafe fn split_at_unchecked( &self, mid: usize, ) -> (SliceRef<'_, T>, SliceRef<'_, T>)
Divides one slice into two at an index without doing bounds checking.
The first will contain all indices from [0, mid) (excluding
the index mid itself) and the second will contain all
indices from [mid, len) (excluding the index len itself).
For a safe alternative, see split_at.
§Safety
Calling this method with an out-of-bounds index is undefined behavior, even if the resulting reference is not used.
§Examples
let soa = soa![Foo(1), Foo(2), Foo(3)];
let (l, r) = unsafe { soa.split_at_unchecked(2) };
assert_eq!(l, soa![Foo(1), Foo(2)]);
assert_eq!(r, soa![Foo(3)]);Sourcepub unsafe fn split_at_mut_unchecked(
&mut self,
mid: usize,
) -> (SliceMut<'_, T>, SliceMut<'_, T>)
pub unsafe fn split_at_mut_unchecked( &mut self, mid: usize, ) -> (SliceMut<'_, T>, SliceMut<'_, T>)
Divides one mutable slice into two at an index without doing bounds checking.
The first will contain all indices from [0, mid) (excluding
the index mid itself) and the second will contain all
indices from [mid, len) (excluding the index len itself).
For a safe alternative, see split_at_mut.
§Safety
Calling this method with an out-of-bounds index is undefined behavior, even if the resulting reference is not used.
§Examples
let mut soa = soa![Foo(1), Foo(2), Foo(3)];
let (l, r) = unsafe { soa.split_at_mut_unchecked(1) };
assert_eq!(l, soa![Foo(1)]);
assert_eq!(r, soa![Foo(2), Foo(3)]);Sourcepub fn swap(&mut self, a: usize, b: usize)
pub fn swap(&mut self, a: usize, b: usize)
Swaps the position of two elements.
§Arguments
a: The index of the first elementb: The index of the second element
§Panics
Panics if a or b is out of bounds.
§Examples
let mut soa = soa![Foo(0), Foo(1), Foo(2), Foo(3), Foo(4)];
soa.swap(2, 4);
assert_eq!(soa, soa![Foo(0), Foo(1), Foo(4), Foo(3), Foo(2)]);Sourcepub fn first(&self) -> Option<T::Ref<'_>>
pub fn first(&self) -> Option<T::Ref<'_>>
Returns the first element of the slice, or None if empty.
§Examples
let soa = soa![Foo(10), Foo(40), Foo(30)];
assert_eq!(soa.first(), Some(FooRef(&10)));
let soa = Soa::<Foo>::new();
assert_eq!(soa.first(), None);Sourcepub fn first_mut(&mut self) -> Option<T::RefMut<'_>>
pub fn first_mut(&mut self) -> Option<T::RefMut<'_>>
Returns a mutable reference to the first element of the slice, or None if empty.
§Examples
let mut soa = soa![Foo(0), Foo(1), Foo(2)];
if let Some(mut first) = soa.first_mut() {
*first.0 = 5;
}
assert_eq!(soa, soa![Foo(5), Foo(1), Foo(2)]);Sourcepub fn last(&self) -> Option<T::Ref<'_>>
pub fn last(&self) -> Option<T::Ref<'_>>
Returns the last element of the slice, or None if empty.
§Examples
let soa = soa![Foo(10), Foo(40), Foo(30)];
assert_eq!(soa.last(), Some(FooRef(&30)));
let soa = Soa::<Foo>::new();
assert_eq!(soa.last(), None);Sourcepub fn last_mut(&mut self) -> Option<T::RefMut<'_>>
pub fn last_mut(&mut self) -> Option<T::RefMut<'_>>
Returns a mutable reference to the last element of the slice, or None if empty.
§Examples
let mut soa = soa![Foo(0), Foo(1), Foo(2)];
if let Some(mut last) = soa.last_mut() {
*last.0 = 5;
}
assert_eq!(soa, soa![Foo(0), Foo(1), Foo(5)]);Sourcepub fn chunks_exact(&self, chunk_size: usize) -> ChunksExact<'_, T> ⓘ
pub fn chunks_exact(&self, chunk_size: usize) -> ChunksExact<'_, T> ⓘ
Returns an iterator over chunk_size elements of the slice at a time,
starting at the beginning of the slice.
The chunks are slices and do not overlap. If chunk_size does not divide
the length of the slice, then the last up to chunk_size-1 elements will
be omitted and can be retrieved from the remainder function of the
iterator.
Due to each chunk having exactly chunk_size elements, the compiler can
often optimize the resulting code better than in the case of chunks.
§Examples
let soa = soa![Foo('l'), Foo('o'), Foo('r'), Foo('e'), Foo('m')];
let mut iter = soa.chunks_exact(2);
assert_eq!(iter.next(), Some(soa![Foo('l'), Foo('o')].as_slice()));
assert_eq!(iter.next(), Some(soa![Foo('r'), Foo('e')].as_slice()));
assert!(iter.next().is_none());
assert_eq!(iter.remainder(), &soa![Foo('m')]);Sourcepub fn slices(&self) -> T::Slices<'_>
pub fn slices(&self) -> T::Slices<'_>
Returns a collection of slices for each field of the slice.
For convenience, slices can also be aquired using the getter methods for individual fields.
§Examples
let soa = soa![Foo { foo: 1, bar: 2 }, Foo { foo: 3, bar: 4 }];
let slices = soa.slices();
assert_eq!(slices.foo, soa.foo());
assert_eq!(slices.bar, soa.bar());Sourcepub fn slices_mut(&mut self) -> T::SlicesMut<'_>
pub fn slices_mut(&mut self) -> T::SlicesMut<'_>
Returns a collection of mutable slices for each field of the slice.
For convenience, individual mutable slices can also be aquired using the getter methods for individual fields. This method is necessary to be able to mutably borrow multiple SoA fields simultaneously.
§Examples
let mut soa = soa![Foo { foo: 1, bar: 0 }, Foo { foo: 2, bar: 0 }];
let slices = soa.slices_mut();
for (foo, bar) in slices.foo.iter().zip(slices.bar) {
*bar = foo * 2;
}
assert_eq!(soa.bar(), [2, 4]);