smallmap/
page_impls.rs

1//! Because we can't #derive big arrays on stable smh
2use super::*;
3use core::{
4    fmt::{self, Debug,},
5    hash,
6};
7
8impl<K: Clone, V: Clone> Clone for Page<K,V>
9{
10    fn clone(&self) -> Self
11    {
12	#[inline(always)] fn copy_slice<T: Clone>(dst: &mut [T], src: &[T])
13	{
14	    for (d, s) in dst.iter_mut().zip(src.iter())
15	    {
16		*d = s.clone()
17	    }
18	}
19	let mut new = init::blank_page();
20	copy_slice(&mut new[..], &self.0[..]);
21	Self(new)
22    }
23}
24
25impl<K: Debug, V:Debug> Debug for Page<K,V>
26{
27    #[inline] fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result
28    {
29	write!(f, "{:?}", &self.0[..])
30    }
31}
32
33
34impl<K: Eq, V: Eq> Eq for Page<K,V>{}
35impl<K: PartialEq, V: PartialEq> PartialEq for Page<K,V>
36{
37    #[inline] fn eq(&self, other: &Self) -> bool
38    {
39	&self.0[..] == &other.0[..]
40    }
41}
42
43impl<K: hash::Hash, V: hash::Hash> hash::Hash for Page<K,V> {
44    #[inline] fn hash<H: hash::Hasher>(&self, state: &mut H) {
45	(&self.0[..]).hash(state)
46    }
47}
48
49#[cfg(feature="serde")]
50const _: () = {
51    use serde::*;
52    use core::marker::PhantomData;
53    
54    impl<K,V> serde::Serialize for Page<K,V>
55    where K:Serialize, V: Serialize
56    {
57	fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
58	where
59            S: Serializer,
60	{
61	    use serde::ser::SerializeSeq;
62	    let mut seq = serializer.serialize_seq(Some(MAX))?;
63            for element in self.0.iter() {
64		seq.serialize_element(element)?;
65            }
66            seq.end()
67	}
68    }
69
70    struct PageVisitor<K,V>(PhantomData<Page<K,V>>);
71    
72    impl<'de, K, V> de::Visitor<'de> for PageVisitor<K,V> 
73    where K: Deserialize<'de>,
74	  V: Deserialize<'de>
75    {
76	type Value = Page<K,V>;
77
78	fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
79            formatter.write_str("an array of 256 `Option<(K,V)>` elements")
80	}
81
82	fn visit_seq<A>(self, mut seq: A) -> Result<Self::Value, A::Error> where
83	    A: serde::de::SeqAccess<'de>
84	{
85	    let mut elems = init::blank_page();
86	    let mut i=0usize;
87	    while let Some(optkv) = seq.next_element()?
88	    {
89		elems[i] = optkv;
90		i+=1;
91	    }
92	    if i==MAX {
93		Ok(Page(elems))
94	    } else {
95		use serde::de::Error;
96		Err(A::Error::custom(alloc::format!("Expected {} elemts, got {}", MAX, i)))
97	    }
98	}
99    }
100
101    
102    impl<'de, K, V> Deserialize<'de> for Page<K,V>
103    where K: Deserialize<'de>,
104	  V: Deserialize<'de>
105    {
106	fn deserialize<D>(deserializer: D) -> Result<Page<K,V>, D::Error>
107	where
108            D: serde::de::Deserializer<'de>,
109	{
110            deserializer.deserialize_seq(PageVisitor(PhantomData))
111	}
112    }
113
114};
115
116
117#[cfg(feature="serde")] 
118#[cfg(test)]
119mod serde_tests
120{
121    use crate::*;
122    #[test]
123    fn serde()
124    {
125	let map = smallmap! {
126	    {101 => 102},
127	    {10111 => 10222},
128	};
129	let string = serde_json::to_string(&map).expect("ser failed");
130	println!("String {:?}", string);
131	let map2 = serde_json::from_str(&string[..]).expect("de failed");
132	assert_eq!(map, map2);
133    }
134}