1use 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}