|
1 | 1 | use crate::{ |
2 | 2 | binary_heap::Kind as BinaryHeapKind, len_type::LenType, BinaryHeap, Deque, HistoryBuf, |
3 | | - IndexMap, IndexSet, LinearMap, String, Vec, |
| 3 | + IndexMap, IndexSet, LinearMap, SortedLinearMap, String, Vec, |
4 | 4 | }; |
5 | 5 | use core::{ |
6 | 6 | fmt, |
@@ -297,6 +297,47 @@ where |
297 | 297 | } |
298 | 298 | } |
299 | 299 |
|
| 300 | +impl<'de, K, V, const N: usize> Deserialize<'de> for SortedLinearMap<K, V, N> |
| 301 | +where |
| 302 | + K: Ord + Deserialize<'de>, |
| 303 | + V: Deserialize<'de>, |
| 304 | +{ |
| 305 | + fn deserialize<D>(deserializer: D) -> Result<Self, D::Error> |
| 306 | + where |
| 307 | + D: Deserializer<'de>, |
| 308 | + { |
| 309 | + struct ValueVisitor<'de, K, V, const N: usize>(PhantomData<(&'de (), K, V)>); |
| 310 | + |
| 311 | + impl<'de, K, V, const N: usize> de::Visitor<'de> for ValueVisitor<'de, K, V, N> |
| 312 | + where |
| 313 | + K: Ord + Deserialize<'de>, |
| 314 | + V: Deserialize<'de>, |
| 315 | + { |
| 316 | + type Value = SortedLinearMap<K, V, N>; |
| 317 | + |
| 318 | + fn expecting(&self, formatter: &mut fmt::Formatter<'_>) -> fmt::Result { |
| 319 | + formatter.write_str("a map") |
| 320 | + } |
| 321 | + |
| 322 | + fn visit_map<A>(self, mut map: A) -> Result<Self::Value, A::Error> |
| 323 | + where |
| 324 | + A: MapAccess<'de>, |
| 325 | + { |
| 326 | + let mut values = SortedLinearMap::new(); |
| 327 | + |
| 328 | + while let Some((key, value)) = map.next_entry()? { |
| 329 | + if values.insert(key, value).is_err() { |
| 330 | + return Err(A::Error::invalid_length(values.capacity() + 1, &self))?; |
| 331 | + } |
| 332 | + } |
| 333 | + |
| 334 | + Ok(values) |
| 335 | + } |
| 336 | + } |
| 337 | + deserializer.deserialize_map(ValueVisitor(PhantomData)) |
| 338 | + } |
| 339 | +} |
| 340 | + |
300 | 341 | // String containers |
301 | 342 |
|
302 | 343 | impl<'de, LenT: LenType, const N: usize> Deserialize<'de> for String<N, LenT> { |
|
0 commit comments