From a322e0f1b3d2484b4728f6495d9dc09edd789b08 Mon Sep 17 00:00:00 2001 From: Victor Koenders Date: Sat, 16 Oct 2021 12:21:52 +0200 Subject: [PATCH] Added support for BinaryHeap, BTreeMap, BTreeSet and VecDeque --- src/features/impl_alloc.rs | 118 ++++++++++++++++++++++++++++++++++++- tests/alloc.rs | 17 ++++++ 2 files changed, 134 insertions(+), 1 deletion(-) diff --git a/src/features/impl_alloc.rs b/src/features/impl_alloc.rs index 53fa85b..30e707a 100644 --- a/src/features/impl_alloc.rs +++ b/src/features/impl_alloc.rs @@ -5,7 +5,7 @@ use crate::{ error::{DecodeError, EncodeError}, Config, }; -use alloc::{borrow::Cow, boxed::Box, rc::Rc, sync::Arc, vec::Vec}; +use alloc::{borrow::Cow, boxed::Box, collections::*, rc::Rc, sync::Arc, vec::Vec}; #[derive(Default)] struct VecWriter { @@ -35,6 +35,122 @@ pub fn encode_to_vec_with_config( Ok(encoder.into_writer().inner) } +impl Decodable for BinaryHeap +where + T: Decodable + Ord, +{ + fn decode(mut decoder: D) -> Result { + let len = usize::decode(&mut decoder)?; + let mut map = BinaryHeap::with_capacity(len); + for _ in 0..len { + let key = T::decode(&mut decoder)?; + map.push(key); + } + Ok(map) + } +} + +impl Encodeable for BinaryHeap +where + T: Encodeable + Ord, +{ + fn encode(&self, mut encoder: E) -> Result<(), EncodeError> { + self.len().encode(&mut encoder)?; + for val in self.iter() { + val.encode(&mut encoder)?; + } + Ok(()) + } +} + +impl Decodable for BTreeMap +where + K: Decodable + Ord, + V: Decodable, +{ + fn decode(mut decoder: D) -> Result { + let len = usize::decode(&mut decoder)?; + let mut map = BTreeMap::new(); + for _ in 0..len { + let key = K::decode(&mut decoder)?; + let value = V::decode(&mut decoder)?; + map.insert(key, value); + } + Ok(map) + } +} + +impl Encodeable for BTreeMap +where + K: Encodeable + Ord, + V: Encodeable, +{ + fn encode(&self, mut encoder: E) -> Result<(), EncodeError> { + self.len().encode(&mut encoder)?; + for (key, val) in self.iter() { + key.encode(&mut encoder)?; + val.encode(&mut encoder)?; + } + Ok(()) + } +} + +impl Decodable for BTreeSet +where + T: Decodable + Ord, +{ + fn decode(mut decoder: D) -> Result { + let len = usize::decode(&mut decoder)?; + let mut map = BTreeSet::new(); + for _ in 0..len { + let key = T::decode(&mut decoder)?; + map.insert(key); + } + Ok(map) + } +} + +impl Encodeable for BTreeSet +where + T: Encodeable + Ord, +{ + fn encode(&self, mut encoder: E) -> Result<(), EncodeError> { + self.len().encode(&mut encoder)?; + for item in self.iter() { + item.encode(&mut encoder)?; + } + Ok(()) + } +} + +impl Decodable for VecDeque +where + T: Decodable, +{ + fn decode(mut decoder: D) -> Result { + let len = usize::decode(&mut decoder)?; + let mut map = VecDeque::with_capacity(len); + for _ in 0..len { + let key = T::decode(&mut decoder)?; + map.push_back(key); + } + Ok(map) + } +} + +impl Encodeable for VecDeque +where + T: Encodeable, +{ + fn encode(&self, mut encoder: E) -> Result<(), EncodeError> { + self.len().encode(&mut encoder)?; + for item in self.iter() { + item.encode(&mut encoder)?; + } + Ok(()) + } +} + impl Decodable for Vec where T: Decodable, diff --git a/tests/alloc.rs b/tests/alloc.rs index 2118b65..f096b5f 100644 --- a/tests/alloc.rs +++ b/tests/alloc.rs @@ -5,6 +5,7 @@ extern crate alloc; mod utils; use alloc::borrow::Cow; +use alloc::collections::*; use alloc::rc::Rc; use alloc::sync::Arc; use utils::the_same; @@ -53,4 +54,20 @@ fn test_alloc_commons() { the_same(Cow::::Borrowed(&5)); the_same(Rc::::new(5)); the_same(Arc::::new(5)); + the_same({ + let mut map = BTreeMap::::new(); + map.insert(5, -5); + map + }); + the_same({ + let mut set = BTreeSet::::new(); + set.insert(5); + set + }); + the_same({ + let mut set = VecDeque::::new(); + set.push_back(15); + set.push_front(5); + set + }); }