[][src]Struct dync::VecCopy

pub struct VecCopy<V = ()> where
    V: ?Sized
{ /* fields omitted */ }

Buffer of plain old data. The data is stored as an array of bytes (Vec<MaybeUninit<u8>>).

VecCopy keeps track of the type stored within via an explicit TypeId member. This allows one to hide the type from the compiler and check it only when necessary. It is particularly useful when the type of data is determined at runtime (e.g. when parsing numeric data).

Safety

It is assumed that any Rust type has a valid representation in bytes. This library has an inherently more relaxed requirement than crates like zerocopy or bytemuck since the representative bytes cannot be modified or inspected by the safe API exposed by this library, they can only be copied.

Further, the bytes representing a type are never interpreted as anything other than a type with an identical TypeId, which are assumed to have an identical memory layout throughout the execution of the program.

Implementations

impl<V> VecCopy<V>[src]

pub fn with_type<T: CopyElem>() -> Self where
    V: VTable<T>, 
[src]

Construct an empty VecCopy with a specific type.

pub fn with_capacity<T: CopyElem>(n: usize) -> Self where
    V: VTable<T>, 
[src]

Construct an empty VecCopy with a capacity for a given number of typed elements. For setting byte capacity use with_byte_capacity.

pub fn with_size<T: CopyElem>(n: usize, def: T) -> Self where
    V: VTable<T>, 
[src]

Construct a typed VecCopy with a given size and filled with the specified default value.

Examples

use dync::VecCopy;
let buf: VecCopy = VecCopy::with_size(8, 42usize); // Create buffer
let buf_vec: Vec<usize> = buf.into_vec().unwrap(); // Convert into `Vec`
assert_eq!(buf_vec, vec![42usize; 8]);

pub fn from_vec<T: CopyElem>(vec: Vec<T>) -> Self where
    V: VTable<T>, 
[src]

Construct a VecCopy from a given Vec<T> reusing the space already allocated by the given vector.

Examples

use dync::VecCopy;
let vec = vec![1u8, 3, 4, 1, 2];
let buf: VecCopy = VecCopy::from_vec(vec.clone()); // Convert into buffer
let nu_vec: Vec<u8> = buf.into_vec().unwrap(); // Convert back into `Vec`
assert_eq!(vec, nu_vec);

pub fn from_slice<T: CopyElem>(slice: &[T]) -> Self where
    V: VTable<T>, 
[src]

Construct a VecCopy from a given slice by copying the data.

impl<V: ?Sized> VecCopy<V>[src]

pub fn with_type_from(other: impl Into<Meta<Ptr<V>>>) -> Self[src]

Construct a VecCopy with the same type as the given buffer without copying its data.

pub unsafe fn from_raw_parts(
    data: Vec<MaybeUninit<u8>>,
    element_size: usize,
    element_type_id: TypeId,
    vtable: Ptr<V>
) -> VecCopy<V>
[src]

Construct a SliceCopy from raw bytes and type metadata.

Safety

Almost exclusively the only inputs that are safe here are the ones returned by into_raw_parts.

This function should not be used other than in internal APIs. It exists to enable the into_dyn macro until CoerceUsize is stabilized.

pub fn into_raw_parts(self) -> (Vec<MaybeUninit<u8>>, usize, TypeId, Ptr<V>)[src]

Convert this collection into its raw components.

This function exists mainly to enable the into_dyn macro until CoerceUnsized is stabilized.

pub fn upcast<U: From<V>>(self) -> VecCopy<U> where
    V: Clone
[src]

Upcast the VecCopy into a more general base VecCopy.

This function converts the underlying virtual function table into a subset of the existing

pub fn upcast_with<U>(self, f: impl FnOnce(V) -> U) -> VecCopy<U> where
    V: Clone
[src]

pub fn resize<T: CopyElem>(
    &mut self,
    new_len: usize,
    value: T
) -> Option<&mut Self>
[src]

Resizes the buffer in-place to store new_len elements and returns an optional mutable reference to Self.

If T does not correspond to the underlying element type, then None is returned and the VecCopy is left unchanged.

This function has the similar properties to Vec::resize.

pub fn copy_from_slice<T: CopyElem>(&mut self, slice: &[T]) -> &mut Self[src]

Copy data from a given slice into the current buffer.

The VecCopy is extended if the given slice is larger than the number of elements already stored in this VecCopy.

pub fn clear(&mut self)[src]

Clear the data buffer without destroying its type information.

pub fn fill<T: CopyElem>(&mut self, def: T) -> Option<&mut Self>[src]

Fill the current buffer with copies of the given value. The size of the buffer is left unchanged. If the given type doesn't patch the internal type, None is returned, otherwise a mut reference to the modified buffer is returned.

Examples

use dync::VecCopy;
let vec = vec![1u8, 3, 4, 1, 2];
let mut buf: VecCopy = VecCopy::from_vec(vec.clone()); // Convert into buffer
buf.fill(0u8);
assert_eq!(buf.into_vec::<u8>().unwrap(), vec![0u8, 0, 0, 0, 0]);

pub fn push_as<T: Any>(&mut self, element: T) -> Option<&mut Self>[src]

Add an element to this buffer.

If the type of the given element coincides with the type stored by this buffer, then the modified buffer is returned via a mutable reference. Otherwise, None is returned.

pub fn check<T: Any>(self) -> Option<Self>[src]

Check if the current buffer contains elements of the specified type. Returns Some(self) if the type matches and None otherwise.

pub fn check_ref<T: Any>(&self) -> Option<&Self>[src]

Check if the current buffer contains elements of the specified type. Returns None if the check fails, otherwise a reference to self is returned.

pub fn check_mut<T: Any>(&mut self) -> Option<&mut Self>[src]

Check if the current buffer contains elements of the specified type. Same as check_ref but consumes and produces a mut reference to self.

pub fn element_type_id(&self) -> TypeId[src]

Get the TypeId of data stored within this buffer.

pub fn len(&self) -> usize[src]

Get the number of elements stored in this buffer.

pub fn is_empty(&self) -> bool[src]

Check if there are any elements stored in this buffer.

pub fn byte_capacity(&self) -> usize[src]

Get the byte capacity of this buffer.

pub fn iter_as<T: Any>(&self) -> Option<Iter<T>>[src]

Return an iterator to a slice representing typed data. Returs None if the given type T doesn't match the internal.

Examples

use dync::VecCopy;
let vec = vec![1.0_f32, 23.0, 0.01, 42.0, 11.43];
let buf: VecCopy = VecCopy::from(vec.clone()); // Convert into buffer
for (i, &val) in buf.iter_as::<f32>().unwrap().enumerate() {
    assert_eq!(val, vec[i]);
}

pub fn iter_mut_as<T: Any>(&mut self) -> Option<IterMut<T>>[src]

Return an iterator to a mutable slice representing typed data. Returns None if the given type T doesn't match the internal.

pub fn append_copy_to_vec<'a, T: CopyElem>(
    &self,
    vec: &'a mut Vec<T>
) -> Option<&'a mut Vec<T>>
[src]

Append copied items from this buffer to a given Vec<T>. Return the mutable reference Some(vec) if type matched the internal type and None otherwise.

pub fn copy_into_vec<T: CopyElem>(&self) -> Option<Vec<T>>[src]

Copies contents of self into the given Vec.

pub fn into_vec<T: Any>(self) -> Option<Vec<T>>[src]

An alternative to using the Into trait. This function helps the compiler determine the type T automatically.

pub fn as_slice_as<T: Any>(&self) -> Option<&[T]>[src]

Convert this buffer into a typed slice. Returs None if the given type T doesn't match the internal.

pub fn as_mut_slice_as<T: Any>(&mut self) -> Option<&mut [T]>[src]

Convert this buffer into a typed mutable slice. Returs None if the given type T doesn't match the internal.

pub fn get_as<T: CopyElem>(&self, i: usize) -> Option<T>[src]

Get i'th element of the buffer by value.

pub fn get_ref_as<T: Any>(&self, i: usize) -> Option<&T>[src]

Get a const reference to the i'th element of the buffer.

pub fn get_mut_as<T: Any>(&mut self, i: usize) -> Option<&mut T>[src]

Get a mutable reference to the i'th element of the buffer.

pub fn append(&mut self, buf: &mut VecCopy<V>) -> Option<&mut Self>[src]

Move elements from buf to this buffer.

The given buffer must have the same underlying type as self.

pub fn rotate_left(&mut self, mid: usize)[src]

Rotates the slice in-place such that the first mid elements of the slice move to the end while the last self.len() - mid elements move to the front. After calling rotate_left, the element previously at index mid will become the first element in the slice.

Example

use dync::*;
let mut buf: VecCopy = VecCopy::from_vec(vec![1u32,2,3,4,5]);
buf.rotate_left(3);
assert_eq!(buf.as_slice_as::<u32>().unwrap(), &[4,5,1,2,3]);

pub fn rotate_right(&mut self, k: usize)[src]

Rotates the slice in-place such that the first self.len() - k elements of the slice move to the end while the last k elements move to the front. After calling rotate_right, the element previously at index k will become the first element in the slice.

Example

use dync::*;
let mut buf: VecCopy = VecCopy::from_vec(vec![1u32,2,3,4,5]);
buf.rotate_right(3);
assert_eq!(buf.as_slice_as::<u32>().unwrap(), &[3,4,5,1,2]);

pub fn get_ref(&self, i: usize) -> CopyValueRef<V>[src]

Get a reference to a value stored in this container at index i.

pub fn get_mut(&mut self, i: usize) -> CopyValueMut<V>[src]

Get a mutable reference to a value stored in this container at index i.

pub fn iter<'a>(&'a self) -> impl Iterator<Item = CopyValueRef<'a, V>> + 'a[src]

Return an iterator over untyped value references stored in this buffer.

In contrast to iter, this function defers downcasting on a per element basis. As a result, this type of iteration is typically less efficient if a typed value is needed for each element.

Examples

use dync::VecCopy;
let vec = vec![1.0_f32, 23.0, 0.01, 42.0, 11.43];
let buf: VecCopy = VecCopy::from(vec.clone()); // Convert into buffer
for (i, val) in buf.iter().enumerate() {
    assert_eq!(val.downcast::<f32>().unwrap(), &vec[i]);
}

pub fn iter_mut(&mut self) -> impl Iterator<Item = CopyValueMut<V>>[src]

Return an iterator over untyped value references stored in this buffer.

In contrast to iter, this function defers downcasting on a per element basis. As a result, this type of iteration is typically less efficient if a typed value is needed for each element.

Examples

use dync::*;
let vec = vec![1.0_f32, 23.0, 0.01, 42.0, 11.43];
let mut buf: VecCopy = VecCopy::from(vec.clone()); // Convert into buffer
for (i, val) in buf.iter_mut().enumerate() {
    val.copy(CopyValueRef::new(&100.0f32));
}
assert_eq!(buf.into_vec::<f32>().unwrap(), vec![100.0f32; 5]);

pub fn push<U>(&mut self, value: CopyValueRef<U>) -> Option<&mut Self>[src]

Push a value to this VecCopy by reference and return a mutable reference to Self.

If the type of the value doesn't match the internal element type, return None.

Note that it is not necessary for vtables of the value and this vector to match. IF the types coincide, we know that either of the vtables is valid, so we just stick with the one we already have in the container.

Panics

This function panics if the size of the given value doesn't match the size of the stored value.

pub fn as_slice(&self) -> SliceCopy<V>[src]

pub fn as_mut_slice(&mut self) -> SliceCopyMut<V>[src]

impl<V: ?Sized> VecCopy<V>[src]

pub fn reserve_bytes(&mut self, additional: usize)[src]

Reserves capacity for at least additional more bytes to be inserted in this buffer.

pub unsafe fn get_unchecked<T: CopyElem>(&self, i: usize) -> T[src]

Get i'th element of the buffer by value without checking type.

This can be used to reinterpret the internal data as a different type. Note that if the size of the given type T doesn't match the size of the internal type, i will really index the ith T sized chunk in the current buffer. See the implementation for details.

Safety

It is assumed that that the buffer contains elements of type T and that i is strictly less than the length of this vector, otherwise this function will cause undefined behavior.

pub unsafe fn get_unchecked_ref<T: CopyElem>(&self, i: usize) -> &T[src]

Get a const reference to the i'th element of the buffer.

This can be used to reinterpret the internal data as a different type. Note that if the size of the given type T doesn't match the size of the internal type, i will really index the ith T sized chunk in the current buffer. See the implementation for details.

Safety

It is assumed that that the buffer contains elements of type T and that i is strictly less than the length of this vector, otherwise this function will cause undefined behavior.

pub unsafe fn get_unchecked_mut<T: CopyElem>(&mut self, i: usize) -> &mut T[src]

Get a mutable reference to the i'th element of the buffer.

This can be used to reinterpret the internal data as a different type. Note that if the size of the given type T doesn't match the size of the internal type, i will really index the ith T sized chunk in the current buffer. See the implementation for details.

Safety

It is assumed that that the buffer contains elements of type T and that i is strictly less than the length of this vector, otherwise this function will cause undefined behavior.

pub fn get_bytes(&self, i: usize) -> &[MaybeUninit<u8>][src]

Get a const reference to the byte slice of the i'th element of the buffer.

pub unsafe fn get_bytes_mut(&mut self, i: usize) -> &mut [MaybeUninit<u8>][src]

Get a mutable reference to the byte slice of the i'th element of the buffer.

Safety

This function is marked as unsafe since the returned bytes may be modified arbitrarily, which may potentially produce malformed values.

pub unsafe fn reinterpret_into_vec<T>(self) -> Vec<T>[src]

Move buffer data to a vector with a given type, reinterpreting the data type as required.

Safety

The underlying data must be correctly represented by a Vec<T>.

pub unsafe fn reinterpret_as_slice<T>(&self) -> &[T][src]

Borrow buffer data and reinterpret it as a slice of a given type.

Safety

The underlying data must be correctly represented by a &[T] when borrowed as &[MaybeUninit<u8>].

pub unsafe fn reinterpret_as_mut_slice<T>(&mut self) -> &mut [T][src]

Mutably borrow buffer data and reinterpret it as a mutable slice of a given type.

Safety

The underlying data must be correctly represented by a &mut [T] when borrowed as&mut [MaybeUninit<u8>].

pub unsafe fn reinterpret_iter<T>(&self) -> Iter<T>[src]

Borrow buffer data and iterate over reinterpreted underlying data.

Safety

Each underlying element must be correctly represented by a &T when borrowed as &[MaybeUninit<u8>].

pub unsafe fn reinterpret_iter_mut<T>(&mut self) -> IterMut<T>[src]

Mutably borrow buffer data and mutably iterate over reinterpreted underlying data.

Safety

Each underlying element must be correctly represented by a &mut T when borrowed as &mut [MaybeUninit<u8>].

pub fn as_bytes(&self) -> &[MaybeUninit<u8>][src]

Peek at the internal representation of the data.

pub unsafe fn as_bytes_mut(&mut self) -> &mut [MaybeUninit<u8>][src]

Get a mutable reference to the internal data representation.

Safety

This function is marked as unsafe since the returned bytes may be modified arbitrarily, which may potentially produce malformed values.

pub fn byte_chunks<'a>(
    &'a self
) -> impl Iterator<Item = &'a [MaybeUninit<u8>]> + 'a
[src]

Iterate over chunks type sized chunks of bytes without interpreting them.

This avoids needing to know what type data you're dealing with. This type of iterator is useful for transferring data from one place to another for a generic buffer.

pub unsafe fn byte_chunks_mut<'a>(
    &'a mut self
) -> impl Iterator<Item = &'a mut [MaybeUninit<u8>]> + 'a
[src]

Mutably iterate over chunks type sized chunks of bytes without interpreting them. This avoids needing to know what type data you're dealing with. This type of iterator is useful for transferring data from one place to another for a generic buffer, or modifying the underlying untyped bytes (e.g. bit twiddling).

Safety

This function is marked as unsafe since the returned bytes may be modified arbitrarily, which may potentially produce malformed values.

pub unsafe fn push_bytes(
    &mut self,
    bytes: &[MaybeUninit<u8>]
) -> Option<&mut Self>
[src]

Add bytes to this buffer.

If the size of the given slice coincides with the number of bytes occupied by the underlying element type, then these bytes are added to the underlying data buffer and a mutable reference to the buffer is returned. Otherwise, None is returned, and the buffer remains unmodified.

Safety

It is assumed that that the given bytes slice is a valid representation of the element types stored in this buffer. Otherwise this function will cause undefined behavior.

pub unsafe fn extend_bytes(
    &mut self,
    bytes: &[MaybeUninit<u8>]
) -> Option<&mut Self>
[src]

Add bytes to this buffer.

If the size of the given slice is a multiple of the number of bytes occupied by the underlying element type, then these bytes are added to the underlying data buffer and a mutable reference to the buffer is returned. Otherwise, None is returned and the buffer is unmodified.

Safety

It is assumed that that the given bytes slice is a valid representation of a contiguous collection of elements with the same type as stored in this buffer. Otherwise this function will cause undefined behavior.

pub unsafe fn append_bytes(
    &mut self,
    bytes: &mut Vec<MaybeUninit<u8>>
) -> Option<&mut Self>
[src]

Move bytes to this buffer.

If the size of the given vector is a multiple of the number of bytes occupied by the underlying element type, then these bytes are moved to the underlying data buffer and a mutable reference to the buffer is returned. Otherwise, None is returned and both the buffer and the input vector remain unmodified.

Safety

It is assumed that that the given bytes Vec is a valid representation of a contiguous collection of elements with the same type as stored in this buffer. Otherwise this function will cause undefined behavior.

Trait Implementations

impl<V> Clone for VecCopy<V> where
    V: Clone + ?Sized
[src]

impl<V> Debug for VecCopy<V> where
    V: Debug + ?Sized
[src]

impl<'a, V: ?Sized + 'a> Extend<CopyValueRef<'a, V>> for VecCopy<V>[src]

impl<'a, T, V> From<&'a [T]> for VecCopy<V> where
    T: CopyElem,
    V: VTable<T>, 
[src]

Convert a &[T] to a VecCopy.

impl<'a, V> From<&'a VecCopy<V>> for Meta<VTableRef<'a, V>>[src]

impl<'a, V> From<&'a VecCopy<V>> for Meta<Ptr<V>> where
    Ptr<V>: Clone
[src]

impl<T, V> From<Vec<T>> for VecCopy<V> where
    T: CopyElem,
    V: VTable<T>, 
[src]

Convert a Vec<T> to a VecCopy.

impl<'a, V: Clone + ?Sized + 'a> FromIterator<CopyValueRef<'a, V>> for VecCopy<V>[src]

impl<T, V: ?Sized> Into<Option<Vec<T>>> for VecCopy<V> where
    T: CopyElem
[src]

Convert a VecCopy to a Option<Vec<T>>.

Auto Trait Implementations

impl<V: ?Sized> RefUnwindSafe for VecCopy<V> where
    V: RefUnwindSafe

impl<V: ?Sized> Send for VecCopy<V> where
    V: Send

impl<V: ?Sized> Sync for VecCopy<V> where
    V: Sync

impl<V: ?Sized> Unpin for VecCopy<V>

impl<V: ?Sized> UnwindSafe for VecCopy<V> where
    V: UnwindSafe

Blanket Implementations

impl<T> Any for T where
    T: 'static + ?Sized
[src]

impl<T> Borrow<T> for T where
    T: ?Sized
[src]

impl<T> BorrowMut<T> for T where
    T: ?Sized
[src]

impl<T> CloneBytes for T where
    T: 'static + Clone
[src]

impl<T> DebugBytes for T where
    T: 'static + Debug
[src]

impl<T> Downcast for T where
    T: Any
[src]

impl<T> DowncastSync for T where
    T: Send + Sync + Any
[src]

impl<T> DropBytes for T where
    T: 'static, 
[src]

impl<T> From<T> for T[src]

impl<T, U> Into<U> for T where
    U: From<T>, 
[src]

impl<T> ToOwned for T where
    T: Clone
[src]

type Owned = T

The resulting type after obtaining ownership.

impl<T, U> TryFrom<U> for T where
    U: Into<T>, 
[src]

type Error = Infallible

The type returned in the event of a conversion error.

impl<T, U> TryInto<U> for T where
    U: TryFrom<T>, 
[src]

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.