1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39
//! Requirements which a type needs to fulfill
//! so that it can serve as a vector storage
use super::VoidResult;
/// A trait to convert a type into a slice.
pub trait ToSlice<T> {
/// Convert to a slice.
fn to_slice(&self) -> &[T];
/// Length of a slice.
fn len(&self) -> usize;
/// Indicates whether or not this storage type is empty.
fn is_empty(&self) -> bool;
/// Gets the allocated length of a storage.
/// It's expected that `self.alloc_len() >= self.len()`
/// in all cases.
fn alloc_len(&self) -> usize;
/// Resizes the storage to support at least `len` elements or
/// returns an error if resizing isn't supported.
fn try_resize(&mut self, len: usize) -> VoidResult;
}
/// A trait to convert a type into a mutable slice.
pub trait ToSliceMut<T>: ToSlice<T> {
/// Convert to a mutable slice.
fn to_slice_mut(&mut self) -> &mut [T];
}
/// A trait for storage types which are known to have the capability to increase their capacity.
pub trait Resize {
/// Resize a storage type. Must work for any value of `len`,
/// however it's okay if after this method `self.alloc_len() > len`
/// or in words: It's okay if the method allocates more memory than
/// specified in the parameter.
fn resize(&mut self, len: usize);
}