Skip to content

Commit 310c09d

Browse files
authored
Merge pull request #476 from Nikita240/hisbuf
Add serde implementations to HistoryBuffer
2 parents 8170f58 + 67d9d11 commit 310c09d

File tree

4 files changed

+59
-3
lines changed

4 files changed

+59
-3
lines changed

.gitattributes

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
CHANGELOG.md merge=union
2+

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ and this project adheres to [Semantic Versioning](http://semver.org/).
2020
- Added pool implementations for 64-bit architectures.
2121
- Added `IntoIterator` implementation for `LinearMap`
2222
- Added `Deque::{get, get_mut, get_unchecked, get_unchecked_mut}`.
23+
- Added `serde::Serialize` and `serde::Deserialize` implementations to `HistoryBuffer`.
2324

2425
### Changed
2526

src/de.rs

Lines changed: 39 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
use crate::{
2-
binary_heap::Kind as BinaryHeapKind, BinaryHeap, Deque, IndexMap, IndexSet, LinearMap, String,
3-
Vec,
2+
binary_heap::Kind as BinaryHeapKind, BinaryHeap, Deque, HistoryBuffer, IndexMap, IndexSet,
3+
LinearMap, String, Vec,
44
};
55
use core::{
66
fmt,
@@ -173,6 +173,43 @@ where
173173
}
174174
}
175175

176+
impl<'de, T, const N: usize> Deserialize<'de> for HistoryBuffer<T, N>
177+
where
178+
T: Deserialize<'de>,
179+
{
180+
fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
181+
where
182+
D: Deserializer<'de>,
183+
{
184+
struct ValueVisitor<'de, T, const N: usize>(PhantomData<(&'de (), T)>);
185+
186+
impl<'de, T, const N: usize> serde::de::Visitor<'de> for ValueVisitor<'de, T, N>
187+
where
188+
T: Deserialize<'de>,
189+
{
190+
type Value = HistoryBuffer<T, N>;
191+
192+
fn expecting(&self, formatter: &mut fmt::Formatter<'_>) -> fmt::Result {
193+
formatter.write_str("a sequence")
194+
}
195+
196+
fn visit_seq<A>(self, mut seq: A) -> Result<Self::Value, A::Error>
197+
where
198+
A: SeqAccess<'de>,
199+
{
200+
let mut values = HistoryBuffer::new();
201+
202+
while let Some(value) = seq.next_element()? {
203+
values.write(value);
204+
}
205+
206+
Ok(values)
207+
}
208+
}
209+
deserializer.deserialize_seq(ValueVisitor(PhantomData))
210+
}
211+
}
212+
176213
// Dictionaries
177214

178215
impl<'de, K, V, S, const N: usize> Deserialize<'de> for IndexMap<K, V, BuildHasherDefault<S>, N>

src/ser.rs

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ use core::hash::{BuildHasher, Hash};
22

33
use crate::{
44
binary_heap::Kind as BinaryHeapKind, storage::Storage, vec::VecInner, BinaryHeap, Deque,
5-
IndexMap, IndexSet, LinearMap, String,
5+
HistoryBuffer, IndexMap, IndexSet, LinearMap, String,
66
};
77
use serde::ser::{Serialize, SerializeMap, SerializeSeq, Serializer};
88

@@ -74,6 +74,22 @@ where
7474
}
7575
}
7676

77+
impl<T, const N: usize> Serialize for HistoryBuffer<T, N>
78+
where
79+
T: Serialize,
80+
{
81+
fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
82+
where
83+
S: Serializer,
84+
{
85+
let mut seq = serializer.serialize_seq(Some(self.len()))?;
86+
for element in self.oldest_ordered() {
87+
seq.serialize_element(element)?;
88+
}
89+
seq.end()
90+
}
91+
}
92+
7793
// Dictionaries
7894

7995
impl<K, V, S, const N: usize> Serialize for IndexMap<K, V, S, N>

0 commit comments

Comments
 (0)