diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 00000000..80edb3f0 --- /dev/null +++ b/.gitattributes @@ -0,0 +1,2 @@ +CHANGELOG.md merge=union + diff --git a/CHANGELOG.md b/CHANGELOG.md index 1e51c629..804cfb01 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -20,6 +20,7 @@ and this project adheres to [Semantic Versioning](http://semver.org/). - Added pool implementations for 64-bit architectures. - Added `IntoIterator` implementation for `LinearMap` - Added `Deque::{get, get_mut, get_unchecked, get_unchecked_mut}`. +- Added `serde::Serialize` and `serde::Deserialize` implementations to `HistoryBuffer`. ### Changed diff --git a/src/de.rs b/src/de.rs index 96052273..455295b7 100644 --- a/src/de.rs +++ b/src/de.rs @@ -1,6 +1,6 @@ use crate::{ - binary_heap::Kind as BinaryHeapKind, BinaryHeap, Deque, IndexMap, IndexSet, LinearMap, String, - Vec, + binary_heap::Kind as BinaryHeapKind, BinaryHeap, Deque, HistoryBuffer, IndexMap, IndexSet, + LinearMap, String, Vec, }; use core::{ fmt, @@ -173,6 +173,43 @@ where } } +impl<'de, T, const N: usize> Deserialize<'de> for HistoryBuffer +where + T: Deserialize<'de>, +{ + fn deserialize(deserializer: D) -> Result + where + D: Deserializer<'de>, + { + struct ValueVisitor<'de, T, const N: usize>(PhantomData<(&'de (), T)>); + + impl<'de, T, const N: usize> serde::de::Visitor<'de> for ValueVisitor<'de, T, N> + where + T: Deserialize<'de>, + { + type Value = HistoryBuffer; + + fn expecting(&self, formatter: &mut fmt::Formatter<'_>) -> fmt::Result { + formatter.write_str("a sequence") + } + + fn visit_seq(self, mut seq: A) -> Result + where + A: SeqAccess<'de>, + { + let mut values = HistoryBuffer::new(); + + while let Some(value) = seq.next_element()? { + values.write(value); + } + + Ok(values) + } + } + deserializer.deserialize_seq(ValueVisitor(PhantomData)) + } +} + // Dictionaries impl<'de, K, V, S, const N: usize> Deserialize<'de> for IndexMap, N> diff --git a/src/ser.rs b/src/ser.rs index 05231319..9839da2a 100644 --- a/src/ser.rs +++ b/src/ser.rs @@ -2,7 +2,7 @@ use core::hash::{BuildHasher, Hash}; use crate::{ binary_heap::Kind as BinaryHeapKind, storage::Storage, vec::VecInner, BinaryHeap, Deque, - IndexMap, IndexSet, LinearMap, String, + HistoryBuffer, IndexMap, IndexSet, LinearMap, String, }; use serde::ser::{Serialize, SerializeMap, SerializeSeq, Serializer}; @@ -74,6 +74,22 @@ where } } +impl Serialize for HistoryBuffer +where + T: Serialize, +{ + fn serialize(&self, serializer: S) -> Result + where + S: Serializer, + { + let mut seq = serializer.serialize_seq(Some(self.len()))?; + for element in self.oldest_ordered() { + seq.serialize_element(element)?; + } + seq.end() + } +} + // Dictionaries impl Serialize for IndexMap