Files
third_party_rust_tinyvec/src/arrayish.rs
T
Lokathor 50b84c54b1 docs and rename the feature to alloc
Closes https://github.com/Lokathor/tinyvec/issues/18
We could discuss the "goals" section more of course, but for now it's enough to call that issue closed.
2020-01-13 19:55:38 -07:00

57 lines
1.6 KiB
Rust

/// A trait for types that can be the backing store of an
/// [`ArrayishVec`](ArrayishVec::<A>).
///
/// You are not generally expected to need to implement this yourself. You can
/// if you want I guess. Impls are provided for arrays of length `0..=32`, 33,
/// and powers of 2 up to 4096. Additional lengths can probably be added upon
/// request.
///
/// ## Safety Reminder
///
/// As a reminder, the `Arrayish` trait is 100% safe so unsafe code **must not**
/// rely on an instance of the trait being correct.
pub trait Arrayish {
/// The type of the items in the thing.
type Item: Default;
/// The number of slots in the thing.
const CAPACITY: usize;
/// Gives a shared slice over the whole thing.
///
/// A correct implementation will return a slice with a length equal to the
/// `CAPACITY` value.
fn slice(&self) -> &[Self::Item];
/// Gives a unique slice over the whole thing.
///
/// A correct implementation will return a slice with a length equal to the
/// `CAPACITY` value.
fn slice_mut(&mut self) -> &mut [Self::Item];
}
macro_rules! impl_arrayish_for_len {
($($len:expr),+ $(,)?) => {
$(impl<T: Default> Arrayish for [T; $len] {
type Item = T;
const CAPACITY: usize = $len;
#[inline(always)]
fn slice(&self) -> &[T] {
&*self
}
#[inline(always)]
fn slice_mut(&mut self) -> &mut [T] {
&mut *self
}
})+
}
}
impl_arrayish_for_len! {
0, /* The oft-forgotten 0-length array! */
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, /* for luck */
64, 128, 256, 512, 1024, 2048, 4096,
}