#![no_std]
#![doc(html_root_url = "https://docs.rs/generic-arrayvec/0.3.1")]
#![warn(
rust_2018_idioms,
deprecated_in_future,
macro_use_extern_crate,
missing_debug_implementations,
unused_qualifications
)]
pub use arrayvec;
pub use generic_array::{self, typenum};
use arrayvec::{Array, ArrayString, ArrayVec, CapacityError};
use core::str::Utf8Error;
use generic_array::{ArrayLength, GenericArray};
pub type GenericArrayVec<T, N> = ArrayVec<Wrapper<T, N>>;
pub type GenericArrayString<N> = ArrayString<Wrapper<u8, N>>;
#[derive(Debug, Clone)]
pub struct Wrapper<T, N>(pub GenericArray<T, N>)
where
N: ArrayLength<T>;
impl<T, N> Wrapper<T, N>
where
N: ArrayLength<T>,
{
pub fn into_inner(self) -> GenericArray<T, N> {
self.0
}
}
impl<T, N> Copy for Wrapper<T, N>
where
T: Copy,
N: ArrayLength<T>,
N::ArrayType: Copy,
{
}
impl<T, N> From<GenericArray<T, N>> for Wrapper<T, N>
where
N: ArrayLength<T>,
{
fn from(arr: GenericArray<T, N>) -> Self {
Wrapper(arr)
}
}
impl<T, N> Into<GenericArray<T, N>> for Wrapper<T, N>
where
N: ArrayLength<T>,
{
fn into(self) -> GenericArray<T, N> {
self.0
}
}
unsafe impl<T, N> Array for Wrapper<T, N>
where
N: ArrayLength<T>,
{
type Item = T;
type Index = usize;
const CAPACITY: usize = N::USIZE;
fn as_slice(&self) -> &[Self::Item] {
self.0.as_slice()
}
fn as_mut_slice(&mut self) -> &mut [Self::Item] {
self.0.as_mut_slice()
}
}
pub trait GenericArrayVecExt<T, N>
where
N: ArrayLength<T>,
{
fn generic_from<A>(arr: A) -> GenericArrayVec<T, N>
where
A: Into<GenericArray<T, N>>;
fn into_generic_array(self) -> Result<GenericArray<T, N>, Self>
where
Self: Sized;
}
impl<T, N> GenericArrayVecExt<T, N> for GenericArrayVec<T, N>
where
N: ArrayLength<T>,
{
fn generic_from<A>(arr: A) -> GenericArrayVec<T, N>
where
A: Into<GenericArray<T, N>>,
{
ArrayVec::from(Wrapper::from(arr.into()))
}
fn into_generic_array(self) -> Result<GenericArray<T, N>, Self> {
Ok(self.into_inner()?.into_inner())
}
}
pub trait GenericArrayStringExt<N>
where
N: ArrayLength<u8>,
N::ArrayType: Copy,
{
fn generic_from(string: &str) -> Result<GenericArrayString<N>, CapacityError<&str>>;
fn generic_from_byte_string<A>(byte_string: &A) -> Result<GenericArrayString<N>, Utf8Error>
where
A: Into<GenericArray<u8, N>> + AsRef<[u8]>;
}
impl<N> GenericArrayStringExt<N> for GenericArrayString<N>
where
N: ArrayLength<u8>,
N::ArrayType: Copy,
{
fn generic_from(string: &str) -> Result<GenericArrayString<N>, CapacityError<&str>> {
ArrayString::from(string)
}
fn generic_from_byte_string<A>(byte_string: &A) -> Result<GenericArrayString<N>, Utf8Error>
where
A: Into<GenericArray<u8, N>> + AsRef<[u8]>,
{
ArrayString::from_byte_string(&Wrapper::from(GenericArray::clone_from_slice(
byte_string.as_ref(),
)))
}
}