diff options
| author | Edward Barnard | 2015-08-28 16:50:01 +0700 |
|---|---|---|
| committer | Edward Barnard | 2015-08-28 16:50:01 +0700 |
| commit | 0c2ad6b0d12524b7042d45a92c1b20d8082c662c (patch) | |
| tree | 099fb4ea08c347764dc3f9ec90ff5409bdfeeed3 /src/lib.rs | |
| parent | b0b34ef55e1d8a3783b7ddfbf5612b9176b20e66 (diff) | |
| download | rust-plist-0c2ad6b0d12524b7042d45a92c1b20d8082c662c.tar.bz2 | |
Add size hints for arrays and dictionaries
Diffstat (limited to 'src/lib.rs')
| -rw-r--r-- | src/lib.rs | 26 |
1 files changed, 16 insertions, 10 deletions
@@ -26,10 +26,10 @@ pub enum Plist { #[derive(Debug, PartialEq)] pub enum PlistEvent { - StartArray, + StartArray(Option<u64>), EndArray, - StartDictionary, + StartDictionary(Option<u64>), EndDictionary, BooleanValue(bool), @@ -169,8 +169,8 @@ impl<T:Iterator<Item=PlistEvent>> Builder<T> { fn build_value(&mut self) -> BuilderResult<Plist> { match self.token.take() { - Some(PlistEvent::StartArray) => Ok(Plist::Array(try!(self.build_array()))), - Some(PlistEvent::StartDictionary) => Ok(Plist::Dictionary(try!(self.build_dict()))), + Some(PlistEvent::StartArray(len)) => Ok(Plist::Array(try!(self.build_array(len)))), + Some(PlistEvent::StartDictionary(len)) => Ok(Plist::Dictionary(try!(self.build_dict(len)))), Some(PlistEvent::BooleanValue(b)) => Ok(Plist::Boolean(b)), Some(PlistEvent::DataValue(d)) => Ok(Plist::Data(d)), @@ -187,8 +187,11 @@ impl<T:Iterator<Item=PlistEvent>> Builder<T> { } } - fn build_array(&mut self) -> Result<Vec<Plist>, BuilderError> { - let mut values = Vec::new(); + fn build_array(&mut self, len: Option<u64>) -> Result<Vec<Plist>, BuilderError> { + let mut values = match len { + Some(len) => Vec::with_capacity(len as usize), + None => Vec::new() + }; loop { self.bump(); @@ -200,8 +203,11 @@ impl<T:Iterator<Item=PlistEvent>> Builder<T> { } } - fn build_dict(&mut self) -> Result<HashMap<String, Plist>, BuilderError> { - let mut values = HashMap::new(); + fn build_dict(&mut self, len: Option<u64>) -> Result<HashMap<String, Plist>, BuilderError> { + let mut values = match len { + Some(len) => HashMap::with_capacity(len as usize), + None => HashMap::new() + }; loop { @@ -234,11 +240,11 @@ mod tests { // Input let events = vec