diff --git a/src/schema/document/owned_value.rs b/src/schema/document/owned_value.rs index 3dc7a1f67..1dad85a5f 100644 --- a/src/schema/document/owned_value.rs +++ b/src/schema/document/owned_value.rs @@ -1,4 +1,4 @@ -use std::collections::{btree_map, BTreeMap}; +use std::collections::BTreeMap; use std::fmt; use std::net::Ipv6Addr; @@ -45,7 +45,7 @@ pub enum OwnedValue { /// A set of values. Array(Vec), /// Dynamic object value. - Object(BTreeMap), + Object(Vec<(String, Self)>), /// IpV6 Address. Internally there is no IpV4, it needs to be converted to `Ipv6Addr`. IpAddr(Ipv6Addr), } @@ -148,10 +148,10 @@ impl ValueDeserialize for OwnedValue { fn visit_object<'de, A>(&self, mut access: A) -> Result where A: ObjectAccess<'de> { - let mut elements = BTreeMap::new(); + let mut elements = Vec::new(); while let Some((key, value)) = access.next_entry()? { - elements.insert(key, value); + elements.push((key, value)); } Ok(OwnedValue::Object(elements)) @@ -248,12 +248,13 @@ impl<'de> serde::Deserialize<'de> for OwnedValue { fn visit_map(self, mut map: A) -> Result where A: MapAccess<'de> { - let mut object = BTreeMap::new(); - + let mut object = + map.size_hint() + .map(Vec::with_capacity) + .unwrap_or_default(); while let Some((key, value)) = map.next_entry()? { - object.insert(key, value); + object.push((key, value)); } - Ok(OwnedValue::Object(object)) } } @@ -363,7 +364,8 @@ impl From for OwnedValue { impl From> for OwnedValue { fn from(object: BTreeMap) -> OwnedValue { - OwnedValue::Object(object) + let key_values = object.into_iter().collect(); + OwnedValue::Object(key_values) } } @@ -417,18 +419,15 @@ impl From for OwnedValue { impl From> for OwnedValue { fn from(map: serde_json::Map) -> Self { - let mut object = BTreeMap::new(); - - for (key, value) in map { - object.insert(key, OwnedValue::from(value)); - } - + let object: Vec<(String, OwnedValue)> = map.into_iter() + .map(|(key, value)| (key, OwnedValue::from(value))) + .collect(); OwnedValue::Object(object) } } /// A wrapper type for iterating over a serde_json object producing reference values. -pub struct ObjectMapIter<'a>(btree_map::Iter<'a, String, OwnedValue>); +pub struct ObjectMapIter<'a>(std::slice::Iter<'a, (String, OwnedValue)>); impl<'a> Iterator for ObjectMapIter<'a> { type Item = (&'a str, &'a OwnedValue);