pub struct ClumpedOffsets<O = Vec<usize>> {
pub chunk_offsets: Offsets<O>,
pub offsets: Offsets<O>,
}Expand description
A collection of clumped offsets into another collection.
A version of Offsets that combines consecutive equidistant offsets.
§Example
To see the correspondence between Offsets and ClumpedOffsets, consider the following
example
use flatk::{Offsets, ClumpedOffsets};
// with `Offsets` we might have offsets like
let off = Offsets::new(vec![0, 3, 6, 9, 12, 16, 20, 24, 27, 30, 33, 36, 39]);
// which can be represented in `ClumpedOffsets` as
let clumped_off = ClumpedOffsets::new(vec![0, 4, 7, 12], vec![0, 12, 24, 39]);
// Note that ClumpedOffsets would be more compact if the triplets could be combined,
// which would require reorganizing the data indexed by the offsets.
assert_eq!(ClumpedOffsets::from(off), clumped_off);ClumpedOffsets can be a lot more memory efficient when a chunked collection is mostly
uniformly chunked. However, in the worst case, when each consecutive stride is different, this
representation can be three times the size of standard Offsets.
Fields§
§chunk_offsets: Offsets<O>§offsets: Offsets<O>Implementations§
Source§impl<O: AsRef<[usize]>> ClumpedOffsets<O>
impl<O: AsRef<[usize]>> ClumpedOffsets<O>
Sourcepub fn double_ended_sizes(&self) -> DEUnclumpedSizes<'_>
pub fn double_ended_sizes(&self) -> DEUnclumpedSizes<'_>
An iterator over effective (unclumped) sizes that implements DoubleEndedIterator.
§Notes
This iterator is used to implement the parallel sizes iterator to enable parallel iteration
of Chunked types with clumped offsets. However, this iterator can also be used as is for
efficient backwards iteration.
Sourcepub fn par_offset_values_and_sizes(
&self,
) -> ParUnclumpedOffsetValuesAndSizes<'_>
pub fn par_offset_values_and_sizes( &self, ) -> ParUnclumpedOffsetValuesAndSizes<'_>
Parallel version of offsets_and_sizes.
Source§impl<O: AsRef<[usize]>> ClumpedOffsets<O>
impl<O: AsRef<[usize]>> ClumpedOffsets<O>
pub fn first_chunk_offset_value(&self) -> usize
pub fn last_chunk_offset_value(&self) -> usize
Sourcepub fn num_clump_offsets(&self) -> usize
pub fn num_clump_offsets(&self) -> usize
Returns the number of clump offsets represented by ClumpedOffsets.
This is typically significantly smaller than self.num_offsets().
Sourcepub fn num_clumps(&self) -> usize
pub fn num_clumps(&self) -> usize
Returns the number of clumps represented by ClumpedOffsets.
Sourcepub fn clump_stride(&self, index: usize) -> usize
pub fn clump_stride(&self, index: usize) -> usize
Compute the stride of the clump at the given index.
§Panics
This function panics if index is greater than or equal to self.num_clumps().
Source§impl<O: AsRef<[usize]>> ClumpedOffsets<O>
impl<O: AsRef<[usize]>> ClumpedOffsets<O>
Sourcepub fn sizes(&self) -> UnclumpedSizes<'_> ⓘ
pub fn sizes(&self) -> UnclumpedSizes<'_> ⓘ
An iterator over effective (unclumped) sizes producing an increment for advancing the data pointer.
This helps for implementing iterators over Chunked types.
§Example
use flatk::{Offsets, ClumpedOffsets};
let off = Offsets::new(vec![0, 3, 6, 9, 12, 16, 20, 24, 27, 30, 33, 36, 39]);
let clumped = ClumpedOffsets::from(off);
let mut clumped_iter = clumped.sizes();
for _ in 0..4 {
assert_eq!(clumped_iter.next(), Some(3));
}
for _ in 0..3 {
assert_eq!(clumped_iter.next(), Some(4));
}
for _ in 0..5 {
assert_eq!(clumped_iter.next(), Some(3));
}
assert_eq!(clumped_iter.next(), None);Sourcepub fn iter(&self) -> impl Iterator<Item = usize> + '_
pub fn iter(&self) -> impl Iterator<Item = usize> + '_
An iterator over unclumped offsets.
This is equivalent to iterating over Offsets after conversion, but it doesn’t require any
additional allocations.
Sourcepub fn values(&self) -> UnclumpedOffsetValues<'_> ⓘ
pub fn values(&self) -> UnclumpedOffsetValues<'_> ⓘ
An iterator over unclumped offsets.
This is equivalent to iterating over Offsets after conversion, but it doesn’t require any
additional allocations.
Source§impl<O: AsRef<[usize]>> ClumpedOffsets<O>
impl<O: AsRef<[usize]>> ClumpedOffsets<O>
Sourcepub fn new(chunk_offsets: O, offsets: O) -> Self
pub fn new(chunk_offsets: O, offsets: O) -> Self
Construct new ClumpedOffsets from a given valid set of clumped offsets represented as an
array of usizes.
It is possible to create an invalid ClumpedOffsets struct using this constructor, however
it is safe.
§Panics
This function will panic if either chunk_offsets or offsets is empty.
Trait Implementations§
Source§impl Clear for ClumpedOffsets
impl Clear for ClumpedOffsets
Source§impl<O: Clone> Clone for ClumpedOffsets<O>
impl<O: Clone> Clone for ClumpedOffsets<O>
Source§fn clone(&self) -> ClumpedOffsets<O>
fn clone(&self) -> ClumpedOffsets<O>
1.0.0 · Source§fn clone_from(&mut self, source: &Self)
fn clone_from(&mut self, source: &Self)
source. Read moreSource§impl<O: Debug> Debug for ClumpedOffsets<O>
impl<O: Debug> Debug for ClumpedOffsets<O>
Source§impl<O: Dummy> Dummy for ClumpedOffsets<O>
A dummy set of offsets will not allocate, but the resulting type does not correspond to valid
offsets.
impl<O: Dummy> Dummy for ClumpedOffsets<O>
A dummy set of offsets will not allocate, but the resulting type does not correspond to valid offsets.
Source§impl Extend<(usize, usize)> for ClumpedOffsets
impl Extend<(usize, usize)> for ClumpedOffsets
Source§fn extend<T: IntoIterator<Item = (usize, usize)>>(&mut self, iter: T)
fn extend<T: IntoIterator<Item = (usize, usize)>>(&mut self, iter: T)
Extend this set of clumped offsets with a given iterator over chunk-offset and offset pairs.
This operation automatically shifts the merged offsets in the iterator
to start from the last offset in self.
Note that there will be 1 less offset added to self than produced by
iter since the first offset is only used to determine the relative
magnitude of the rest and corresponds to the last offset in self.
Source§fn extend_one(&mut self, item: A)
fn extend_one(&mut self, item: A)
extend_one)Source§fn extend_reserve(&mut self, additional: usize)
fn extend_reserve(&mut self, additional: usize)
extend_one)Source§impl<O: AsRef<[usize]> + Set> From<ClumpedOffsets<O>> for Offsets
impl<O: AsRef<[usize]> + Set> From<ClumpedOffsets<O>> for Offsets
Source§fn from(clumped_offsets: ClumpedOffsets<O>) -> Self
fn from(clumped_offsets: ClumpedOffsets<O>) -> Self
Convert ClumpedOffsets into owned Offsets.
This function causes allocations.
Source§impl<O: AsRef<[usize]> + Set> From<Offsets<O>> for ClumpedOffsets
impl<O: AsRef<[usize]> + Set> From<Offsets<O>> for ClumpedOffsets
Source§fn from(offsets: Offsets<O>) -> Self
fn from(offsets: Offsets<O>) -> Self
Convert Offsets to owned ClumpedOffsets.
This function causes allocations.
§Example
use flatk::{Offsets, ClumpedOffsets};
let offsets = Offsets::new(vec![0, 3, 6, 9, 12, 16, 20, 24, 27, 30, 33, 36, 39]);
let clumped_offsets = ClumpedOffsets::new(vec![0, 4, 7, 12], vec![0, 12, 24, 39]);
assert_eq!(ClumpedOffsets::from(offsets), clumped_offsets);Source§impl FromIterator<usize> for ClumpedOffsets
impl FromIterator<usize> for ClumpedOffsets
Source§impl<'a, O> GetIndex<'a, ClumpedOffsets<O>> for &usizewhere
ClumpedOffsets<O>: GetOffset,
impl<'a, O> GetIndex<'a, ClumpedOffsets<O>> for &usizewhere
ClumpedOffsets<O>: GetOffset,
Source§impl<'a, O> GetIndex<'a, ClumpedOffsets<O>> for usizewhere
ClumpedOffsets<O>: GetOffset,
impl<'a, O> GetIndex<'a, ClumpedOffsets<O>> for usizewhere
ClumpedOffsets<O>: GetOffset,
Source§impl<O: AsRef<[usize]>> GetOffset for ClumpedOffsets<O>
impl<O: AsRef<[usize]>> GetOffset for ClumpedOffsets<O>
Source§unsafe fn offset_value_unchecked(&self, index: usize) -> usize
unsafe fn offset_value_unchecked(&self, index: usize) -> usize
A version of offset_value without bounds checking.
§Safety
It is assumed that index is strictly less than self.num_offsets().
Source§fn num_offsets(&self) -> usize
fn num_offsets(&self) -> usize
Get the total number of offsets.
This is one more than the number of chunks represented.
Source§fn chunk_len(&self, chunk_index: usize) -> usize
fn chunk_len(&self, chunk_index: usize) -> usize
Source§unsafe fn chunk_len_unchecked(&self, chunk_index: usize) -> usize
unsafe fn chunk_len_unchecked(&self, chunk_index: usize) -> usize
Source§fn offset_value(&self, index: usize) -> usize
fn offset_value(&self, index: usize) -> usize
Source§fn offset(&self, index: usize) -> usize
fn offset(&self, index: usize) -> usize
data if index is equal to
self.len(). Read moreSource§unsafe fn offset_unchecked(&self, index: usize) -> usize
unsafe fn offset_unchecked(&self, index: usize) -> usize
offset without bounds checking. Read moreSource§fn last_offset(&self) -> usize
fn last_offset(&self) -> usize
Source§fn first_offset(&self) -> usize
fn first_offset(&self) -> usize
Source§fn last_offset_value(&self) -> usize
fn last_offset_value(&self) -> usize
Source§fn first_offset_value(&self) -> usize
fn first_offset_value(&self) -> usize
Source§impl<O> IndexRange for ClumpedOffsets<O>where
Self: GetOffset,
impl<O> IndexRange for ClumpedOffsets<O>where
Self: GetOffset,
Source§impl<'a> IntoOffsetValuesAndSizes for ClumpedOffsets<&'a [usize]>
impl<'a> IntoOffsetValuesAndSizes for ClumpedOffsets<&'a [usize]>
type Iter = UnclumpedOffsetValuesAndSizes<'a>
fn into_offset_values_and_sizes(self) -> UnclumpedOffsetValuesAndSizes<'a> ⓘ
Source§impl<O: IntoOwned> IntoOwned for ClumpedOffsets<O>
impl<O: IntoOwned> IntoOwned for ClumpedOffsets<O>
type Owned = ClumpedOffsets<<O as IntoOwned>::Owned>
fn into_owned(self) -> Self::Owned
fn clone_into(self, target: &mut Self::Owned)
Source§impl<'a> IntoParOffsetValuesAndSizes for ClumpedOffsets<&'a [usize]>
impl<'a> IntoParOffsetValuesAndSizes for ClumpedOffsets<&'a [usize]>
Source§impl<'a> IntoSizes for ClumpedOffsets<&'a [usize]>
impl<'a> IntoSizes for ClumpedOffsets<&'a [usize]>
Source§fn into_sizes(self) -> UnclumpedSizes<'a> ⓘ
fn into_sizes(self) -> UnclumpedSizes<'a> ⓘ
Returns an iterator over chunk sizes represented by the stored ClumpedOffsets.
type Iter = UnclumpedSizes<'a>
Source§impl<'a> IntoValues for ClumpedOffsets<&'a [usize]>
impl<'a> IntoValues for ClumpedOffsets<&'a [usize]>
Source§fn into_values(self) -> UnclumpedOffsetValues<'a> ⓘ
fn into_values(self) -> UnclumpedOffsetValues<'a> ⓘ
Returns an iterator over offset values represented by the stored Offsets.
type Iter = UnclumpedOffsetValues<'a>
Source§impl<O> IsolateIndex<ClumpedOffsets<O>> for usizewhere
ClumpedOffsets<O>: GetOffset,
impl<O> IsolateIndex<ClumpedOffsets<O>> for usizewhere
ClumpedOffsets<O>: GetOffset,
type Output = usize
Source§unsafe fn isolate_unchecked(
self,
clumped_offsets: ClumpedOffsets<O>,
) -> Self::Output
unsafe fn isolate_unchecked( self, clumped_offsets: ClumpedOffsets<O>, ) -> Self::Output
Source§fn try_isolate(self, clumped_offsets: ClumpedOffsets<O>) -> Option<Self::Output>
fn try_isolate(self, clumped_offsets: ClumpedOffsets<O>) -> Option<Self::Output>
Source§impl<O: PartialEq> PartialEq for ClumpedOffsets<O>
impl<O: PartialEq> PartialEq for ClumpedOffsets<O>
Source§impl<O: RemovePrefix + Set> RemovePrefix for ClumpedOffsets<O>
impl<O: RemovePrefix + Set> RemovePrefix for ClumpedOffsets<O>
Source§fn remove_prefix(&mut self, n: usize)
fn remove_prefix(&mut self, n: usize)
n elements from the beginning.Source§impl<O: Reserve> Reserve for ClumpedOffsets<O>
impl<O: Reserve> Reserve for ClumpedOffsets<O>
Source§impl<'a> SplitOffsetsAt for ClumpedOffsets<&'a [usize]>
impl<'a> SplitOffsetsAt for ClumpedOffsets<&'a [usize]>
Source§fn split_offsets_with_intersection_at(
self,
mid_off: usize,
) -> (ClumpedOffsets<&'a [usize]>, ClumpedOffsets<&'a [usize]>, usize)
fn split_offsets_with_intersection_at( self, mid_off: usize, ) -> (ClumpedOffsets<&'a [usize]>, ClumpedOffsets<&'a [usize]>, usize)
Same as split_offsets_at, but in addition, return the offset of the middle element
(intersection): this is the value offsets[mid] - offsets[0].
§Panics
Calling this function with an empty slice or with mid greater than or equal to its length
will cause a panic.
This function will also panic when trying to split a clump since the offsets cannot be modified or created.
Source§fn split_offsets_at(
self,
mid: usize,
) -> (ClumpedOffsets<&'a [usize]>, ClumpedOffsets<&'a [usize]>)
fn split_offsets_at( self, mid: usize, ) -> (ClumpedOffsets<&'a [usize]>, ClumpedOffsets<&'a [usize]>)
Splits clumped offsets at the given index into two such that each
resulting ClumpedOffsets is valid. This means that the element at index
mid is shared between the two outputs.
§Panics
Calling this function with an empty slice or with mid greater than or equal to its length
will cause a panic.
This function will also panic when trying to split a clump since the offsets cannot be modified or created.
Source§impl<O: Truncate> Truncate for ClumpedOffsets<O>
impl<O: Truncate> Truncate for ClumpedOffsets<O>
impl<O: Copy> Copy for ClumpedOffsets<O>
impl<O> StructuralPartialEq for ClumpedOffsets<O>
impl<O: Viewed> Viewed for ClumpedOffsets<O>
Auto Trait Implementations§
impl<O> Freeze for ClumpedOffsets<O>where
O: Freeze,
impl<O> RefUnwindSafe for ClumpedOffsets<O>where
O: RefUnwindSafe,
impl<O> Send for ClumpedOffsets<O>where
O: Send,
impl<O> Sync for ClumpedOffsets<O>where
O: Sync,
impl<O> Unpin for ClumpedOffsets<O>where
O: Unpin,
impl<O> UnwindSafe for ClumpedOffsets<O>where
O: UnwindSafe,
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Source§impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
Source§impl<'a, S, I> Get<'a, I> for Swhere
I: GetIndex<'a, S>,
impl<'a, S, I> Get<'a, I> for Swhere
I: GetIndex<'a, S>,
type Output = <I as GetIndex<'a, S>>::Output
fn get(&self, idx: I) -> Option<<I as GetIndex<'a, S>>::Output>
Source§fn at(&self, idx: I) -> Self::Output
fn at(&self, idx: I) -> Self::Output
get that will panic if the equivalent get call is None,
which typically means that the given index is out of bounds. Read more