]> git.lizzy.rs Git - bit-set.git/blobdiff - src/lib.rs
Add serde support
[bit-set.git] / src / lib.rs
index 80ee6245f83a86a33eea1ad962dcfbe279b254fc..bd3835f0602c04232eb819633254c23afc1f3728 100644 (file)
@@ -52,6 +52,8 @@
 extern crate bit_vec;
 #[cfg(all(test, feature = "nightly"))]
 extern crate rand;
+#[cfg(feature = "serde")]
+extern crate serde2;
 #[cfg(all(test, feature = "nightly"))]
 extern crate test;
 
@@ -66,6 +68,9 @@ use core::fmt;
 use core::hash;
 use core::iter::{self, Chain, Enumerate, FromIterator, Repeat, Skip, Take};
 
+#[cfg(feature = "serde")]
+use serde2::{Deserialize, Deserializer, Serialize, Serializer};
+
 type MatchWords<'a, B> = Chain<Enumerate<Blocks<'a, B>>, Skip<Take<Enumerate<Repeat<B>>>>>;
 
 /// Computes how many blocks are needed to store that many bits
@@ -847,6 +852,22 @@ impl<B: BitBlock> hash::Hash for BitSet<B> {
     }
 }
 
+#[cfg(feature = "serde")]
+impl<B: BitBlock + Serialize> Serialize for BitSet<B> {
+    fn serialize<S: Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
+        self.bit_vec.serialize(serializer)
+    }
+}
+
+#[cfg(feature = "serde")]
+impl<'de, B: BitBlock + Deserialize<'de>> Deserialize<'de> for BitSet<B> {
+    fn deserialize<D: Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
+        Ok(Self {
+            bit_vec: BitVec::deserialize(deserializer)?,
+        })
+    }
+}
+
 #[derive(Clone)]
 struct BlockIter<T, B> {
     head: B,