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 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]);