usecrate::builder::bytestr::ByteStr; usecrate::options::ZeroTrieWithOptions; usecrate::zerotrie::ZeroTrieFlavor; usecrate::ZeroAsciiIgnoreCaseTrie; usecrate::ZeroTrie; usecrate::ZeroTrieExtendedCapacity; usecrate::ZeroTriePerfectHash; usecrate::ZeroTrieSimpleAscii; use alloc::boxed::Box; use alloc::vec::Vec; use core::fmt; use litemap::LiteMap; use serde::de::Error; use serde::de::Visitor; use serde::Deserialize; use serde::Deserializer; use serde::Serialize; use serde::Serializer;
struct ByteStrVisitor; impl<'de> Visitor<'de> for ByteStrVisitor { type Value = Box<[u8]>; fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
write!(formatter, "a slice of borrowed bytes or a string")
} fn visit_bytes<E>(self, v: &[u8]) -> Result<Self::Value, E> {
Ok(Box::from(v))
} fn visit_str<E>(self, v: &str) -> Result<Self::Value, E> {
Ok(Box::from(v.as_bytes()))
} fn visit_seq<A>(self, mut v: A) -> Result<Self::Value, A::Error> where
A: serde::de::SeqAccess<'de>,
{ letmut result = Vec::with_capacity(v.size_hint().unwrap_or(0)); whilelet Some(x) = v.next_element::<u8>()? {
result.push(x);
}
Ok(Box::from(result))
}
}
impl<'data, 'de: 'data> Deserialize<'de> for &'data ByteStr { fn deserialize<D>(deserializer: D) -> Result<Self, D::Error> where
D: Deserializer<'de>,
{ let s = <&'data [u8]>::deserialize(deserializer)?;
Ok(ByteStr::from_bytes(s))
}
}
impl<'de> Deserialize<'de> forBox<ByteStr> { fn deserialize<D>(deserializer: D) -> Result<Self, D::Error> where
D: Deserializer<'de>,
{ if deserializer.is_human_readable() { let s = deserializer.deserialize_any(ByteStrVisitor)?;
Ok(ByteStr::from_boxed_bytes(s))
} else { let s = Vec::<u8>::deserialize(deserializer)?;
Ok(ByteStr::from_boxed_bytes(s.into_boxed_slice()))
}
}
}
impl Serialize for &ByteStr { fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error> where
S: Serializer,
{ let bytes = self.as_bytes(); if serializer.is_human_readable() { match core::str::from_utf8(bytes) {
Ok(s) => serializer.serialize_str(s),
Err(_) => serializer.serialize_bytes(bytes),
}
} else {
serializer.serialize_bytes(bytes)
}
}
}
impl<'data, 'de: 'data, Store> Deserialize<'de> for ZeroTrieSimpleAscii<Store> where // DISCUSS: There are several possibilities for the bounds here that would // get the job done. I could look for Deserialize, but this would require // creating a custom Deserializer for the map case. I also considered // introducing a new trait instead of relying on From.
Store: From<&'data [u8]> + From<Vec<u8>> + 'data,
{ fn deserialize<D>(deserializer: D) -> Result<Self, D::Error> where
D: Deserializer<'de>,
{ if deserializer.is_human_readable() { let lm = LiteMap::<Box<ByteStr>, usize>::deserialize(deserializer)?;
ZeroTrieSimpleAscii::try_from_serde_litemap(&lm)
.map_err(D::Error::custom)
.map(|trie| trie.convert_store())
} else { // Note: `impl Deserialize for &[u8]` uses visit_borrowed_bytes let (flags, trie_bytes) = <(u8, &[u8])>::deserialize(deserializer)?; ifSelf::OPTIONS.to_u8_flags() != flags { return Err(D::Error::custom("invalid ZeroTrie tag"));
};
Ok(ZeroTrieSimpleAscii::from_store(Store::from(trie_bytes)))
}
}
}
impl<Store> Serialize for ZeroTrieSimpleAscii<Store> where
Store: AsRef<[u8]>,
{ fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error> where
S: Serializer,
{ if serializer.is_human_readable() { let lm = self.to_litemap();
lm.serialize(serializer)
} else { // Note: `impl Serialize for ByteStr` uses `serialize_bytes`
(Self::FLAGS, ByteStr::from_bytes(self.as_bytes())).serialize(serializer)
}
}
}
impl<'de, 'data, Store> Deserialize<'de> for ZeroAsciiIgnoreCaseTrie<Store> where 'de: 'data, // DISCUSS: There are several possibilities for the bounds here that would // get the job done. I could look for Deserialize, but this would require // creating a custom Deserializer for the map case. I also considered // introducing a new trait instead of relying on From.
Store: From<&'data [u8]> + From<Vec<u8>> + 'data,
{ fn deserialize<D>(deserializer: D) -> Result<Self, D::Error> where
D: Deserializer<'de>,
{ if deserializer.is_human_readable() { let lm = LiteMap::<Box<ByteStr>, usize>::deserialize(deserializer)?;
ZeroAsciiIgnoreCaseTrie::try_from_serde_litemap(&lm)
.map_err(D::Error::custom)
.map(|trie| trie.convert_store())
} else { // Note: `impl Deserialize for &[u8]` uses visit_borrowed_bytes let (flags, trie_bytes) = <(u8, &[u8])>::deserialize(deserializer)?; ifSelf::OPTIONS.to_u8_flags() != flags { return Err(D::Error::custom("invalid ZeroTrie tag"));
}
Ok(ZeroAsciiIgnoreCaseTrie::from_store(Store::from(trie_bytes)))
}
}
}
impl<Store> Serialize for ZeroAsciiIgnoreCaseTrie<Store> where
Store: AsRef<[u8]>,
{ fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error> where
S: Serializer,
{ if serializer.is_human_readable() { let lm = self.to_litemap();
lm.serialize(serializer)
} else { // Note: `impl Serialize for ByteStr` uses `serialize_bytes`
( Self::OPTIONS.to_u8_flags(),
ByteStr::from_bytes(self.as_bytes()),
)
.serialize(serializer)
}
}
}
impl<'de, 'data, Store> Deserialize<'de> for ZeroTriePerfectHash<Store> where 'de: 'data,
Store: From<&'data [u8]> + From<Vec<u8>> + 'data,
{ fn deserialize<D>(deserializer: D) -> Result<Self, D::Error> where
D: Deserializer<'de>,
{ if deserializer.is_human_readable() { let lm = LiteMap::<Box<ByteStr>, usize>::deserialize(deserializer)?;
ZeroTriePerfectHash::try_from_serde_litemap(&lm)
.map_err(D::Error::custom)
.map(|trie| trie.convert_store())
} else { // Note: `impl Deserialize for &[u8]` uses visit_borrowed_bytes let (flags, trie_bytes) = <(u8, &[u8])>::deserialize(deserializer)?; ifSelf::OPTIONS.to_u8_flags() != flags { return Err(D::Error::custom("invalid ZeroTrie tag"));
}
Ok(ZeroTriePerfectHash::from_store(Store::from(trie_bytes)))
}
}
}
impl<Store> Serialize for ZeroTriePerfectHash<Store> where
Store: AsRef<[u8]>,
{ fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error> where
S: Serializer,
{ if serializer.is_human_readable() { let lm = self.to_litemap(); let lm = lm
.iter()
.map(|(k, v)| (ByteStr::from_bytes(k), v))
.collect::<LiteMap<_, _>>();
lm.serialize(serializer)
} else { // Note: `impl Serialize for ByteStr` uses `serialize_bytes`
( Self::OPTIONS.to_u8_flags(),
ByteStr::from_bytes(self.as_bytes()),
)
.serialize(serializer)
}
}
}
#[test] pubfn test_serde_simpleascii_cow() { let trie = ZeroTrieSimpleAscii::from_store(Cow::from(testdata::basic::TRIE_ASCII)); let original = ZeroTrieSimpleAsciiCow { trie }; let json_str = serde_json::to_string(&original).unwrap(); let bincode_bytes = bincode::serialize(&original).unwrap(); let rmp_bytes = rmp_serde::to_vec(&original).unwrap();
let json_recovered: ZeroTrieSimpleAsciiCow = serde_json::from_str(&json_str).unwrap(); let bincode_recovered: ZeroTrieSimpleAsciiCow =
bincode::deserialize(&bincode_bytes).unwrap(); let rmp_recovered: ZeroTrieSimpleAsciiCow = rmp_serde::from_slice(&rmp_bytes).unwrap();
#[test] pubfn test_serde_asciiignorecase_cow() { let trie = ZeroAsciiIgnoreCaseTrie::from_store(Cow::from(testdata::basic::TRIE_ASCII)); let original = ZeroAsciiIgnoreCaseTrieCow { trie }; let json_str = serde_json::to_string(&original).unwrap(); let bincode_bytes = bincode::serialize(&original).unwrap();
let json_recovered: ZeroAsciiIgnoreCaseTrieCow = serde_json::from_str(&json_str).unwrap(); let bincode_recovered: ZeroAsciiIgnoreCaseTrieCow =
bincode::deserialize(&bincode_bytes).unwrap();
#[test] pubfn test_serde_perfecthash_cow() { let trie = ZeroTriePerfectHash::from_store(Cow::from(testdata::basic::TRIE_ASCII)); let original = ZeroTriePerfectHashCow { trie }; let json_str = serde_json::to_string(&original).unwrap(); let bincode_bytes = bincode::serialize(&original).unwrap();
let json_recovered: ZeroTriePerfectHashCow = serde_json::from_str(&json_str).unwrap(); let bincode_recovered: ZeroTriePerfectHashCow =
bincode::deserialize(&bincode_bytes).unwrap();
#[test] pubfn test_serde_perfecthash_cow_u() { let trie = ZeroTriePerfectHash::from_store(Cow::from(testdata::basic::TRIE_UNICODE)); let original = ZeroTriePerfectHashCow { trie }; let json_str = serde_json::to_string(&original).unwrap(); let bincode_bytes = bincode::serialize(&original).unwrap();
let json_recovered: ZeroTriePerfectHashCow = serde_json::from_str(&json_str).unwrap(); let bincode_recovered: ZeroTriePerfectHashCow =
bincode::deserialize(&bincode_bytes).unwrap();
#[test] pubfn test_serde_perfecthash_cow_bin() { let trie = ZeroTriePerfectHash::from_store(Cow::from(testdata::basic::TRIE_BINARY)); let original = ZeroTriePerfectHashCow { trie }; let json_str = serde_json::to_string(&original).unwrap(); let bincode_bytes = bincode::serialize(&original).unwrap();
let json_recovered: ZeroTriePerfectHashCow = serde_json::from_str(&json_str).unwrap(); let bincode_recovered: ZeroTriePerfectHashCow =
bincode::deserialize(&bincode_bytes).unwrap();
#[test] pubfn test_serde_any_cow() { let trie =
ZeroTrieSimpleAscii::from_store(Cow::from(testdata::basic::TRIE_ASCII)).into_zerotrie(); let original = ZeroTrieAnyCow { trie }; let json_str = serde_json::to_string(&original).unwrap(); let bincode_bytes = bincode::serialize(&original).unwrap();
let json_recovered: ZeroTrieAnyCow = serde_json::from_str(&json_str).unwrap(); let bincode_recovered: ZeroTrieAnyCow = bincode::deserialize(&bincode_bytes).unwrap();
#[test] pubfn test_serde_any_cow_u() { let trie = ZeroTriePerfectHash::from_store(Cow::from(testdata::basic::TRIE_UNICODE))
.into_zerotrie(); let original = ZeroTrieAnyCow { trie }; let json_str = serde_json::to_string(&original).unwrap(); let bincode_bytes = bincode::serialize(&original).unwrap();
let json_recovered: ZeroTrieAnyCow = serde_json::from_str(&json_str).unwrap(); let bincode_recovered: ZeroTrieAnyCow = bincode::deserialize(&bincode_bytes).unwrap();
#[test] pubfn test_serde_simpleascii_zerovec() { let trie =
ZeroTrieSimpleAscii::from_store(ZeroVec::new_borrowed(testdata::basic::TRIE_ASCII)); let original = ZeroTrieSimpleAsciiZeroVec { trie }; let json_str = serde_json::to_string(&original).unwrap(); let bincode_bytes = bincode::serialize(&original).unwrap();
let json_recovered: ZeroTrieSimpleAsciiZeroVec = serde_json::from_str(&json_str).unwrap(); let bincode_recovered: ZeroTrieSimpleAsciiZeroVec =
bincode::deserialize(&bincode_bytes).unwrap();
#[test] pubfn test_serde_perfecthash_zerovec() { let trie =
ZeroTriePerfectHash::from_store(ZeroVec::new_borrowed(testdata::basic::TRIE_ASCII)); let original = ZeroTriePerfectHashZeroVec { trie }; let json_str = serde_json::to_string(&original).unwrap(); let bincode_bytes = bincode::serialize(&original).unwrap();
let json_recovered: ZeroTriePerfectHashZeroVec = serde_json::from_str(&json_str).unwrap(); let bincode_recovered: ZeroTriePerfectHashZeroVec =
bincode::deserialize(&bincode_bytes).unwrap();
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.