Skip to content

Commit 6ca0380

Browse files
committed
---
yaml --- r: 188004 b: refs/heads/master c: 7b6e43c h: refs/heads/master v: v3
1 parent df47024 commit 6ca0380

File tree

2 files changed

+18
-1
lines changed

2 files changed

+18
-1
lines changed

[refs]

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
---
2-
refs/heads/master: 84e9a61e9c697ffb6f6f783e9190d5a93dfdc10a
2+
refs/heads/master: 7b6e43c07f18243873d7cff428cca8cf8283467b
33
refs/heads/snap-stage1: e33de59e47c5076a89eadeb38f4934f58a3618a6
44
refs/heads/snap-stage3: 3a96d6a9818fe2affc98a187fb1065120458cee9
55
refs/heads/try: 3cfe2f4e4f6207f53d4e2e7201b7b2aeff802d84

trunk/src/librbml/lib.rs

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,10 @@ impl<'doc> Doc<'doc> {
6464
reader::get_doc(*self, tag)
6565
}
6666

67+
pub fn is_empty(&self) -> bool {
68+
self.start == self.end
69+
}
70+
6771
pub fn as_str_slice<'a>(&'a self) -> &'a str {
6872
str::from_utf8(&self.data[self.start..self.end]).unwrap()
6973
}
@@ -462,6 +466,11 @@ pub mod reader {
462466
}
463467

464468
fn _next_sub(&mut self) -> DecodeResult<uint> {
469+
// empty vector/map optimization
470+
if self.parent.is_empty() {
471+
return Ok(0);
472+
}
473+
465474
let (big, doc) = try!(self.next_doc2(EsSub8, EsSub32));
466475
let r = if big {
467476
doc_as_u32(doc) as uint
@@ -1148,6 +1157,10 @@ pub mod writer {
11481157
fn emit_seq<F>(&mut self, len: uint, f: F) -> EncodeResult where
11491158
F: FnOnce(&mut Encoder<'a>) -> EncodeResult,
11501159
{
1160+
if len == 0 {
1161+
// empty vector optimization
1162+
return self.wr_tagged_bytes(EsVec as uint, &[]);
1163+
}
11511164

11521165
try!(self.start_tag(EsVec as uint));
11531166
try!(self._emit_tagged_sub(len));
@@ -1167,6 +1180,10 @@ pub mod writer {
11671180
fn emit_map<F>(&mut self, len: uint, f: F) -> EncodeResult where
11681181
F: FnOnce(&mut Encoder<'a>) -> EncodeResult,
11691182
{
1183+
if len == 0 {
1184+
// empty map optimization
1185+
return self.wr_tagged_bytes(EsMap as uint, &[]);
1186+
}
11701187

11711188
try!(self.start_tag(EsMap as uint));
11721189
try!(self._emit_tagged_sub(len));

0 commit comments

Comments
 (0)