Struct zerovec::vecs::FlexZeroSlice
source · #[repr(C, packed(1))]pub struct FlexZeroSlice { /* private fields */ }
Expand description
A zero-copy “slice” that efficiently represents [usize]
.
Implementations§
source§impl FlexZeroSlice
impl FlexZeroSlice
sourcepub const fn new_empty() -> &'static Self
pub const fn new_empty() -> &'static Self
Constructs a new empty FlexZeroSlice
.
use zerovec::vecs::FlexZeroSlice;
const EMPTY_SLICE: &FlexZeroSlice = FlexZeroSlice::new_empty();
assert!(EMPTY_SLICE.is_empty());
assert_eq!(EMPTY_SLICE.len(), 0);
assert_eq!(EMPTY_SLICE.first(), None);
sourcepub const fn parse_byte_slice(bytes: &[u8]) -> Result<&Self, ZeroVecError>
pub const fn parse_byte_slice(bytes: &[u8]) -> Result<&Self, ZeroVecError>
Safely constructs a FlexZeroSlice
from a byte array.
§Examples
use zerovec::vecs::FlexZeroSlice;
const FZS: &FlexZeroSlice = match FlexZeroSlice::parse_byte_slice(&[
2, // width
0x42, 0x00, // first value
0x07, 0x09, // second value
0xFF, 0xFF, // third value
]) {
Ok(v) => v,
Err(_) => panic!("invalid bytes"),
};
assert!(!FZS.is_empty());
assert_eq!(FZS.len(), 3);
assert_eq!(FZS.first(), Some(0x0042));
assert_eq!(FZS.get(0), Some(0x0042));
assert_eq!(FZS.get(1), Some(0x0907));
assert_eq!(FZS.get(2), Some(0xFFFF));
assert_eq!(FZS.get(3), None);
assert_eq!(FZS.last(), Some(0xFFFF));
sourcepub const unsafe fn from_byte_slice_unchecked(bytes: &[u8]) -> &Self
pub const unsafe fn from_byte_slice_unchecked(bytes: &[u8]) -> &Self
Constructs a FlexZeroSlice
without checking invariants.
§Panics
Panics if bytes
is empty.
§Safety
Must be called on a valid FlexZeroSlice
byte array.
sourcepub fn as_bytes(&self) -> &[u8]
pub fn as_bytes(&self) -> &[u8]
Returns this slice as its underlying &[u8]
byte buffer representation.
Useful for serialization.
§Example
use zerovec::vecs::FlexZeroSlice;
let bytes: &[u8] = &[2, 0xD3, 0x00, 0x19, 0x01, 0xA5, 0x01, 0xCD, 0x80];
let fzv = FlexZeroSlice::parse_byte_slice(bytes).expect("valid bytes");
assert_eq!(bytes, fzv.as_bytes());
sourcepub const fn as_flexzerovec(&self) -> FlexZeroVec<'_>
pub const fn as_flexzerovec(&self) -> FlexZeroVec<'_>
Borrows this FlexZeroSlice
as a FlexZeroVec::Borrowed
.
sourcepub fn get(&self, index: usize) -> Option<usize>
pub fn get(&self, index: usize) -> Option<usize>
Gets the element at index
, or None
if index >= self.len()
.
§Examples
use zerovec::vecs::FlexZeroVec;
let fzv: FlexZeroVec = [22, 33].iter().copied().collect();
assert_eq!(fzv.get(0), Some(22));
assert_eq!(fzv.get(1), Some(33));
assert_eq!(fzv.get(2), None);
sourcepub unsafe fn get_unchecked(&self, index: usize) -> usize
pub unsafe fn get_unchecked(&self, index: usize) -> usize
sourcepub fn first(&self) -> Option<usize>
pub fn first(&self) -> Option<usize>
Gets the first element of the slice, or None
if the slice is empty.
sourcepub fn last(&self) -> Option<usize>
pub fn last(&self) -> Option<usize>
Gets the last element of the slice, or None
if the slice is empty.
sourcepub fn iter(
&self,
) -> impl DoubleEndedIterator<Item = usize> + '_ + ExactSizeIterator<Item = usize>
pub fn iter( &self, ) -> impl DoubleEndedIterator<Item = usize> + '_ + ExactSizeIterator<Item = usize>
Gets an iterator over the elements of the slice as usize
.
sourcepub fn iter_pairs(&self) -> impl Iterator<Item = (usize, Option<usize>)> + '_
pub fn iter_pairs(&self) -> impl Iterator<Item = (usize, Option<usize>)> + '_
Gets an iterator over pairs of elements.
The second element of the final pair is None
.
§Examples
use zerovec::vecs::FlexZeroVec;
let nums: &[usize] = &[211, 281, 421, 461];
let fzv: FlexZeroVec = nums.iter().copied().collect();
let mut pairs_it = fzv.iter_pairs();
assert_eq!(pairs_it.next(), Some((211, Some(281))));
assert_eq!(pairs_it.next(), Some((281, Some(421))));
assert_eq!(pairs_it.next(), Some((421, Some(461))));
assert_eq!(pairs_it.next(), Some((461, None)));
assert_eq!(pairs_it.next(), None);
sourcepub fn to_vec(&self) -> Vec<usize>
pub fn to_vec(&self) -> Vec<usize>
Creates a Vec<usize>
from a FlexZeroSlice
(or FlexZeroVec
).
§Examples
use zerovec::vecs::FlexZeroVec;
let nums: &[usize] = &[211, 281, 421, 461];
let fzv: FlexZeroVec = nums.iter().copied().collect();
let vec: Vec<usize> = fzv.to_vec();
assert_eq!(nums, vec.as_slice());
sourcepub fn binary_search(&self, needle: usize) -> Result<usize, usize>
pub fn binary_search(&self, needle: usize) -> Result<usize, usize>
Binary searches a sorted FlexZeroSlice
for the given usize
value.
§Examples
use zerovec::vecs::FlexZeroVec;
let nums: &[usize] = &[211, 281, 421, 461];
let fzv: FlexZeroVec = nums.iter().copied().collect();
assert_eq!(fzv.binary_search(0), Err(0));
assert_eq!(fzv.binary_search(211), Ok(0));
assert_eq!(fzv.binary_search(250), Err(1));
assert_eq!(fzv.binary_search(281), Ok(1));
assert_eq!(fzv.binary_search(300), Err(2));
assert_eq!(fzv.binary_search(421), Ok(2));
assert_eq!(fzv.binary_search(450), Err(3));
assert_eq!(fzv.binary_search(461), Ok(3));
assert_eq!(fzv.binary_search(462), Err(4));
sourcepub fn binary_search_in_range(
&self,
needle: usize,
range: Range<usize>,
) -> Option<Result<usize, usize>>
pub fn binary_search_in_range( &self, needle: usize, range: Range<usize>, ) -> Option<Result<usize, usize>>
Binary searches a sorted range of a FlexZeroSlice
for the given usize
value.
The indices in the return value are relative to the start of the range.
§Examples
use zerovec::vecs::FlexZeroVec;
// Make a FlexZeroVec with two sorted ranges: 0..3 and 3..5
let nums: &[usize] = &[111, 222, 444, 333, 555];
let fzv: FlexZeroVec = nums.iter().copied().collect();
// Search in the first range:
assert_eq!(fzv.binary_search_in_range(0, 0..3), Some(Err(0)));
assert_eq!(fzv.binary_search_in_range(111, 0..3), Some(Ok(0)));
assert_eq!(fzv.binary_search_in_range(199, 0..3), Some(Err(1)));
assert_eq!(fzv.binary_search_in_range(222, 0..3), Some(Ok(1)));
assert_eq!(fzv.binary_search_in_range(399, 0..3), Some(Err(2)));
assert_eq!(fzv.binary_search_in_range(444, 0..3), Some(Ok(2)));
assert_eq!(fzv.binary_search_in_range(999, 0..3), Some(Err(3)));
// Search in the second range:
assert_eq!(fzv.binary_search_in_range(0, 3..5), Some(Err(0)));
assert_eq!(fzv.binary_search_in_range(333, 3..5), Some(Ok(0)));
assert_eq!(fzv.binary_search_in_range(399, 3..5), Some(Err(1)));
assert_eq!(fzv.binary_search_in_range(555, 3..5), Some(Ok(1)));
assert_eq!(fzv.binary_search_in_range(999, 3..5), Some(Err(2)));
// Out-of-bounds range:
assert_eq!(fzv.binary_search_in_range(0, 4..6), None);
sourcepub fn binary_search_by(
&self,
predicate: impl FnMut(usize) -> Ordering,
) -> Result<usize, usize>
pub fn binary_search_by( &self, predicate: impl FnMut(usize) -> Ordering, ) -> Result<usize, usize>
Binary searches a sorted FlexZeroSlice
according to a predicate function.
sourcepub fn binary_search_in_range_by(
&self,
predicate: impl FnMut(usize) -> Ordering,
range: Range<usize>,
) -> Option<Result<usize, usize>>
pub fn binary_search_in_range_by( &self, predicate: impl FnMut(usize) -> Ordering, range: Range<usize>, ) -> Option<Result<usize, usize>>
Binary searches a sorted range of a FlexZeroSlice
according to a predicate function.
The indices in the return value are relative to the start of the range.
sourcepub fn binary_search_with_index(
&self,
predicate: impl FnMut(usize) -> Ordering,
) -> Result<usize, usize>
pub fn binary_search_with_index( &self, predicate: impl FnMut(usize) -> Ordering, ) -> Result<usize, usize>
Binary searches a FlexZeroSlice
by its indices.
The predicate
function is passed in-bounds indices into the FlexZeroSlice
.
sourcepub fn binary_search_in_range_with_index(
&self,
predicate: impl FnMut(usize) -> Ordering,
range: Range<usize>,
) -> Option<Result<usize, usize>>
pub fn binary_search_in_range_with_index( &self, predicate: impl FnMut(usize) -> Ordering, range: Range<usize>, ) -> Option<Result<usize, usize>>
Binary searches a range of a FlexZeroSlice
by its indices.
The predicate
function is passed in-bounds indices into the FlexZeroSlice
, which are
relative to the start of the entire slice.
The indices in the return value are relative to the start of the range.
Trait Implementations§
source§impl<'a> AsRef<FlexZeroSlice> for FlexZeroVec<'a>
impl<'a> AsRef<FlexZeroSlice> for FlexZeroVec<'a>
source§fn as_ref(&self) -> &FlexZeroSlice
fn as_ref(&self) -> &FlexZeroSlice
source§impl Debug for FlexZeroSlice
impl Debug for FlexZeroSlice
source§impl From<&FlexZeroSlice> for FlexZeroVecOwned
impl From<&FlexZeroSlice> for FlexZeroVecOwned
source§fn from(other: &FlexZeroSlice) -> Self
fn from(other: &FlexZeroSlice) -> Self
source§impl PartialEq for FlexZeroSlice
impl PartialEq for FlexZeroSlice
source§impl<'zf> ZeroFrom<'zf, FlexZeroSlice> for &'zf FlexZeroSlice
impl<'zf> ZeroFrom<'zf, FlexZeroSlice> for &'zf FlexZeroSlice
source§fn zero_from(other: &'zf FlexZeroSlice) -> Self
fn zero_from(other: &'zf FlexZeroSlice) -> Self
C
into a struct that may retain references into C
.source§impl<'zf> ZeroFrom<'zf, FlexZeroSlice> for FlexZeroVec<'zf>
impl<'zf> ZeroFrom<'zf, FlexZeroSlice> for FlexZeroVec<'zf>
source§fn zero_from(other: &'zf FlexZeroSlice) -> Self
fn zero_from(other: &'zf FlexZeroSlice) -> Self
C
into a struct that may retain references into C
.source§impl ZeroVecLike<usize> for FlexZeroSlice
impl ZeroVecLike<usize> for FlexZeroSlice
source§type SliceVariant = FlexZeroSlice
type SliceVariant = FlexZeroSlice
source§fn zvl_new_borrowed() -> &'static Self::SliceVariant
fn zvl_new_borrowed() -> &'static Self::SliceVariant
source§fn zvl_binary_search(&self, k: &usize) -> Result<usize, usize>
fn zvl_binary_search(&self, k: &usize) -> Result<usize, usize>
Ok(index)
if found,
returns Err(insert_index)
if not found, where insert_index
is the
index where it should be inserted to maintain sort order.source§fn zvl_binary_search_in_range(
&self,
k: &usize,
range: Range<usize>,
) -> Option<Result<usize, usize>>
fn zvl_binary_search_in_range( &self, k: &usize, range: Range<usize>, ) -> Option<Result<usize, usize>>
None
if the range is out of bounds, and
Ok
or Err
in the same way as zvl_binary_search
.
Indices are returned relative to the start of the range.source§fn zvl_binary_search_by(
&self,
predicate: impl FnMut(&usize) -> Ordering,
) -> Result<usize, usize>
fn zvl_binary_search_by( &self, predicate: impl FnMut(&usize) -> Ordering, ) -> Result<usize, usize>
Ok(index)
if found,
returns Err(insert_index)
if not found, where insert_index
is the
index where it should be inserted to maintain sort order.source§fn zvl_binary_search_in_range_by(
&self,
predicate: impl FnMut(&usize) -> Ordering,
range: Range<usize>,
) -> Option<Result<usize, usize>>
fn zvl_binary_search_in_range_by( &self, predicate: impl FnMut(&usize) -> Ordering, range: Range<usize>, ) -> Option<Result<usize, usize>>
None
if the range is out of bounds, and
Ok
or Err
in the same way as zvl_binary_search
.
Indices are returned relative to the start of the range.source§fn zvl_as_borrowed(&self) -> &FlexZeroSlice
fn zvl_as_borrowed(&self) -> &FlexZeroSlice
&self
. Read moresource§fn zvl_get_as_t<R>(g: &Self::GetType, f: impl FnOnce(&usize) -> R) -> R
fn zvl_get_as_t<R>(g: &Self::GetType, f: impl FnOnce(&usize) -> R) -> R
source§fn zvl_is_ascending(&self) -> boolwhere
T: Ord,
fn zvl_is_ascending(&self) -> boolwhere
T: Ord,
T
s Ord
impl