#[derive(
borsh::BorshDeserialize,
borsh::BorshSerialize,
Debug,
PartialEq,
Eq,
Clone,
serde::Serialize,
serde::Deserialize,
)]
pub struct AlignedVec {
inner: Vec<u8>,
}
impl AlignedVec {
pub const ALIGNMENT: usize = 4;
pub fn new(vector: Vec<u8>) -> Self {
Self { inner: vector }
}
pub fn extend(&mut self, other: &Self) {
self.inner.extend(&other.inner);
}
pub fn into_inner(self) -> Vec<u8> {
self.inner
}
pub fn len(&self) -> usize {
self.inner.len()
}
#[must_use]
pub fn is_empty(&self) -> bool {
self.len() == 0
}
}
impl AsRef<Vec<u8>> for AlignedVec {
fn as_ref(&self) -> &Vec<u8> {
&self.inner
}
}
#[cfg(feature = "arbitrary")]
mod arbitrary_impls {
use arbitrary::{Arbitrary, Unstructured};
use proptest::arbitrary::any;
use proptest::strategy::{BoxedStrategy, Strategy};
use super::*;
impl<'a> Arbitrary<'a> for AlignedVec {
fn arbitrary(u: &mut Unstructured<'a>) -> arbitrary::Result<Self> {
u.arbitrary().map(|v: Vec<u8>| {
Self::new(v[..(v.len() / Self::ALIGNMENT) * Self::ALIGNMENT].to_vec())
})
}
}
impl proptest::arbitrary::Arbitrary for AlignedVec {
type Parameters = ();
type Strategy = BoxedStrategy<Self>;
fn arbitrary_with(_args: Self::Parameters) -> Self::Strategy {
any::<Vec<u8>>()
.prop_map(|v| {
Self::new(v[..(v.len() / Self::ALIGNMENT) * Self::ALIGNMENT].to_vec())
})
.boxed()
}
}
}