diff --git a/fastnbt/Cargo.toml b/fastnbt/Cargo.toml index b92e902..4c42d4a 100644 --- a/fastnbt/Cargo.toml +++ b/fastnbt/Cargo.toml @@ -19,6 +19,7 @@ serde_bytes = "0.11.5" [features] arbitrary1 = ["arbitrary"] +btreemap = [] [dev-dependencies] flate2 = "1" diff --git a/fastnbt/src/macros.rs b/fastnbt/src/macros.rs index 95f14a3..359250d 100644 --- a/fastnbt/src/macros.rs +++ b/fastnbt/src/macros.rs @@ -268,12 +268,12 @@ macro_rules! nbt_internal { }; ({}) => { - $crate::Value::Compound(std::collections::HashMap::new()) + $crate::Value::Compound($crate::value::Map::new()) }; ({ $($tt:tt)+ }) => { $crate::Value::Compound({ - let mut object = std::collections::HashMap::new(); + let mut object = $crate::value::Map::new(); nbt_internal!(@object object () ($($tt)+) ($($tt)+)); object }) diff --git a/fastnbt/src/value/de.rs b/fastnbt/src/value/de.rs index fd30df8..23ff47b 100644 --- a/fastnbt/src/value/de.rs +++ b/fastnbt/src/value/de.rs @@ -1,4 +1,4 @@ -use std::{borrow::Cow, collections::HashMap}; +use std::borrow::Cow; use serde::{ de::{ @@ -12,6 +12,8 @@ use serde_bytes::ByteBuf; use crate::{error::Error, ByteArray, IntArray, LongArray, Value}; +use super::Map; + impl<'de> Deserialize<'de> for Value { fn deserialize(deserializer: D) -> Result where @@ -100,7 +102,7 @@ impl<'de> Deserialize<'de> for Value { { match map.next_key_seed(KeyClassifier)? { Some(KeyClass::Compound(first_key)) => { - let mut compound = HashMap::new(); + let mut compound = Map::new(); compound.insert(first_key, map.next_value()?); while let Some((key, value)) = map.next_entry()? { @@ -252,10 +254,7 @@ where } } -fn visit_compound<'de, V>( - compound: &'de HashMap, - visitor: V, -) -> Result +fn visit_compound<'de, V>(compound: &'de Map, visitor: V) -> Result where V: Visitor<'de>, { @@ -735,12 +734,12 @@ impl<'de> SeqAccess<'de> for SeqDeserializer<'de> { } struct MapDeserializer<'de> { - iter: <&'de HashMap as IntoIterator>::IntoIter, + iter: <&'de Map as IntoIterator>::IntoIter, value: Option<&'de Value>, } impl<'de> MapDeserializer<'de> { - fn new(map: &'de HashMap) -> Self { + fn new(map: &'de Map) -> Self { MapDeserializer { iter: map.iter(), value: None, diff --git a/fastnbt/src/value/mod.rs b/fastnbt/src/value/mod.rs index 1e54f4f..46281dd 100644 --- a/fastnbt/src/value/mod.rs +++ b/fastnbt/src/value/mod.rs @@ -2,7 +2,10 @@ mod array_serializer; mod de; mod ser; -use std::collections::HashMap; +#[cfg(feature = "btreemap")] +pub type Map = std::collections::BTreeMap; +#[cfg(not(feature = "btreemap"))] +pub type Map = std::collections::HashMap; use serde::{serde_if_integer128, Deserialize, Serialize}; @@ -44,7 +47,7 @@ pub enum Value { IntArray(IntArray), LongArray(LongArray), List(Vec), - Compound(HashMap), + Compound(Map), } #[cfg(feature = "arbitrary1")] diff --git a/fastnbt/src/value/ser.rs b/fastnbt/src/value/ser.rs index 2d22336..578dd01 100644 --- a/fastnbt/src/value/ser.rs +++ b/fastnbt/src/value/ser.rs @@ -1,5 +1,4 @@ use core::result; -use std::collections::HashMap; use serde::{ser::Impossible, serde_if_integer128, Serialize}; @@ -9,7 +8,7 @@ use crate::{ LONG_ARRAY_TOKEN, }; -use super::array_serializer::ArraySerializer; +use super::{array_serializer::ArraySerializer, Map}; impl Serialize for Value { fn serialize(&self, serializer: S) -> result::Result @@ -275,7 +274,7 @@ impl<'a> serde::Serializer for &'a mut Serializer { fn serialize_map(self, _len: Option) -> Result { Ok(SerializeMap { - map: HashMap::new(), + map: Map::new(), next_key: None, }) } @@ -293,7 +292,7 @@ impl<'a> serde::Serializer for &'a mut Serializer { ) -> Result { Ok(SerializeStructVariant { name: variant.into(), - map: HashMap::new(), + map: Map::new(), }) } @@ -327,13 +326,13 @@ pub struct SerializeTupleVariant { } pub struct SerializeMap { - map: HashMap, + map: Map, next_key: Option, } pub struct SerializeStructVariant { name: String, - map: HashMap, + map: Map, } impl serde::ser::SerializeSeq for SerializeVec { @@ -398,7 +397,7 @@ impl serde::ser::SerializeTupleVariant for SerializeTupleVariant { } fn end(self) -> Result { - let mut object = HashMap::new(); + let mut object = Map::new(); object.insert(self.name, Value::List(self.vec)); @@ -661,7 +660,7 @@ impl serde::ser::SerializeStructVariant for SerializeStructVariant { } fn end(self) -> Result { - let mut object = HashMap::new(); + let mut object = Map::new(); object.insert(self.name, Value::Compound(self.map));