#[repr(transparent)]
pub struct ZeroSlice<T: AsULE>(_);
Expand description

A zero-copy “slice”, i.e. the zero-copy version of [T]. This behaves similarly to ZeroVec<T>, however ZeroVec<T> is allowed to contain owned data and as such is ideal for deserialization since most human readable serialization formats cannot unconditionally deserialize zero-copy.

This type can be used inside VarZeroVec<T> and ZeroMap: This essentially allows for the construction of zero-copy types isomorphic to Vec<Vec<T>> by instead using VarZeroVec<ZeroSlice<T>>. See the VarZeroVec docs for an example.

Examples

Const-construct a ZeroSlice of u16:

use zerovec::ule::AsULE;
use zerovec::ZeroSlice;

const DATA: &ZeroSlice<u16> =
    ZeroSlice::<u16>::from_ule_slice(&<u16 as AsULE>::ULE::from_array([
        211, 281, 421, 32973,
    ]));

assert_eq!(DATA.get(1), Some(281));

Implementations

Returns an empty slice.

Get this ZeroSlice as a borrowed ZeroVec

ZeroSlice does not have most of the methods that ZeroVec does, so it is recommended to convert it to a ZeroVec before doing anything.

Attempt to construct a &ZeroSlice<T> from a byte slice, returning an error if it’s not a valid byte sequence

Uses a &[u8] buffer as a ZeroVec<T> without any verification.

Safety

bytes need to be an output from ZeroSlice::as_bytes().

Construct a &ZeroSlice<T> from a slice of ULEs.

This function can be used for constructing ZeroVecs in a const context, avoiding parsing checks.

See ZeroSlice for an example.

Construct a Box<ZeroSlice<T>> from a boxed slice of ULEs

Returns this slice as its underlying &[u8] byte buffer representation.

Useful for serialization.

Example
use zerovec::ZeroVec;

// The little-endian bytes correspond to the numbers on the following line.
let bytes: &[u8] = &[0xD3, 0x00, 0x19, 0x01, 0xA5, 0x01, 0xCD, 0x80];
let nums: &[u16] = &[211, 281, 421, 32973];

let zerovec = ZeroVec::alloc_from_slice(nums);

assert_eq!(bytes, zerovec.as_bytes());

Dereferences this slice as &[T::ULE].

Returns the number of elements in this slice.

Example
use zerovec::ule::AsULE;
use zerovec::ZeroVec;

let bytes: &[u8] = &[0xD3, 0x00, 0x19, 0x01, 0xA5, 0x01, 0xCD, 0x80];
let zerovec: ZeroVec<u16> =
    ZeroVec::parse_byte_slice(bytes).expect("infallible");

assert_eq!(4, zerovec.len());
assert_eq!(
    bytes.len(),
    zerovec.len() * std::mem::size_of::<<u16 as AsULE>::ULE>()
);

Returns whether this slice is empty.

Example
use zerovec::ZeroVec;

let bytes: &[u8] = &[0xD3, 0x00, 0x19, 0x01, 0xA5, 0x01, 0xCD, 0x80];
let zerovec: ZeroVec<u16> =
    ZeroVec::parse_byte_slice(bytes).expect("infallible");
assert!(!zerovec.is_empty());

let emptyvec: ZeroVec<u16> =
    ZeroVec::parse_byte_slice(&[]).expect("infallible");
assert!(emptyvec.is_empty());

Gets the element at the specified index. Returns None if out of range.

Example
use zerovec::ZeroVec;

let bytes: &[u8] = &[0xD3, 0x00, 0x19, 0x01, 0xA5, 0x01, 0xCD, 0x80];
let zerovec: ZeroVec<u16> =
    ZeroVec::parse_byte_slice(bytes).expect("infallible");

assert_eq!(zerovec.get(2), Some(421));
assert_eq!(zerovec.get(4), None);

Gets a subslice of elements within a certain range. Returns None if the range is out of bounds of this ZeroSlice.

Example
use zerovec::ZeroVec;

let bytes: &[u8] = &[0xD3, 0x00, 0x19, 0x01, 0xA5, 0x01, 0xCD, 0x80];
let zerovec: ZeroVec<u16> =
    ZeroVec::parse_byte_slice(bytes).expect("infallible");

assert_eq!(
    zerovec.get_subslice(1..3),
    Some(&*ZeroVec::from_slice_or_alloc(&[0x0119, 0x01A5]))
);
assert_eq!(zerovec.get_subslice(3..5), None);

Get a borrowed reference to the underlying ULE type at a specified index.

Prefer Self::get() over this method where possible since working directly with ULE types is less ergonomic

Casts a ZeroSlice<T> to a compatible ZeroSlice<P>.

T and P are compatible if they have the same ULE representation.

If the ULEs of T and P are different, use Self::try_as_converted().

Examples
use zerovec::ZeroSlice;

const bytes: &[u8] = &[0xD3, 0x00, 0x19, 0x01, 0xA5, 0x01, 0xCD, 0x80];
const zs_u16: &ZeroSlice<u16> = {
    match ZeroSlice::<u16>::try_from_bytes(bytes) {
        Ok(s) => s,
        Err(_) => unreachable!(),
    }
};

let zs_i16: &ZeroSlice<i16> = zs_u16.cast();

assert_eq!(zs_u16.get(3), Some(32973));
assert_eq!(zs_i16.get(3), Some(-32563));

Converts a &ZeroSlice<T> into a &ZeroSlice<P>.

The resulting slice will have the same length as the original slice if and only if T::ULE and P::ULE are the same size.

If T and P have the exact same ULE, use Self::cast().

Examples
use zerovec::ZeroSlice;

const bytes: &[u8] = &[0x7F, 0xF3, 0x01, 0x00, 0x49, 0xF6, 0x01, 0x00];
const zs_u32: &ZeroSlice<u32> = {
    match ZeroSlice::<u32>::try_from_bytes(bytes) {
        Ok(s) => s,
        Err(_) => unreachable!(),
    }
};

let zs_u8_4: &ZeroSlice<[u8; 4]> =
    zs_u32.try_as_converted().expect("valid code points");

assert_eq!(zs_u32.get(0), Some(127871));
assert_eq!(zs_u8_4.get(0), Some([0x7F, 0xF3, 0x01, 0x00]));

Gets the first element. Returns None if empty.

Example
use zerovec::ZeroVec;

let bytes: &[u8] = &[0xD3, 0x00, 0x19, 0x01, 0xA5, 0x01, 0xCD, 0x80];
let zerovec: ZeroVec<u16> =
    ZeroVec::parse_byte_slice(bytes).expect("infallible");

assert_eq!(zerovec.first(), Some(211));

Gets the last element. Returns None if empty.

Example
use zerovec::ZeroVec;

let bytes: &[u8] = &[0xD3, 0x00, 0x19, 0x01, 0xA5, 0x01, 0xCD, 0x80];
let zerovec: ZeroVec<u16> =
    ZeroVec::parse_byte_slice(bytes).expect("infallible");

assert_eq!(zerovec.last(), Some(32973));

Gets an iterator over the elements.

Example
use zerovec::ZeroVec;

let bytes: &[u8] = &[0xD3, 0x00, 0x19, 0x01, 0xA5, 0x01, 0xCD, 0x80];
let zerovec: ZeroVec<u16> =
    ZeroVec::parse_byte_slice(bytes).expect("infallible");
let mut it = zerovec.iter();

assert_eq!(it.next(), Some(211));
assert_eq!(it.next(), Some(281));
assert_eq!(it.next(), Some(421));
assert_eq!(it.next(), Some(32973));
assert_eq!(it.next(), None);

Returns a tuple with the first element and a subslice of the remaining elements.

Example
use zerovec::ule::AsULE;
use zerovec::ZeroSlice;

const DATA: &ZeroSlice<u16> =
    ZeroSlice::<u16>::from_ule_slice(&<u16 as AsULE>::ULE::from_array([
        211, 281, 421, 32973,
    ]));
const EXPECTED_VALUE: (u16, &ZeroSlice<u16>) = (
    211,
    ZeroSlice::<u16>::from_ule_slice(&<u16 as AsULE>::ULE::from_array([
        281, 421, 32973,
    ])),
);
assert_eq!(EXPECTED_VALUE, DATA.split_first().unwrap());

Binary searches a sorted ZeroVec<T> for the given element. For more information, see the primitive function binary_search.

Example
use zerovec::ZeroVec;

let bytes: &[u8] = &[0xD3, 0x00, 0x19, 0x01, 0xA5, 0x01, 0xCD, 0x80];
let zerovec: ZeroVec<u16> =
    ZeroVec::parse_byte_slice(bytes).expect("infallible");

assert_eq!(zerovec.binary_search(&281), Ok(1));
assert_eq!(zerovec.binary_search(&282), Err(2));

Binary searches a sorted ZeroVec<T> based on a given predicate. For more information, see the primitive function binary_search_by.

Example
use zerovec::ZeroVec;

let bytes: &[u8] = &[0xD3, 0x00, 0x19, 0x01, 0xA5, 0x01, 0xCD, 0x80];
let zerovec: ZeroVec<u16> =
    ZeroVec::parse_byte_slice(bytes).expect("infallible");

assert_eq!(zerovec.binary_search_by(|x| x.cmp(&281)), Ok(1));
assert_eq!(zerovec.binary_search_by(|x| x.cmp(&282)), Err(2));

This function can be used for constructing ZeroVecs in a const context, avoiding parsing checks.

This cannot be generic over T because of current limitations in const, but if this method is needed in a non-const context, check out ZeroSlice::parse_byte_slice() instead.

See ZeroSlice::cast() for an example.

This function can be used for constructing ZeroVecs in a const context, avoiding parsing checks.

This cannot be generic over T because of current limitations in const, but if this method is needed in a non-const context, check out ZeroSlice::parse_byte_slice() instead.

See ZeroSlice::cast() for an example.

This function can be used for constructing ZeroVecs in a const context, avoiding parsing checks.

This cannot be generic over T because of current limitations in const, but if this method is needed in a non-const context, check out ZeroSlice::parse_byte_slice() instead.

See ZeroSlice::cast() for an example.

This function can be used for constructing ZeroVecs in a const context, avoiding parsing checks.

This cannot be generic over T because of current limitations in const, but if this method is needed in a non-const context, check out ZeroSlice::parse_byte_slice() instead.

See ZeroSlice::cast() for an example.

This function can be used for constructing ZeroVecs in a const context, avoiding parsing checks.

This cannot be generic over T because of current limitations in const, but if this method is needed in a non-const context, check out ZeroSlice::parse_byte_slice() instead.

See ZeroSlice::cast() for an example.

This function can be used for constructing ZeroVecs in a const context, avoiding parsing checks.

This cannot be generic over T because of current limitations in const, but if this method is needed in a non-const context, check out ZeroSlice::parse_byte_slice() instead.

See ZeroSlice::cast() for an example.

Trait Implementations

Converts this type into a shared reference of the (usually inferred) input type.
Converts this type into a shared reference of the (usually inferred) input type.
Converts this type into a shared reference of the (usually inferred) input type.
Returns a TokenStream that would evalutate to self. Read more
Formats the value using the given formatter. Read more
Returns the “default value” for a type. Read more

This impl can be made available by enabling the optional serde feature of the zerovec crate

Deserialize this value from the given Serde deserializer. Read more

This impl can be made available by enabling the optional serde feature of the zerovec crate

Deserialize this value from the given Serde deserializer. Read more
Calls cb with a piecewise list of byte slices that when concatenated produce the memory pattern of the corresponding instance of T. Read more
Return the length, in bytes, of the corresponding VarULE type
Write the corresponding VarULE type to the dst buffer. dst should be the size of Self::encode_var_ule_len() Read more
Calls cb with a piecewise list of byte slices that when concatenated produce the memory pattern of the corresponding instance of T. Read more
Return the length, in bytes, of the corresponding VarULE type
Write the corresponding VarULE type to the dst buffer. dst should be the size of Self::encode_var_ule_len() Read more
Calls cb with a piecewise list of byte slices that when concatenated produce the memory pattern of the corresponding instance of T. Read more
Return the length, in bytes, of the corresponding VarULE type
Write the corresponding VarULE type to the dst buffer. dst should be the size of Self::encode_var_ule_len() Read more
This method returns an Ordering between self and other. Read more
This method tests for self and other values to be equal, and is used by ==. Read more
This method tests for !=. The default implementation is almost always sufficient, and should not be overridden without very good reason. Read more
This method tests for self and other values to be equal, and is used by ==. Read more
This method tests for !=. The default implementation is almost always sufficient, and should not be overridden without very good reason. Read more
This method tests for self and other values to be equal, and is used by ==. Read more
This method tests for !=. The default implementation is almost always sufficient, and should not be overridden without very good reason. Read more
This method tests for self and other values to be equal, and is used by ==. Read more
This method tests for !=. The default implementation is almost always sufficient, and should not be overridden without very good reason. Read more
This method returns an ordering between self and other values if one exists. Read more
This method tests less than (for self and other) and is used by the < operator. Read more
This method tests less than or equal to (for self and other) and is used by the <= operator. Read more
This method tests greater than (for self and other) and is used by the > operator. Read more
This method tests greater than or equal to (for self and other) and is used by the >= operator. Read more

This impl can be made available by enabling the optional serde feature of the zerovec crate

Serialize this value into the given Serde serializer. Read more
Validates a byte slice, &[u8]. Read more
Takes a byte slice, &[u8], and return it as &Self with the same lifetime, assuming that this byte slice has previously been run through Self::parse_byte_slice() with success. Read more
Parses a byte slice, &[u8], and return it as &Self with the same lifetime. Read more
Given &Self, returns a &[u8] with the same lifetime. Read more
Allocate on the heap as a Box<T>
Clone the other C into a struct that may retain references into C.
Clone the other C into a struct that may retain references into C.
The container that can be used with this type: ZeroVec or VarZeroVec.
The type produced by Container::get() Read more
The type produced by Container::replace() and Container::remove(), also used during deserialization. If Self is human readable serialized, deserializing to Self::OwnedType should produce the same value once passed through Self::owned_as_self() Read more
The type returned by Self::get()
A fully borrowed version of this
Create a new, empty borrowed variant
Search for a key in a sorted vector, returns 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. Read more
Search for a key within a certain range in a sorted vector. Returns 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. Read more
Search for a key in a sorted vector by a predicate, returns 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. Read more
Search for a key within a certain range in a sorted vector by a predicate. Returns 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. Read more
Get element at index
The length of this vector
Construct a borrowed variant by borrowing from &self. Read more
Obtain a reference to T, passed to a closure Read more
Check if this vector is empty

Auto Trait Implementations

Blanket Implementations

Gets the TypeId of self. Read more
Immutably borrows from an owned value. Read more
Mutably borrows from an owned value. Read more

Returns the argument unchanged.

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

The type returned in the event of a conversion error.
Performs the conversion.
The type returned in the event of a conversion error.
Performs the conversion.