pub struct ListView<'a, T> {
pub buf: &'a [u8],
pub offset: usize,
pub len: usize,
pub back: usize,
pub next: usize,
pub skip: &'a BitMask,
/* private fields */
}Expand description
A zero-copy, double-ended iterator and random-access view over an array stored in a flatbuffer.
§Memory layout
For inline elements (T::MODE == Inline):
offset → [elem_0_bytes][elem_1_bytes]...[elem_{len-1}_bytes]For offset elements (T::MODE == Offset):
offset → [fwd_off_0: u32][fwd_off_1: u32]...[fwd_off_{n-1}: u32]
↓ ↓
[elem_0 data] [elem_1 data] ...Each forward offset is relative to its own position:
abs_pos(i) = (offset + i*4) + forward_offset[i].
§Fields
buf— the buffer this view borrows from.offset— absolute byte position of the first element (or offset table).len— total number of elements including any skipped ones.next/back— iterator cursors forIteratorandDoubleEndedIterator. Both are indices into the list (0-based), starting at 0 / len and converging as elements are consumed.skip— unordered set of indices to omit during iteration. Empty (&[]) when no rows are skipped; the fast path is a singleis_empty()check so the non-skipping case is unchanged.
§Skip list
Call with_skip to attach a skip list after construction.
The slice does not need to be sorted. get and total_len / is_empty
are unaffected — they operate on the raw list. Only the iterator methods
(next, next_back) honour the skip list.
When the skip list is active ExactSizeIterator is not available because
the exact remaining count depends on how many skip indices fall within
[next, back), which is O(k) to compute. size_hint returns a
conservative upper bound of back - next.
Fields§
§buf: &'a [u8]§offset: usize§len: usize§back: usize§next: usize§skip: &'a BitMaskUnordered indices to skip during iteration. &[] when not skipping.
Implementations§
Source§impl<'a, T> ListView<'a, T>where
T: ReadAt<'a>,
impl<'a, T> ListView<'a, T>where
T: ReadAt<'a>,
Sourcepub fn new(buf: &'a [u8], offset: usize, len: usize) -> ListView<'a, T> ⓘ
pub fn new(buf: &'a [u8], offset: usize, len: usize) -> ListView<'a, T> ⓘ
Construct a new ListView anchored at offset with len elements.
No rows are skipped by default; call with_skip to
attach a skip list.
Sourcepub fn with_skip(self, skip: &'a BitMask) -> ListView<'a, T> ⓘ
pub fn with_skip(self, skip: &'a BitMask) -> ListView<'a, T> ⓘ
Attach an unordered skip list to this view.
Elements whose index appears anywhere in skip are silently omitted
by next() and next_back(). The slice does not need to be sorted.
get, total_len, and is_empty are not affected.
Replaces any previously attached skip list.
Sourcepub fn total_len(&self) -> usize
pub fn total_len(&self) -> usize
Total number of elements in this list, including skipped and already iterated ones.
Sourcepub fn is_empty(&self) -> bool
pub fn is_empty(&self) -> bool
Return true if the list contains no elements at all (ignores skip list).
Sourcepub fn abs_pos(&self, index: usize) -> usize
pub fn abs_pos(&self, index: usize) -> usize
Compute the absolute byte position of element index.
For inline types: offset + index * size_of::<T>().
For offset types: follows the forward-offset entry at
offset + index * 4 to get the element’s absolute position.
Sourcepub fn get(&self, index: usize) -> <T as ReadAt<'a>>::ReadOutput
pub fn get(&self, index: usize) -> <T as ReadAt<'a>>::ReadOutput
Random access to element at index. Panics if index >= len.
Ignores the skip list — always returns the element at that raw index.
For Offset- and Union-mode types a forward-offset entry of 0
signals an absent element; this returns [T::default_output()] with no
buffer read beyond the entry itself. Inline types (scalars, structs)
are always present and skip this check entirely — the branch folds away
at compile time because T::MODE is a const.
Sourcepub fn last_offset(&self) -> usize
pub fn last_offset(&self) -> usize
Absolute position of the last element.
Used by merge_string_list to compute the end of the string pool:
last_offset() + 4 + u32::read_at(buf, last_offset()) gives the
exclusive end of the last string’s bytes.
Sourcepub fn read_last(&self) -> <T as ReadAt<'a>>::ReadOutput
pub fn read_last(&self) -> <T as ReadAt<'a>>::ReadOutput
Decode and return the last element without advancing the iterator. Ignores the skip list.
Trait Implementations§
Source§impl<'a, T> DoubleEndedIterator for ListView<'a, T>where
T: ReadAt<'a>,
impl<'a, T> DoubleEndedIterator for ListView<'a, T>where
T: ReadAt<'a>,
Source§fn next_back(&mut self) -> Option<<T as ReadAt<'a>>::ReadOutput>
fn next_back(&mut self) -> Option<<T as ReadAt<'a>>::ReadOutput>
Source§fn advance_back_by(&mut self, n: usize) -> Result<(), NonZero<usize>>
fn advance_back_by(&mut self, n: usize) -> Result<(), NonZero<usize>>
iter_advance_by)n elements. Read more1.37.0 · Source§fn nth_back(&mut self, n: usize) -> Option<Self::Item>
fn nth_back(&mut self, n: usize) -> Option<Self::Item>
nth element from the end of the iterator. Read more1.27.0 · Source§fn try_rfold<B, F, R>(&mut self, init: B, f: F) -> R
fn try_rfold<B, F, R>(&mut self, init: B, f: F) -> R
Iterator::try_fold(): it takes
elements starting from the back of the iterator. Read moreSource§impl<'a, T> ExactSizeIterator for ListView<'a, T>where
T: ReadAt<'a>,
ExactSizeIterator is only implemented when no skip list is active, because
once skips are present the exact remaining count requires an O(k) scan over
the skip slice to count how many entries fall within [next, back).
impl<'a, T> ExactSizeIterator for ListView<'a, T>where
T: ReadAt<'a>,
ExactSizeIterator is only implemented when no skip list is active, because
once skips are present the exact remaining count requires an O(k) scan over
the skip slice to count how many entries fall within [next, back).
If you need the precise remaining count with an active skip list, compute it
as: (back - next) - skip.iter().filter(|&&i| i >= next && i < back).count()
Source§impl<'a> From<ListView<'a, String>> for Vec<String>
Collect a ListView<String> into an owned Vec<String>.
impl<'a> From<ListView<'a, String>> for Vec<String>
Collect a ListView<String> into an owned Vec<String>.
Source§impl<'a, T> From<ListView<'a, T>> for Vec<T>
Collect a ListView<T> into an owned Vec<T> for scalar/Pod types.
impl<'a, T> From<ListView<'a, T>> for Vec<T>
Collect a ListView<T> into an owned Vec<T> for scalar/Pod types.
Source§impl<'a, T> Iterator for ListView<'a, T>where
T: ReadAt<'a>,
impl<'a, T> Iterator for ListView<'a, T>where
T: ReadAt<'a>,
Source§fn next(&mut self) -> Option<<T as ReadAt<'a>>::ReadOutput>
fn next(&mut self) -> Option<<T as ReadAt<'a>>::ReadOutput>
Yield the next element from the front (lowest index), honouring the skip list.
Source§fn size_hint(&self) -> (usize, Option<usize>)
fn size_hint(&self) -> (usize, Option<usize>)
Upper bound is back - next; may be an overcount when a skip list is
active because some of those indices will be silently stepped over.
Source§type Item = <T as ReadAt<'a>>::ReadOutput
type Item = <T as ReadAt<'a>>::ReadOutput
Source§fn next_chunk<const N: usize>(
&mut self,
) -> Result<[Self::Item; N], IntoIter<Self::Item, N>>where
Self: Sized,
fn next_chunk<const N: usize>(
&mut self,
) -> Result<[Self::Item; N], IntoIter<Self::Item, N>>where
Self: Sized,
iter_next_chunk)N values. Read more1.0.0 · Source§fn count(self) -> usizewhere
Self: Sized,
fn count(self) -> usizewhere
Self: Sized,
1.0.0 · Source§fn last(self) -> Option<Self::Item>where
Self: Sized,
fn last(self) -> Option<Self::Item>where
Self: Sized,
Source§fn advance_by(&mut self, n: usize) -> Result<(), NonZero<usize>>
fn advance_by(&mut self, n: usize) -> Result<(), NonZero<usize>>
iter_advance_by)n elements. Read more1.0.0 · Source§fn nth(&mut self, n: usize) -> Option<Self::Item>
fn nth(&mut self, n: usize) -> Option<Self::Item>
nth element of the iterator. Read more1.28.0 · Source§fn step_by(self, step: usize) -> StepBy<Self> ⓘwhere
Self: Sized,
fn step_by(self, step: usize) -> StepBy<Self> ⓘwhere
Self: Sized,
1.0.0 · Source§fn chain<U>(self, other: U) -> Chain<Self, <U as IntoIterator>::IntoIter> ⓘ
fn chain<U>(self, other: U) -> Chain<Self, <U as IntoIterator>::IntoIter> ⓘ
1.0.0 · Source§fn zip<U>(self, other: U) -> Zip<Self, <U as IntoIterator>::IntoIter> ⓘwhere
Self: Sized,
U: IntoIterator,
fn zip<U>(self, other: U) -> Zip<Self, <U as IntoIterator>::IntoIter> ⓘwhere
Self: Sized,
U: IntoIterator,
Source§fn intersperse(self, separator: Self::Item) -> Intersperse<Self> ⓘ
fn intersperse(self, separator: Self::Item) -> Intersperse<Self> ⓘ
iter_intersperse)separator between items
of the original iterator. Read moreSource§fn intersperse_with<G>(self, separator: G) -> IntersperseWith<Self, G> ⓘ
fn intersperse_with<G>(self, separator: G) -> IntersperseWith<Self, G> ⓘ
iter_intersperse)separator
between items of the original iterator. Read more1.0.0 · Source§fn map<B, F>(self, f: F) -> Map<Self, F> ⓘ
fn map<B, F>(self, f: F) -> Map<Self, F> ⓘ
1.0.0 · Source§fn filter<P>(self, predicate: P) -> Filter<Self, P> ⓘ
fn filter<P>(self, predicate: P) -> Filter<Self, P> ⓘ
1.0.0 · Source§fn filter_map<B, F>(self, f: F) -> FilterMap<Self, F> ⓘ
fn filter_map<B, F>(self, f: F) -> FilterMap<Self, F> ⓘ
1.0.0 · Source§fn enumerate(self) -> Enumerate<Self> ⓘwhere
Self: Sized,
fn enumerate(self) -> Enumerate<Self> ⓘwhere
Self: Sized,
1.0.0 · Source§fn skip_while<P>(self, predicate: P) -> SkipWhile<Self, P> ⓘ
fn skip_while<P>(self, predicate: P) -> SkipWhile<Self, P> ⓘ
1.0.0 · Source§fn take_while<P>(self, predicate: P) -> TakeWhile<Self, P> ⓘ
fn take_while<P>(self, predicate: P) -> TakeWhile<Self, P> ⓘ
1.57.0 · Source§fn map_while<B, P>(self, predicate: P) -> MapWhile<Self, P> ⓘ
fn map_while<B, P>(self, predicate: P) -> MapWhile<Self, P> ⓘ
1.0.0 · Source§fn skip(self, n: usize) -> Skip<Self> ⓘwhere
Self: Sized,
fn skip(self, n: usize) -> Skip<Self> ⓘwhere
Self: Sized,
n elements. Read more1.0.0 · Source§fn take(self, n: usize) -> Take<Self> ⓘwhere
Self: Sized,
fn take(self, n: usize) -> Take<Self> ⓘwhere
Self: Sized,
n elements, or fewer
if the underlying iterator ends sooner. Read more1.0.0 · Source§fn flat_map<U, F>(self, f: F) -> FlatMap<Self, U, F> ⓘ
fn flat_map<U, F>(self, f: F) -> FlatMap<Self, U, F> ⓘ
1.29.0 · Source§fn flatten(self) -> Flatten<Self> ⓘ
fn flatten(self) -> Flatten<Self> ⓘ
Source§fn map_windows<F, R, const N: usize>(self, f: F) -> MapWindows<Self, F, N> ⓘ
fn map_windows<F, R, const N: usize>(self, f: F) -> MapWindows<Self, F, N> ⓘ
iter_map_windows)f for each contiguous window of size N over
self and returns an iterator over the outputs of f. Like slice::windows(),
the windows during mapping overlap as well. Read more1.0.0 · Source§fn inspect<F>(self, f: F) -> Inspect<Self, F> ⓘ
fn inspect<F>(self, f: F) -> Inspect<Self, F> ⓘ
1.0.0 · Source§fn by_ref(&mut self) -> &mut Selfwhere
Self: Sized,
fn by_ref(&mut self) -> &mut Selfwhere
Self: Sized,
Iterator. Read moreSource§fn try_collect<B>(
&mut self,
) -> <<Self::Item as Try>::Residual as Residual<B>>::TryType
fn try_collect<B>( &mut self, ) -> <<Self::Item as Try>::Residual as Residual<B>>::TryType
iterator_try_collect)Source§fn collect_into<E>(self, collection: &mut E) -> &mut E
fn collect_into<E>(self, collection: &mut E) -> &mut E
iter_collect_into)1.0.0 · Source§fn partition<B, F>(self, f: F) -> (B, B)
fn partition<B, F>(self, f: F) -> (B, B)
Source§fn partition_in_place<'a, T, P>(self, predicate: P) -> usize
fn partition_in_place<'a, T, P>(self, predicate: P) -> usize
iter_partition_in_place)true precede all those that return false.
Returns the number of true elements found. Read moreSource§fn is_partitioned<P>(self, predicate: P) -> bool
fn is_partitioned<P>(self, predicate: P) -> bool
iter_is_partitioned)true precede all those that return false. Read more1.27.0 · Source§fn try_fold<B, F, R>(&mut self, init: B, f: F) -> R
fn try_fold<B, F, R>(&mut self, init: B, f: F) -> R
1.27.0 · Source§fn try_for_each<F, R>(&mut self, f: F) -> R
fn try_for_each<F, R>(&mut self, f: F) -> R
1.0.0 · Source§fn fold<B, F>(self, init: B, f: F) -> B
fn fold<B, F>(self, init: B, f: F) -> B
1.51.0 · Source§fn reduce<F>(self, f: F) -> Option<Self::Item>
fn reduce<F>(self, f: F) -> Option<Self::Item>
Source§fn try_reduce<R>(
&mut self,
f: impl FnMut(Self::Item, Self::Item) -> R,
) -> <<R as Try>::Residual as Residual<Option<<R as Try>::Output>>>::TryType
fn try_reduce<R>( &mut self, f: impl FnMut(Self::Item, Self::Item) -> R, ) -> <<R as Try>::Residual as Residual<Option<<R as Try>::Output>>>::TryType
iterator_try_reduce)1.0.0 · Source§fn all<F>(&mut self, f: F) -> bool
fn all<F>(&mut self, f: F) -> bool
1.0.0 · Source§fn any<F>(&mut self, f: F) -> bool
fn any<F>(&mut self, f: F) -> bool
1.0.0 · Source§fn find<P>(&mut self, predicate: P) -> Option<Self::Item>
fn find<P>(&mut self, predicate: P) -> Option<Self::Item>
1.30.0 · Source§fn find_map<B, F>(&mut self, f: F) -> Option<B>
fn find_map<B, F>(&mut self, f: F) -> Option<B>
Source§fn try_find<R>(
&mut self,
f: impl FnMut(&Self::Item) -> R,
) -> <<R as Try>::Residual as Residual<Option<Self::Item>>>::TryType
fn try_find<R>( &mut self, f: impl FnMut(&Self::Item) -> R, ) -> <<R as Try>::Residual as Residual<Option<Self::Item>>>::TryType
try_find)1.0.0 · Source§fn position<P>(&mut self, predicate: P) -> Option<usize>
fn position<P>(&mut self, predicate: P) -> Option<usize>
1.0.0 · Source§fn rposition<P>(&mut self, predicate: P) -> Option<usize>
fn rposition<P>(&mut self, predicate: P) -> Option<usize>
1.0.0 · Source§fn max(self) -> Option<Self::Item>
fn max(self) -> Option<Self::Item>
1.0.0 · Source§fn min(self) -> Option<Self::Item>
fn min(self) -> Option<Self::Item>
1.6.0 · Source§fn max_by_key<B, F>(self, f: F) -> Option<Self::Item>
fn max_by_key<B, F>(self, f: F) -> Option<Self::Item>
1.15.0 · Source§fn max_by<F>(self, compare: F) -> Option<Self::Item>
fn max_by<F>(self, compare: F) -> Option<Self::Item>
1.6.0 · Source§fn min_by_key<B, F>(self, f: F) -> Option<Self::Item>
fn min_by_key<B, F>(self, f: F) -> Option<Self::Item>
1.15.0 · Source§fn min_by<F>(self, compare: F) -> Option<Self::Item>
fn min_by<F>(self, compare: F) -> Option<Self::Item>
1.0.0 · Source§fn rev(self) -> Rev<Self> ⓘwhere
Self: Sized + DoubleEndedIterator,
fn rev(self) -> Rev<Self> ⓘwhere
Self: Sized + DoubleEndedIterator,
1.0.0 · Source§fn unzip<A, B, FromA, FromB>(self) -> (FromA, FromB)
fn unzip<A, B, FromA, FromB>(self) -> (FromA, FromB)
1.36.0 · Source§fn copied<'a, T>(self) -> Copied<Self> ⓘ
fn copied<'a, T>(self) -> Copied<Self> ⓘ
Source§fn array_chunks<const N: usize>(self) -> ArrayChunks<Self, N> ⓘwhere
Self: Sized,
fn array_chunks<const N: usize>(self) -> ArrayChunks<Self, N> ⓘwhere
Self: Sized,
iter_array_chunks)N elements of the iterator at a time. Read more1.11.0 · Source§fn product<P>(self) -> P
fn product<P>(self) -> P
Source§fn cmp_by<I, F>(self, other: I, cmp: F) -> Ordering
fn cmp_by<I, F>(self, other: I, cmp: F) -> Ordering
iter_order_by)Iterator with those
of another with respect to the specified comparison function. Read more1.5.0 · Source§fn partial_cmp<I>(self, other: I) -> Option<Ordering>
fn partial_cmp<I>(self, other: I) -> Option<Ordering>
PartialOrd elements of
this Iterator with those of another. The comparison works like short-circuit
evaluation, returning a result without comparing the remaining elements.
As soon as an order can be determined, the evaluation stops and a result is returned. Read moreSource§fn partial_cmp_by<I, F>(self, other: I, partial_cmp: F) -> Option<Ordering>where
Self: Sized,
I: IntoIterator,
F: FnMut(Self::Item, <I as IntoIterator>::Item) -> Option<Ordering>,
fn partial_cmp_by<I, F>(self, other: I, partial_cmp: F) -> Option<Ordering>where
Self: Sized,
I: IntoIterator,
F: FnMut(Self::Item, <I as IntoIterator>::Item) -> Option<Ordering>,
iter_order_by)Iterator with those
of another with respect to the specified comparison function. Read moreSource§fn eq_by<I, F>(self, other: I, eq: F) -> bool
fn eq_by<I, F>(self, other: I, eq: F) -> bool
iter_order_by)1.5.0 · Source§fn lt<I>(self, other: I) -> bool
fn lt<I>(self, other: I) -> bool
Iterator are lexicographically
less than those of another. Read more1.5.0 · Source§fn le<I>(self, other: I) -> bool
fn le<I>(self, other: I) -> bool
Iterator are lexicographically
less or equal to those of another. Read more1.5.0 · Source§fn gt<I>(self, other: I) -> bool
fn gt<I>(self, other: I) -> bool
Iterator are lexicographically
greater than those of another. Read more1.5.0 · Source§fn ge<I>(self, other: I) -> bool
fn ge<I>(self, other: I) -> bool
Iterator are lexicographically
greater than or equal to those of another. Read more1.82.0 · Source§fn is_sorted(self) -> bool
fn is_sorted(self) -> bool
1.82.0 · Source§fn is_sorted_by<F>(self, compare: F) -> bool
fn is_sorted_by<F>(self, compare: F) -> bool
1.82.0 · Source§fn is_sorted_by_key<F, K>(self, f: F) -> bool
fn is_sorted_by_key<F, K>(self, f: F) -> bool
Source§impl<'a, T> ReadAt<'a> for ListView<'a, T>where
T: ReadAt<'a>,
ReadAt for ListView itself — allows nested arrays (Vec<Vec<T>>).
impl<'a, T> ReadAt<'a> for ListView<'a, T>where
T: ReadAt<'a>,
ReadAt for ListView itself — allows nested arrays (Vec<Vec<T>>).
Source§const MODE: DataType = DataType::Offset
const MODE: DataType = DataType::Offset
Source§type ReadOutput = ListView<'a, T>
type ReadOutput = ListView<'a, T>
read_at. For scalars this is Self; for strings
it is &'a str; for arrays it is ListView<'a, T>.Source§fn read_at(
buf: &'a [u8],
offset: usize,
) -> <ListView<'a, T> as ReadAt<'a>>::ReadOutput ⓘ
fn read_at( buf: &'a [u8], offset: usize, ) -> <ListView<'a, T> as ReadAt<'a>>::ReadOutput ⓘ
buf at absolute byte position offset.Source§fn default_output() -> ListView<'a, T> ⓘ
fn default_output() -> ListView<'a, T> ⓘ
ReadOutput. Read morefn read_with_tag_at(buf: &'a [u8], offset: usize, _tag: u8) -> Self::ReadOutput
Source§fn payload_block_end(_buf: &'a [u8], pos: usize) -> usizewhere
Self: Sized,
fn payload_block_end(_buf: &'a [u8], pos: usize) -> usizewhere
Self: Sized,
pos. Overridden by Table (→ view.block_end()), Struct (→ pos +
size_of), and String (→ pos + 4 + length). Default returns pos
(safe conservative fallback for scalars/unknown types).Source§impl<'a, T> Serialize for ListView<'a, T>
Serialize for ListView — enables zero-copy re-serialization of a
view directly into a new buffer without materializing a Vec.
impl<'a, T> Serialize for ListView<'a, T>
Serialize for ListView — enables zero-copy re-serialization of a
view directly into a new buffer without materializing a Vec.
For inline element types, the source bytes are memcopied directly from the view’s backing buffer slice — no element-by-element dispatch. For offset types, the offset table must be rewritten because absolute positions change in the destination buffer; element values are re-serialized individually.
const SIZE: usize = 4
Source§const MODE: DataType = DataType::Offset
const MODE: DataType = DataType::Offset
Inline)
or whether a 32-bit forward offset to the value is written instead
(Offset). This constant is inspected by parent arrays and tables
at compile time to choose the correct write strategy.Source§fn size_hint(&self) -> usize
fn size_hint(&self) -> usize
write_to and parent tables to call
ensure_capacity before entering the unchecked fast path.Source§fn write_to<B>(&self, buffer: &mut B) -> usizewhere
B: Buffer,
fn write_to<B>(&self, buffer: &mut B) -> usizewhere
B: Buffer,
buffer, calling ensure_capacity first.
Returns the slot of the outermost written unit (length prefix for arrays,
value start for scalars).Source§fn write_to_unchecked<B>(&self, buffer: &mut B) -> usizewhere
B: Buffer,
fn write_to_unchecked<B>(&self, buffer: &mut B) -> usizewhere
B: Buffer,
buffer without checking capacity first. Read moreSource§fn is_absent(&self) -> bool
fn is_absent(&self) -> bool
true if this value is the default/zero/absent state. Read more