diff --git a/src/lib.rs b/src/lib.rs index 7d7d670..e359c6d 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -68,7 +68,12 @@ extern crate std; #[cfg(feature = "borsh")] mod borsh; mod macros; +#[cfg(feature = "malloc_size_of")] +mod mallocsizeof; mod rawsmallvec; +mod references; +#[cfg(feature = "serde")] +mod serde; mod taggedlen; #[cfg(feature = "bytes")] @@ -82,39 +87,15 @@ use defmt::{ Formatter as DeFormatter, write as dewrite }; -#[cfg(feature = "malloc_size_of")] -use malloc_size_of::{ - MallocShallowSizeOf, - MallocSizeOf, - MallocSizeOfOps -}; -#[cfg(feature = "serde")] -use serde_core::{ - de::{ - Deserialize, - Deserializer, - SeqAccess, - Visitor - }, - ser::{ - Serialize, - SerializeSeq, - Serializer - } -}; #[cfg(feature = "std")] use std::io; use { alloc::{ - alloc::Layout, boxed::Box, vec::Vec }, core::{ - borrow::{ - Borrow, - BorrowMut - }, + alloc::Layout, fmt::Debug, hash::{ Hash, @@ -2006,21 +1987,6 @@ impl Drop for IntoIter { } } -impl core::ops::Deref for SmallVec { - type Target = [T]; - - #[inline] - fn deref(&self) -> &Self::Target { - self.as_slice() - } -} -impl core::ops::DerefMut for SmallVec { - #[inline] - fn deref_mut(&mut self) -> &mut Self::Target { - self.as_mut_slice() - } -} - /// This function is used in the [`smallvec`] macro. /// It is recommended to use the macro instead of using thís function. #[doc(hidden)] @@ -2794,34 +2760,6 @@ impl Hash for SmallVec { } } -impl Borrow<[T]> for SmallVec { - #[inline] - fn borrow(&self) -> &[T] { - self.as_slice() - } -} - -impl BorrowMut<[T]> for SmallVec { - #[inline] - fn borrow_mut(&mut self) -> &mut [T] { - self.as_mut_slice() - } -} - -impl AsRef<[T]> for SmallVec { - #[inline] - fn as_ref(&self) -> &[T] { - self.as_slice() - } -} - -impl AsMut<[T]> for SmallVec { - #[inline] - fn as_mut(&mut self) -> &mut [T] { - self.as_mut_slice() - } -} - impl Debug for SmallVec { fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result { f.debug_list().entries(self.iter()).finish() @@ -2858,84 +2796,6 @@ where T: arbitrary::Arbitrary<'a> } } -#[cfg(feature = "serde")] -#[cfg_attr(docsrs, doc(cfg(feature = "serde")))] -impl Serialize for SmallVec -where T: Serialize -{ - fn serialize(&self, serializer: S) -> Result { - let mut state = serializer.serialize_seq(Some(self.len()))?; - for item in self { - state.serialize_element(item)?; - } - state.end() - } -} - -#[cfg(feature = "serde")] -#[cfg_attr(docsrs, doc(cfg(feature = "serde")))] -impl<'de, T, const N: usize> Deserialize<'de> for SmallVec -where T: Deserialize<'de> -{ - fn deserialize>(deserializer: D) -> Result { - deserializer.deserialize_seq(SmallVecVisitor { - phantom: PhantomData - }) - } -} - -#[cfg(feature = "serde")] -struct SmallVecVisitor { - phantom: PhantomData -} - -#[cfg(feature = "serde")] -impl<'de, T, const N: usize> Visitor<'de> for SmallVecVisitor -where T: Deserialize<'de> -{ - type Value = SmallVec; - - fn expecting(&self, formatter: &mut core::fmt::Formatter<'_>) -> core::fmt::Result { - formatter.write_str("a sequence") - } - - fn visit_seq(self, mut seq: B) -> Result - where B: SeqAccess<'de> { - use serde_core::de::Error; - let len = seq.size_hint().unwrap_or(0); - let mut values = SmallVec::new(); - values.try_reserve(len).map_err(B::Error::custom)?; - - while let Some(value) = seq.next_element()? { - values.push(value); - } - - Ok(values) - } -} - -#[cfg(feature = "malloc_size_of")] -impl MallocShallowSizeOf for SmallVec { - fn shallow_size_of(&self, ops: &mut MallocSizeOfOps) -> usize { - if self.spilled() { - unsafe { ops.malloc_size_of(self.as_ptr()) } - } else { - 0 - } - } -} - -#[cfg(feature = "malloc_size_of")] -impl MallocSizeOf for SmallVec { - fn size_of(&self, ops: &mut MallocSizeOfOps) -> usize { - let mut n = self.shallow_size_of(ops); - for elem in self.iter() { - n += elem.size_of(ops); - } - n - } -} - #[cfg(feature = "std")] #[cfg_attr(docsrs, doc(cfg(feature = "std")))] impl io::Write for SmallVec { diff --git a/src/mallocsizeof.rs b/src/mallocsizeof.rs new file mode 100644 index 0000000..50c84b4 --- /dev/null +++ b/src/mallocsizeof.rs @@ -0,0 +1,28 @@ +use { + super::SmallVec, + malloc_size_of::{ + MallocShallowSizeOf, + MallocSizeOf, + MallocSizeOfOps + } +}; + +impl MallocShallowSizeOf for SmallVec { + fn shallow_size_of(&self, ops: &mut MallocSizeOfOps) -> usize { + if self.spilled() { + unsafe { ops.malloc_size_of(self.as_ptr()) } + } else { + 0 + } + } +} + +impl MallocSizeOf for SmallVec { + fn size_of(&self, ops: &mut MallocSizeOfOps) -> usize { + let mut n = self.shallow_size_of(ops); + for elem in self.iter() { + n += elem.size_of(ops); + } + n + } +} diff --git a/src/references.rs b/src/references.rs new file mode 100644 index 0000000..a266be4 --- /dev/null +++ b/src/references.rs @@ -0,0 +1,54 @@ +use { + super::SmallVec, + core::{ + borrow::{ + Borrow, + BorrowMut + }, + ops::{ + Deref, + DerefMut + } + } +}; + +impl Borrow<[T]> for SmallVec { + #[inline] + fn borrow(&self) -> &[T] { + self.as_slice() + } +} +impl BorrowMut<[T]> for SmallVec { + #[inline] + fn borrow_mut(&mut self) -> &mut [T] { + self.as_mut_slice() + } +} + +impl AsRef<[T]> for SmallVec { + #[inline] + fn as_ref(&self) -> &[T] { + self.as_slice() + } +} +impl AsMut<[T]> for SmallVec { + #[inline] + fn as_mut(&mut self) -> &mut [T] { + self.as_mut_slice() + } +} + +impl Deref for SmallVec { + type Target = [T]; + + #[inline] + fn deref(&self) -> &Self::Target { + self.as_slice() + } +} +impl DerefMut for SmallVec { + #[inline] + fn deref_mut(&mut self) -> &mut Self::Target { + self.as_mut_slice() + } +} diff --git a/src/serde.rs b/src/serde.rs new file mode 100644 index 0000000..2d87230 --- /dev/null +++ b/src/serde.rs @@ -0,0 +1,67 @@ +use { + super::SmallVec, + core::marker::PhantomData, + serde_core::{ + de::{ + Deserialize, + Deserializer, + SeqAccess, + Visitor + }, + ser::{ + Serialize, + SerializeSeq, + Serializer + } + } +}; + +impl Serialize for SmallVec +where T: Serialize +{ + fn serialize(&self, serializer: S) -> Result { + let mut state = serializer.serialize_seq(Some(self.len()))?; + for item in self { + state.serialize_element(item)?; + } + state.end() + } +} + +impl<'de, T, const N: usize> Deserialize<'de> for SmallVec +where T: Deserialize<'de> +{ + fn deserialize>(deserializer: D) -> Result { + deserializer.deserialize_seq(SmallVecVisitor { + phantom: PhantomData + }) + } +} + +struct SmallVecVisitor { + phantom: PhantomData +} + +impl<'de, T, const N: usize> Visitor<'de> for SmallVecVisitor +where T: Deserialize<'de> +{ + type Value = SmallVec; + + fn expecting(&self, formatter: &mut core::fmt::Formatter<'_>) -> core::fmt::Result { + formatter.write_str("a sequence") + } + + fn visit_seq(self, mut seq: B) -> Result + where B: SeqAccess<'de> { + use serde_core::de::Error; + let len = seq.size_hint().unwrap_or(0); + let mut values = SmallVec::new(); + values.try_reserve(len).map_err(B::Error::custom)?; + + while let Some(value) = seq.next_element()? { + values.push(value); + } + + Ok(values) + } +}