1 // Copyright 2012-2014 The Rust Project Developers. See the COPYRIGHT
2 // file at the top-level directory of this distribution and at
3 // http://rust-lang.org/COPYRIGHT.
5 // Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
6 // http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
7 // <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
8 // option. This file may not be copied, modified, or distributed
9 // except according to those terms.
11 //! Really Bad Markup Language (rbml) is a temporary measure until we migrate
12 //! the rust object metadata to a better serialization format. It is not
13 //! intended to be used by users.
15 //! It is loosely based on the Extensible Binary Markup Language (ebml):
16 //! http://www.matroska.org/technical/specs/rfc/index.html
18 #![crate_name = "rbml"]
20 #![crate_type = "rlib"]
21 #![crate_type = "dylib"]
22 #![doc(html_logo_url = "http://www.rust-lang.org/logos/rust-logo-128x128-blk-v2.png",
23 html_favicon_url = "http://www.rust-lang.org/favicon.ico",
24 html_root_url = "http://doc.rust-lang.org/nightly/",
25 html_playground_url = "http://play.rust-lang.org/")]
26 #![allow(unknown_features)]
27 #![feature(macro_rules, phase, slicing_syntax, globs)]
28 #![feature(unboxed_closures, associated_types)]
29 #![allow(missing_docs)]
31 extern crate serialize;
33 #[phase(plugin, link)] extern crate log;
34 #[cfg(test)] extern crate test;
36 pub use self::EbmlEncoderTag::*;
37 pub use self::Error::*;
43 /// Common data structures
44 #[derive(Clone, Copy)]
51 impl<'doc> Doc<'doc> {
52 pub fn new(data: &'doc [u8]) -> Doc<'doc> {
53 Doc { data: data, start: 0u, end: data.len() }
56 pub fn get<'a>(&'a self, tag: uint) -> Doc<'a> {
57 reader::get_doc(*self, tag)
60 pub fn as_str_slice<'a>(&'a self) -> &'a str {
61 str::from_utf8(self.data[self.start..self.end]).unwrap()
64 pub fn as_str(&self) -> String {
65 self.as_str_slice().to_string()
69 pub struct TaggedDoc<'a> {
75 pub enum EbmlEncoderTag {
105 EsLabel, // Used only when debugging
112 IoError(std::io::IoError),
113 ApplicationError(String)
115 // --------------------------------------
121 use std::io::extensions::u64_from_be_bytes;
122 use std::mem::transmute;
124 use std::option::Option;
125 use std::option::Option::{None, Some};
129 use super::{ ApplicationError, EsVec, EsMap, EsEnum, EsVecLen, EsVecElt,
130 EsMapLen, EsMapKey, EsEnumVid, EsU64, EsU32, EsU16, EsU8, EsInt, EsI64,
131 EsI32, EsI16, EsI8, EsBool, EsF64, EsF32, EsChar, EsStr, EsMapVal,
132 EsEnumBody, EsUint, EsOpaque, EsLabel, EbmlEncoderTag, Doc, TaggedDoc,
133 Error, IntTooBig, Expected };
135 pub type DecodeResult<T> = Result<T, Error>;
138 macro_rules! try_or {
139 ($e:expr, $r:expr) => (
143 debug!("ignored error: {}", e);
157 fn vuint_at_slow(data: &[u8], start: uint) -> DecodeResult<Res> {
159 if a & 0x80u8 != 0u8 {
160 return Ok(Res {val: (a & 0x7fu8) as uint, next: start + 1u});
162 if a & 0x40u8 != 0u8 {
163 return Ok(Res {val: ((a & 0x3fu8) as uint) << 8u |
164 (data[start + 1u] as uint),
167 if a & 0x20u8 != 0u8 {
168 return Ok(Res {val: ((a & 0x1fu8) as uint) << 16u |
169 (data[start + 1u] as uint) << 8u |
170 (data[start + 2u] as uint),
173 if a & 0x10u8 != 0u8 {
174 return Ok(Res {val: ((a & 0x0fu8) as uint) << 24u |
175 (data[start + 1u] as uint) << 16u |
176 (data[start + 2u] as uint) << 8u |
177 (data[start + 3u] as uint),
180 Err(IntTooBig(a as uint))
183 pub fn vuint_at(data: &[u8], start: uint) -> DecodeResult<Res> {
184 if data.len() - start < 4 {
185 return vuint_at_slow(data, start);
188 // Lookup table for parsing EBML Element IDs as per http://ebml.sourceforge.net/specs/
189 // The Element IDs are parsed by reading a big endian u32 positioned at data[start].
190 // Using the four most significant bits of the u32 we lookup in the table below how the
191 // element ID should be derived from it.
193 // The table stores tuples (shift, mask) where shift is the number the u32 should be right
194 // shifted with and mask is the value the right shifted value should be masked with.
195 // If for example the most significant bit is set this means it's a class A ID and the u32
196 // should be right shifted with 24 and masked with 0x7f. Therefore we store (24, 0x7f) at
197 // index 0x8 - 0xF (four bit numbers where the most significant bit is set).
199 // By storing the number of shifts and masks in a table instead of checking in order if
200 // the most significant bit is set, the second most significant bit is set etc. we can
201 // replace up to three "and+branch" with a single table lookup which gives us a measured
202 // speedup of around 2x on x86_64.
203 static SHIFT_MASK_TABLE: [(uint, u32); 16] = [
204 (0, 0x0), (0, 0x0fffffff),
205 (8, 0x1fffff), (8, 0x1fffff),
206 (16, 0x3fff), (16, 0x3fff), (16, 0x3fff), (16, 0x3fff),
207 (24, 0x7f), (24, 0x7f), (24, 0x7f), (24, 0x7f),
208 (24, 0x7f), (24, 0x7f), (24, 0x7f), (24, 0x7f)
212 let ptr = data.as_ptr().offset(start as int) as *const u32;
213 let val = Int::from_be(*ptr);
215 let i = (val >> 28u) as uint;
216 let (shift, mask) = SHIFT_MASK_TABLE[i];
218 val: ((val >> shift) & mask) as uint,
219 next: start + (((32 - shift) >> 3) as uint)
224 pub fn doc_at<'a>(data: &'a [u8], start: uint) -> DecodeResult<TaggedDoc<'a>> {
225 let elt_tag = try!(vuint_at(data, start));
226 let elt_size = try!(vuint_at(data, elt_tag.next));
227 let end = elt_size.next + elt_size.val;
230 doc: Doc { data: data, start: elt_size.next, end: end }
234 pub fn maybe_get_doc<'a>(d: Doc<'a>, tg: uint) -> Option<Doc<'a>> {
235 let mut pos = d.start;
237 let elt_tag = try_or!(vuint_at(d.data, pos), None);
238 let elt_size = try_or!(vuint_at(d.data, elt_tag.next), None);
239 pos = elt_size.next + elt_size.val;
240 if elt_tag.val == tg {
241 return Some(Doc { data: d.data, start: elt_size.next,
248 pub fn get_doc<'a>(d: Doc<'a>, tg: uint) -> Doc<'a> {
249 match maybe_get_doc(d, tg) {
252 error!("failed to find block with tag {}", tg);
258 pub fn docs<F>(d: Doc, mut it: F) -> bool where
259 F: FnMut(uint, Doc) -> bool,
261 let mut pos = d.start;
263 let elt_tag = try_or!(vuint_at(d.data, pos), false);
264 let elt_size = try_or!(vuint_at(d.data, elt_tag.next), false);
265 pos = elt_size.next + elt_size.val;
266 let doc = Doc { data: d.data, start: elt_size.next, end: pos };
267 if !it(elt_tag.val, doc) {
274 pub fn tagged_docs<F>(d: Doc, tg: uint, mut it: F) -> bool where
275 F: FnMut(Doc) -> bool,
277 let mut pos = d.start;
279 let elt_tag = try_or!(vuint_at(d.data, pos), false);
280 let elt_size = try_or!(vuint_at(d.data, elt_tag.next), false);
281 pos = elt_size.next + elt_size.val;
282 if elt_tag.val == tg {
283 let doc = Doc { data: d.data, start: elt_size.next,
293 pub fn with_doc_data<T, F>(d: Doc, f: F) -> T where
294 F: FnOnce(&[u8]) -> T,
296 f(d.data[d.start..d.end])
300 pub fn doc_as_u8(d: Doc) -> u8 {
301 assert_eq!(d.end, d.start + 1u);
305 pub fn doc_as_u16(d: Doc) -> u16 {
306 assert_eq!(d.end, d.start + 2u);
307 u64_from_be_bytes(d.data, d.start, 2u) as u16
310 pub fn doc_as_u32(d: Doc) -> u32 {
311 assert_eq!(d.end, d.start + 4u);
312 u64_from_be_bytes(d.data, d.start, 4u) as u32
315 pub fn doc_as_u64(d: Doc) -> u64 {
316 assert_eq!(d.end, d.start + 8u);
317 u64_from_be_bytes(d.data, d.start, 8u)
320 pub fn doc_as_i8(d: Doc) -> i8 { doc_as_u8(d) as i8 }
321 pub fn doc_as_i16(d: Doc) -> i16 { doc_as_u16(d) as i16 }
322 pub fn doc_as_i32(d: Doc) -> i32 { doc_as_u32(d) as i32 }
323 pub fn doc_as_i64(d: Doc) -> i64 { doc_as_u64(d) as i64 }
325 pub struct Decoder<'a> {
330 impl<'doc> Decoder<'doc> {
331 pub fn new(d: Doc<'doc>) -> Decoder<'doc> {
338 fn _check_label(&mut self, lbl: &str) -> DecodeResult<()> {
339 if self.pos < self.parent.end {
340 let TaggedDoc { tag: r_tag, doc: r_doc } =
341 try!(doc_at(self.parent.data, self.pos));
343 if r_tag == (EsLabel as uint) {
344 self.pos = r_doc.end;
345 let str = r_doc.as_str_slice();
347 return Err(Expected(format!("Expected label {} but \
348 found {}", lbl, str)));
355 fn next_doc(&mut self, exp_tag: EbmlEncoderTag) -> DecodeResult<Doc<'doc>> {
356 debug!(". next_doc(exp_tag={})", exp_tag);
357 if self.pos >= self.parent.end {
358 return Err(Expected(format!("no more documents in \
361 let TaggedDoc { tag: r_tag, doc: r_doc } =
362 try!(doc_at(self.parent.data, self.pos));
363 debug!("self.parent={}-{} self.pos={} r_tag={} r_doc={}-{}",
370 if r_tag != (exp_tag as uint) {
371 return Err(Expected(format!("expected EBML doc with tag {} but \
372 found tag {}", exp_tag, r_tag)));
374 if r_doc.end > self.parent.end {
375 return Err(Expected(format!("invalid EBML, child extends to \
376 {:#x}, parent to {:#x}",
377 r_doc.end, self.parent.end)));
379 self.pos = r_doc.end;
383 fn push_doc<T, F>(&mut self, exp_tag: EbmlEncoderTag, f: F) -> DecodeResult<T> where
384 F: FnOnce(&mut Decoder<'doc>) -> DecodeResult<T>,
386 let d = try!(self.next_doc(exp_tag));
387 let old_parent = self.parent;
388 let old_pos = self.pos;
391 let r = try!(f(self));
392 self.parent = old_parent;
397 fn _next_uint(&mut self, exp_tag: EbmlEncoderTag) -> DecodeResult<uint> {
398 let r = doc_as_u32(try!(self.next_doc(exp_tag)));
399 debug!("_next_uint exp_tag={} result={}", exp_tag, r);
403 pub fn read_opaque<R, F>(&mut self, op: F) -> DecodeResult<R> where
404 F: FnOnce(&mut Decoder, Doc) -> DecodeResult<R>,
406 let doc = try!(self.next_doc(EsOpaque));
408 let (old_parent, old_pos) = (self.parent, self.pos);
410 self.pos = doc.start;
412 let result = try!(op(self, doc));
414 self.parent = old_parent;
421 impl<'doc> serialize::Decoder<Error> for Decoder<'doc> {
422 fn read_nil(&mut self) -> DecodeResult<()> { Ok(()) }
424 fn read_u64(&mut self) -> DecodeResult<u64> { Ok(doc_as_u64(try!(self.next_doc(EsU64)))) }
425 fn read_u32(&mut self) -> DecodeResult<u32> { Ok(doc_as_u32(try!(self.next_doc(EsU32)))) }
426 fn read_u16(&mut self) -> DecodeResult<u16> { Ok(doc_as_u16(try!(self.next_doc(EsU16)))) }
427 fn read_u8 (&mut self) -> DecodeResult<u8 > { Ok(doc_as_u8 (try!(self.next_doc(EsU8 )))) }
428 fn read_uint(&mut self) -> DecodeResult<uint> {
429 let v = doc_as_u64(try!(self.next_doc(EsUint)));
430 if v > (::std::uint::MAX as u64) {
431 Err(IntTooBig(v as uint))
437 fn read_i64(&mut self) -> DecodeResult<i64> {
438 Ok(doc_as_u64(try!(self.next_doc(EsI64))) as i64)
440 fn read_i32(&mut self) -> DecodeResult<i32> {
441 Ok(doc_as_u32(try!(self.next_doc(EsI32))) as i32)
443 fn read_i16(&mut self) -> DecodeResult<i16> {
444 Ok(doc_as_u16(try!(self.next_doc(EsI16))) as i16)
446 fn read_i8 (&mut self) -> DecodeResult<i8> {
447 Ok(doc_as_u8(try!(self.next_doc(EsI8 ))) as i8)
449 fn read_int(&mut self) -> DecodeResult<int> {
450 let v = doc_as_u64(try!(self.next_doc(EsInt))) as i64;
451 if v > (int::MAX as i64) || v < (int::MIN as i64) {
452 debug!("FIXME \\#6122: Removing this makes this function miscompile");
453 Err(IntTooBig(v as uint))
459 fn read_bool(&mut self) -> DecodeResult<bool> {
460 Ok(doc_as_u8(try!(self.next_doc(EsBool))) != 0)
463 fn read_f64(&mut self) -> DecodeResult<f64> {
464 let bits = doc_as_u64(try!(self.next_doc(EsF64)));
465 Ok(unsafe { transmute(bits) })
467 fn read_f32(&mut self) -> DecodeResult<f32> {
468 let bits = doc_as_u32(try!(self.next_doc(EsF32)));
469 Ok(unsafe { transmute(bits) })
471 fn read_char(&mut self) -> DecodeResult<char> {
472 Ok(char::from_u32(doc_as_u32(try!(self.next_doc(EsChar)))).unwrap())
474 fn read_str(&mut self) -> DecodeResult<String> {
475 Ok(try!(self.next_doc(EsStr)).as_str())
479 fn read_enum<T, F>(&mut self, name: &str, f: F) -> DecodeResult<T> where
480 F: FnOnce(&mut Decoder<'doc>) -> DecodeResult<T>,
482 debug!("read_enum({})", name);
483 try!(self._check_label(name));
485 let doc = try!(self.next_doc(EsEnum));
487 let (old_parent, old_pos) = (self.parent, self.pos);
489 self.pos = self.parent.start;
491 let result = try!(f(self));
493 self.parent = old_parent;
498 fn read_enum_variant<T, F>(&mut self, _: &[&str],
499 mut f: F) -> DecodeResult<T>
500 where F: FnMut(&mut Decoder<'doc>, uint) -> DecodeResult<T>,
502 debug!("read_enum_variant()");
503 let idx = try!(self._next_uint(EsEnumVid));
504 debug!(" idx={}", idx);
506 let doc = try!(self.next_doc(EsEnumBody));
508 let (old_parent, old_pos) = (self.parent, self.pos);
510 self.pos = self.parent.start;
512 let result = try!(f(self, idx));
514 self.parent = old_parent;
519 fn read_enum_variant_arg<T, F>(&mut self, idx: uint, f: F) -> DecodeResult<T> where
520 F: FnOnce(&mut Decoder<'doc>) -> DecodeResult<T>,
522 debug!("read_enum_variant_arg(idx={})", idx);
526 fn read_enum_struct_variant<T, F>(&mut self, _: &[&str],
527 mut f: F) -> DecodeResult<T>
528 where F: FnMut(&mut Decoder<'doc>, uint) -> DecodeResult<T>,
530 debug!("read_enum_struct_variant()");
531 let idx = try!(self._next_uint(EsEnumVid));
532 debug!(" idx={}", idx);
534 let doc = try!(self.next_doc(EsEnumBody));
536 let (old_parent, old_pos) = (self.parent, self.pos);
538 self.pos = self.parent.start;
540 let result = try!(f(self, idx));
542 self.parent = old_parent;
547 fn read_enum_struct_variant_field<T, F>(&mut self,
551 -> DecodeResult<T> where
552 F: FnOnce(&mut Decoder<'doc>) -> DecodeResult<T>,
554 debug!("read_enum_struct_variant_arg(name={}, idx={})", name, idx);
558 fn read_struct<T, F>(&mut self, name: &str, _: uint, f: F) -> DecodeResult<T> where
559 F: FnOnce(&mut Decoder<'doc>) -> DecodeResult<T>,
561 debug!("read_struct(name={})", name);
565 fn read_struct_field<T, F>(&mut self, name: &str, idx: uint, f: F) -> DecodeResult<T> where
566 F: FnOnce(&mut Decoder<'doc>) -> DecodeResult<T>,
568 debug!("read_struct_field(name={}, idx={})", name, idx);
569 try!(self._check_label(name));
573 fn read_tuple<T, F>(&mut self, tuple_len: uint, f: F) -> DecodeResult<T> where
574 F: FnOnce(&mut Decoder<'doc>) -> DecodeResult<T>,
576 debug!("read_tuple()");
577 self.read_seq(move |d, len| {
578 if len == tuple_len {
581 Err(Expected(format!("Expected tuple of length `{}`, \
582 found tuple of length `{}`", tuple_len, len)))
587 fn read_tuple_arg<T, F>(&mut self, idx: uint, f: F) -> DecodeResult<T> where
588 F: FnOnce(&mut Decoder<'doc>) -> DecodeResult<T>,
590 debug!("read_tuple_arg(idx={})", idx);
591 self.read_seq_elt(idx, f)
594 fn read_tuple_struct<T, F>(&mut self, name: &str, len: uint, f: F) -> DecodeResult<T> where
595 F: FnOnce(&mut Decoder<'doc>) -> DecodeResult<T>,
597 debug!("read_tuple_struct(name={})", name);
598 self.read_tuple(len, f)
601 fn read_tuple_struct_arg<T, F>(&mut self,
604 -> DecodeResult<T> where
605 F: FnOnce(&mut Decoder<'doc>) -> DecodeResult<T>,
607 debug!("read_tuple_struct_arg(idx={})", idx);
608 self.read_tuple_arg(idx, f)
611 fn read_option<T, F>(&mut self, mut f: F) -> DecodeResult<T> where
612 F: FnMut(&mut Decoder<'doc>, bool) -> DecodeResult<T>,
614 debug!("read_option()");
615 self.read_enum("Option", move |this| {
616 this.read_enum_variant(&["None", "Some"], move |this, idx| {
621 Err(Expected(format!("Expected None or Some")))
628 fn read_seq<T, F>(&mut self, f: F) -> DecodeResult<T> where
629 F: FnOnce(&mut Decoder<'doc>, uint) -> DecodeResult<T>,
631 debug!("read_seq()");
632 self.push_doc(EsVec, move |d| {
633 let len = try!(d._next_uint(EsVecLen));
634 debug!(" len={}", len);
639 fn read_seq_elt<T, F>(&mut self, idx: uint, f: F) -> DecodeResult<T> where
640 F: FnOnce(&mut Decoder<'doc>) -> DecodeResult<T>,
642 debug!("read_seq_elt(idx={})", idx);
643 self.push_doc(EsVecElt, f)
646 fn read_map<T, F>(&mut self, f: F) -> DecodeResult<T> where
647 F: FnOnce(&mut Decoder<'doc>, uint) -> DecodeResult<T>,
649 debug!("read_map()");
650 self.push_doc(EsMap, move |d| {
651 let len = try!(d._next_uint(EsMapLen));
652 debug!(" len={}", len);
657 fn read_map_elt_key<T, F>(&mut self, idx: uint, f: F) -> DecodeResult<T> where
658 F: FnOnce(&mut Decoder<'doc>) -> DecodeResult<T>,
660 debug!("read_map_elt_key(idx={})", idx);
661 self.push_doc(EsMapKey, f)
664 fn read_map_elt_val<T, F>(&mut self, idx: uint, f: F) -> DecodeResult<T> where
665 F: FnOnce(&mut Decoder<'doc>) -> DecodeResult<T>,
667 debug!("read_map_elt_val(idx={})", idx);
668 self.push_doc(EsMapVal, f)
671 fn error(&mut self, err: &str) -> Error {
672 ApplicationError(err.to_string())
677 impl<'doc> serialize::Decoder for Decoder<'doc> {
679 fn read_nil(&mut self) -> DecodeResult<()> { Ok(()) }
681 fn read_u64(&mut self) -> DecodeResult<u64> { Ok(doc_as_u64(try!(self.next_doc(EsU64)))) }
682 fn read_u32(&mut self) -> DecodeResult<u32> { Ok(doc_as_u32(try!(self.next_doc(EsU32)))) }
683 fn read_u16(&mut self) -> DecodeResult<u16> { Ok(doc_as_u16(try!(self.next_doc(EsU16)))) }
684 fn read_u8 (&mut self) -> DecodeResult<u8 > { Ok(doc_as_u8 (try!(self.next_doc(EsU8 )))) }
685 fn read_uint(&mut self) -> DecodeResult<uint> {
686 let v = doc_as_u64(try!(self.next_doc(EsUint)));
687 if v > (::std::uint::MAX as u64) {
688 Err(IntTooBig(v as uint))
694 fn read_i64(&mut self) -> DecodeResult<i64> {
695 Ok(doc_as_u64(try!(self.next_doc(EsI64))) as i64)
697 fn read_i32(&mut self) -> DecodeResult<i32> {
698 Ok(doc_as_u32(try!(self.next_doc(EsI32))) as i32)
700 fn read_i16(&mut self) -> DecodeResult<i16> {
701 Ok(doc_as_u16(try!(self.next_doc(EsI16))) as i16)
703 fn read_i8 (&mut self) -> DecodeResult<i8> {
704 Ok(doc_as_u8(try!(self.next_doc(EsI8 ))) as i8)
706 fn read_int(&mut self) -> DecodeResult<int> {
707 let v = doc_as_u64(try!(self.next_doc(EsInt))) as i64;
708 if v > (int::MAX as i64) || v < (int::MIN as i64) {
709 debug!("FIXME \\#6122: Removing this makes this function miscompile");
710 Err(IntTooBig(v as uint))
716 fn read_bool(&mut self) -> DecodeResult<bool> {
717 Ok(doc_as_u8(try!(self.next_doc(EsBool))) != 0)
720 fn read_f64(&mut self) -> DecodeResult<f64> {
721 let bits = doc_as_u64(try!(self.next_doc(EsF64)));
722 Ok(unsafe { transmute(bits) })
724 fn read_f32(&mut self) -> DecodeResult<f32> {
725 let bits = doc_as_u32(try!(self.next_doc(EsF32)));
726 Ok(unsafe { transmute(bits) })
728 fn read_char(&mut self) -> DecodeResult<char> {
729 Ok(char::from_u32(doc_as_u32(try!(self.next_doc(EsChar)))).unwrap())
731 fn read_str(&mut self) -> DecodeResult<String> {
732 Ok(try!(self.next_doc(EsStr)).as_str())
736 fn read_enum<T, F>(&mut self, name: &str, f: F) -> DecodeResult<T> where
737 F: FnOnce(&mut Decoder<'doc>) -> DecodeResult<T>,
739 debug!("read_enum({})", name);
740 try!(self._check_label(name));
742 let doc = try!(self.next_doc(EsEnum));
744 let (old_parent, old_pos) = (self.parent, self.pos);
746 self.pos = self.parent.start;
748 let result = try!(f(self));
750 self.parent = old_parent;
755 fn read_enum_variant<T, F>(&mut self, _: &[&str],
756 mut f: F) -> DecodeResult<T>
757 where F: FnMut(&mut Decoder<'doc>, uint) -> DecodeResult<T>,
759 debug!("read_enum_variant()");
760 let idx = try!(self._next_uint(EsEnumVid));
761 debug!(" idx={}", idx);
763 let doc = try!(self.next_doc(EsEnumBody));
765 let (old_parent, old_pos) = (self.parent, self.pos);
767 self.pos = self.parent.start;
769 let result = try!(f(self, idx));
771 self.parent = old_parent;
776 fn read_enum_variant_arg<T, F>(&mut self, idx: uint, f: F) -> DecodeResult<T> where
777 F: FnOnce(&mut Decoder<'doc>) -> DecodeResult<T>,
779 debug!("read_enum_variant_arg(idx={})", idx);
783 fn read_enum_struct_variant<T, F>(&mut self, _: &[&str],
784 mut f: F) -> DecodeResult<T>
785 where F: FnMut(&mut Decoder<'doc>, uint) -> DecodeResult<T>,
787 debug!("read_enum_struct_variant()");
788 let idx = try!(self._next_uint(EsEnumVid));
789 debug!(" idx={}", idx);
791 let doc = try!(self.next_doc(EsEnumBody));
793 let (old_parent, old_pos) = (self.parent, self.pos);
795 self.pos = self.parent.start;
797 let result = try!(f(self, idx));
799 self.parent = old_parent;
804 fn read_enum_struct_variant_field<T, F>(&mut self,
808 -> DecodeResult<T> where
809 F: FnOnce(&mut Decoder<'doc>) -> DecodeResult<T>,
811 debug!("read_enum_struct_variant_arg(name={}, idx={})", name, idx);
815 fn read_struct<T, F>(&mut self, name: &str, _: uint, f: F) -> DecodeResult<T> where
816 F: FnOnce(&mut Decoder<'doc>) -> DecodeResult<T>,
818 debug!("read_struct(name={})", name);
822 fn read_struct_field<T, F>(&mut self, name: &str, idx: uint, f: F) -> DecodeResult<T> where
823 F: FnOnce(&mut Decoder<'doc>) -> DecodeResult<T>,
825 debug!("read_struct_field(name={}, idx={})", name, idx);
826 try!(self._check_label(name));
830 fn read_tuple<T, F>(&mut self, tuple_len: uint, f: F) -> DecodeResult<T> where
831 F: FnOnce(&mut Decoder<'doc>) -> DecodeResult<T>,
833 debug!("read_tuple()");
834 self.read_seq(move |d, len| {
835 if len == tuple_len {
838 Err(Expected(format!("Expected tuple of length `{}`, \
839 found tuple of length `{}`", tuple_len, len)))
844 fn read_tuple_arg<T, F>(&mut self, idx: uint, f: F) -> DecodeResult<T> where
845 F: FnOnce(&mut Decoder<'doc>) -> DecodeResult<T>,
847 debug!("read_tuple_arg(idx={})", idx);
848 self.read_seq_elt(idx, f)
851 fn read_tuple_struct<T, F>(&mut self, name: &str, len: uint, f: F) -> DecodeResult<T> where
852 F: FnOnce(&mut Decoder<'doc>) -> DecodeResult<T>,
854 debug!("read_tuple_struct(name={})", name);
855 self.read_tuple(len, f)
858 fn read_tuple_struct_arg<T, F>(&mut self,
861 -> DecodeResult<T> where
862 F: FnOnce(&mut Decoder<'doc>) -> DecodeResult<T>,
864 debug!("read_tuple_struct_arg(idx={})", idx);
865 self.read_tuple_arg(idx, f)
868 fn read_option<T, F>(&mut self, mut f: F) -> DecodeResult<T> where
869 F: FnMut(&mut Decoder<'doc>, bool) -> DecodeResult<T>,
871 debug!("read_option()");
872 self.read_enum("Option", move |this| {
873 this.read_enum_variant(&["None", "Some"], move |this, idx| {
878 Err(Expected(format!("Expected None or Some")))
885 fn read_seq<T, F>(&mut self, f: F) -> DecodeResult<T> where
886 F: FnOnce(&mut Decoder<'doc>, uint) -> DecodeResult<T>,
888 debug!("read_seq()");
889 self.push_doc(EsVec, move |d| {
890 let len = try!(d._next_uint(EsVecLen));
891 debug!(" len={}", len);
896 fn read_seq_elt<T, F>(&mut self, idx: uint, f: F) -> DecodeResult<T> where
897 F: FnOnce(&mut Decoder<'doc>) -> DecodeResult<T>,
899 debug!("read_seq_elt(idx={})", idx);
900 self.push_doc(EsVecElt, f)
903 fn read_map<T, F>(&mut self, f: F) -> DecodeResult<T> where
904 F: FnOnce(&mut Decoder<'doc>, uint) -> DecodeResult<T>,
906 debug!("read_map()");
907 self.push_doc(EsMap, move |d| {
908 let len = try!(d._next_uint(EsMapLen));
909 debug!(" len={}", len);
914 fn read_map_elt_key<T, F>(&mut self, idx: uint, f: F) -> DecodeResult<T> where
915 F: FnOnce(&mut Decoder<'doc>) -> DecodeResult<T>,
917 debug!("read_map_elt_key(idx={})", idx);
918 self.push_doc(EsMapKey, f)
921 fn read_map_elt_val<T, F>(&mut self, idx: uint, f: F) -> DecodeResult<T> where
922 F: FnOnce(&mut Decoder<'doc>) -> DecodeResult<T>,
924 debug!("read_map_elt_val(idx={})", idx);
925 self.push_doc(EsMapVal, f)
928 fn error(&mut self, err: &str) -> Error {
929 ApplicationError(err.to_string())
935 use std::clone::Clone;
936 use std::io::extensions::u64_to_be_bytes;
937 use std::io::{Writer, Seek};
941 use super::{ EsVec, EsMap, EsEnum, EsVecLen, EsVecElt, EsMapLen, EsMapKey,
942 EsEnumVid, EsU64, EsU32, EsU16, EsU8, EsInt, EsI64, EsI32, EsI16, EsI8,
943 EsBool, EsF64, EsF32, EsChar, EsStr, EsMapVal, EsEnumBody, EsUint,
944 EsOpaque, EsLabel, EbmlEncoderTag };
949 pub type EncodeResult = io::IoResult<()>;
952 pub struct Encoder<'a, W:'a> {
953 pub writer: &'a mut W,
954 size_positions: Vec<uint>,
957 fn write_sized_vuint<W: Writer>(w: &mut W, n: uint, size: uint) -> EncodeResult {
959 1u => w.write(&[0x80u8 | (n as u8)]),
960 2u => w.write(&[0x40u8 | ((n >> 8_u) as u8), n as u8]),
961 3u => w.write(&[0x20u8 | ((n >> 16_u) as u8), (n >> 8_u) as u8,
963 4u => w.write(&[0x10u8 | ((n >> 24_u) as u8), (n >> 16_u) as u8,
964 (n >> 8_u) as u8, n as u8]),
965 _ => Err(io::IoError {
966 kind: io::OtherIoError,
968 detail: Some(format!("{}", n))
973 fn write_vuint<W: Writer>(w: &mut W, n: uint) -> EncodeResult {
974 if n < 0x7f_u { return write_sized_vuint(w, n, 1u); }
975 if n < 0x4000_u { return write_sized_vuint(w, n, 2u); }
976 if n < 0x200000_u { return write_sized_vuint(w, n, 3u); }
977 if n < 0x10000000_u { return write_sized_vuint(w, n, 4u); }
979 kind: io::OtherIoError,
981 detail: Some(format!("{}", n))
985 // FIXME (#2741): Provide a function to write the standard rbml header.
986 impl<'a, W: Writer + Seek> Encoder<'a, W> {
987 pub fn new(w: &'a mut W) -> Encoder<'a, W> {
990 size_positions: vec!(),
994 /// FIXME(pcwalton): Workaround for badness in trans. DO NOT USE ME.
995 pub unsafe fn unsafe_clone(&self) -> Encoder<'a, W> {
997 writer: mem::transmute_copy(&self.writer),
998 size_positions: self.size_positions.clone(),
1002 pub fn start_tag(&mut self, tag_id: uint) -> EncodeResult {
1003 debug!("Start tag {}", tag_id);
1005 // Write the enum ID:
1006 try!(write_vuint(self.writer, tag_id));
1008 // Write a placeholder four-byte size.
1009 self.size_positions.push(try!(self.writer.tell()) as uint);
1010 let zeroes: &[u8] = &[0u8, 0u8, 0u8, 0u8];
1011 self.writer.write(zeroes)
1014 pub fn end_tag(&mut self) -> EncodeResult {
1015 let last_size_pos = self.size_positions.pop().unwrap();
1016 let cur_pos = try!(self.writer.tell());
1017 try!(self.writer.seek(last_size_pos as i64, io::SeekSet));
1018 let size = cur_pos as uint - last_size_pos - 4;
1019 try!(write_sized_vuint(self.writer, size, 4u));
1020 let r = try!(self.writer.seek(cur_pos as i64, io::SeekSet));
1022 debug!("End tag (size = {})", size);
1026 pub fn wr_tag<F>(&mut self, tag_id: uint, blk: F) -> EncodeResult where
1027 F: FnOnce() -> EncodeResult,
1029 try!(self.start_tag(tag_id));
1034 pub fn wr_tagged_bytes(&mut self, tag_id: uint, b: &[u8]) -> EncodeResult {
1035 try!(write_vuint(self.writer, tag_id));
1036 try!(write_vuint(self.writer, b.len()));
1037 self.writer.write(b)
1040 pub fn wr_tagged_u64(&mut self, tag_id: uint, v: u64) -> EncodeResult {
1041 u64_to_be_bytes(v, 8u, |v| {
1042 self.wr_tagged_bytes(tag_id, v)
1046 pub fn wr_tagged_u32(&mut self, tag_id: uint, v: u32) -> EncodeResult{
1047 u64_to_be_bytes(v as u64, 4u, |v| {
1048 self.wr_tagged_bytes(tag_id, v)
1052 pub fn wr_tagged_u16(&mut self, tag_id: uint, v: u16) -> EncodeResult {
1053 u64_to_be_bytes(v as u64, 2u, |v| {
1054 self.wr_tagged_bytes(tag_id, v)
1058 pub fn wr_tagged_u8(&mut self, tag_id: uint, v: u8) -> EncodeResult {
1059 self.wr_tagged_bytes(tag_id, &[v])
1062 pub fn wr_tagged_i64(&mut self, tag_id: uint, v: i64) -> EncodeResult {
1063 u64_to_be_bytes(v as u64, 8u, |v| {
1064 self.wr_tagged_bytes(tag_id, v)
1068 pub fn wr_tagged_i32(&mut self, tag_id: uint, v: i32) -> EncodeResult {
1069 u64_to_be_bytes(v as u64, 4u, |v| {
1070 self.wr_tagged_bytes(tag_id, v)
1074 pub fn wr_tagged_i16(&mut self, tag_id: uint, v: i16) -> EncodeResult {
1075 u64_to_be_bytes(v as u64, 2u, |v| {
1076 self.wr_tagged_bytes(tag_id, v)
1080 pub fn wr_tagged_i8(&mut self, tag_id: uint, v: i8) -> EncodeResult {
1081 self.wr_tagged_bytes(tag_id, &[v as u8])
1084 pub fn wr_tagged_str(&mut self, tag_id: uint, v: &str) -> EncodeResult {
1085 self.wr_tagged_bytes(tag_id, v.as_bytes())
1088 pub fn wr_bytes(&mut self, b: &[u8]) -> EncodeResult {
1089 debug!("Write {} bytes", b.len());
1090 self.writer.write(b)
1093 pub fn wr_str(&mut self, s: &str) -> EncodeResult {
1094 debug!("Write str: {}", s);
1095 self.writer.write(s.as_bytes())
1099 // FIXME (#2743): optionally perform "relaxations" on end_tag to more
1100 // efficiently encode sizes; this is a fixed point iteration
1102 // Set to true to generate more debugging in EBML code.
1103 // Totally lame approach.
1104 static DEBUG: bool = true;
1106 impl<'a, W: Writer + Seek> Encoder<'a, W> {
1107 // used internally to emit things like the vector length and so on
1108 fn _emit_tagged_uint(&mut self, t: EbmlEncoderTag, v: uint) -> EncodeResult {
1109 assert!(v <= 0xFFFF_FFFF_u);
1110 self.wr_tagged_u32(t as uint, v as u32)
1113 fn _emit_label(&mut self, label: &str) -> EncodeResult {
1114 // There are various strings that we have access to, such as
1115 // the name of a record field, which do not actually appear in
1116 // the encoded EBML (normally). This is just for
1117 // efficiency. When debugging, though, we can emit such
1118 // labels and then they will be checked by decoder to
1119 // try and check panics more quickly.
1120 if DEBUG { self.wr_tagged_str(EsLabel as uint, label) }
1124 pub fn emit_opaque<F>(&mut self, f: F) -> EncodeResult where
1125 F: FnOnce(&mut Encoder<W>) -> EncodeResult,
1127 try!(self.start_tag(EsOpaque as uint));
1134 impl<'a, W: Writer + Seek> serialize::Encoder<io::IoError> for Encoder<'a, W> {
1136 fn emit_nil(&mut self) -> EncodeResult {
1140 fn emit_uint(&mut self, v: uint) -> EncodeResult {
1141 self.wr_tagged_u64(EsUint as uint, v as u64)
1143 fn emit_u64(&mut self, v: u64) -> EncodeResult {
1144 self.wr_tagged_u64(EsU64 as uint, v)
1146 fn emit_u32(&mut self, v: u32) -> EncodeResult {
1147 self.wr_tagged_u32(EsU32 as uint, v)
1149 fn emit_u16(&mut self, v: u16) -> EncodeResult {
1150 self.wr_tagged_u16(EsU16 as uint, v)
1152 fn emit_u8(&mut self, v: u8) -> EncodeResult {
1153 self.wr_tagged_u8(EsU8 as uint, v)
1156 fn emit_int(&mut self, v: int) -> EncodeResult {
1157 self.wr_tagged_i64(EsInt as uint, v as i64)
1159 fn emit_i64(&mut self, v: i64) -> EncodeResult {
1160 self.wr_tagged_i64(EsI64 as uint, v)
1162 fn emit_i32(&mut self, v: i32) -> EncodeResult {
1163 self.wr_tagged_i32(EsI32 as uint, v)
1165 fn emit_i16(&mut self, v: i16) -> EncodeResult {
1166 self.wr_tagged_i16(EsI16 as uint, v)
1168 fn emit_i8(&mut self, v: i8) -> EncodeResult {
1169 self.wr_tagged_i8(EsI8 as uint, v)
1172 fn emit_bool(&mut self, v: bool) -> EncodeResult {
1173 self.wr_tagged_u8(EsBool as uint, v as u8)
1176 fn emit_f64(&mut self, v: f64) -> EncodeResult {
1177 let bits = unsafe { mem::transmute(v) };
1178 self.wr_tagged_u64(EsF64 as uint, bits)
1180 fn emit_f32(&mut self, v: f32) -> EncodeResult {
1181 let bits = unsafe { mem::transmute(v) };
1182 self.wr_tagged_u32(EsF32 as uint, bits)
1184 fn emit_char(&mut self, v: char) -> EncodeResult {
1185 self.wr_tagged_u32(EsChar as uint, v as u32)
1188 fn emit_str(&mut self, v: &str) -> EncodeResult {
1189 self.wr_tagged_str(EsStr as uint, v)
1192 fn emit_enum<F>(&mut self, name: &str, f: F) -> EncodeResult where
1193 F: FnOnce(&mut Encoder<'a, W>) -> EncodeResult,
1195 try!(self._emit_label(name));
1196 try!(self.start_tag(EsEnum as uint));
1201 fn emit_enum_variant<F>(&mut self,
1205 f: F) -> EncodeResult where
1206 F: FnOnce(&mut Encoder<'a, W>) -> EncodeResult,
1208 try!(self._emit_tagged_uint(EsEnumVid, v_id));
1209 try!(self.start_tag(EsEnumBody as uint));
1214 fn emit_enum_variant_arg<F>(&mut self, _: uint, f: F) -> EncodeResult where
1215 F: FnOnce(&mut Encoder<'a, W>) -> EncodeResult,
1220 fn emit_enum_struct_variant<F>(&mut self,
1224 f: F) -> EncodeResult where
1225 F: FnOnce(&mut Encoder<'a, W>) -> EncodeResult,
1227 self.emit_enum_variant(v_name, v_id, cnt, f)
1230 fn emit_enum_struct_variant_field<F>(&mut self,
1233 f: F) -> EncodeResult where
1234 F: FnOnce(&mut Encoder<'a, W>) -> EncodeResult,
1236 self.emit_enum_variant_arg(idx, f)
1239 fn emit_struct<F>(&mut self, _: &str, _len: uint, f: F) -> EncodeResult where
1240 F: FnOnce(&mut Encoder<'a, W>) -> EncodeResult,
1245 fn emit_struct_field<F>(&mut self, name: &str, _: uint, f: F) -> EncodeResult where
1246 F: FnOnce(&mut Encoder<'a, W>) -> EncodeResult,
1248 try!(self._emit_label(name));
1252 fn emit_tuple<F>(&mut self, len: uint, f: F) -> EncodeResult where
1253 F: FnOnce(&mut Encoder<'a, W>) -> EncodeResult,
1255 self.emit_seq(len, f)
1257 fn emit_tuple_arg<F>(&mut self, idx: uint, f: F) -> EncodeResult where
1258 F: FnOnce(&mut Encoder<'a, W>) -> EncodeResult,
1260 self.emit_seq_elt(idx, f)
1263 fn emit_tuple_struct<F>(&mut self, _: &str, len: uint, f: F) -> EncodeResult where
1264 F: FnOnce(&mut Encoder<'a, W>) -> EncodeResult,
1266 self.emit_seq(len, f)
1268 fn emit_tuple_struct_arg<F>(&mut self, idx: uint, f: F) -> EncodeResult where
1269 F: FnOnce(&mut Encoder<'a, W>) -> EncodeResult,
1271 self.emit_seq_elt(idx, f)
1274 fn emit_option<F>(&mut self, f: F) -> EncodeResult where
1275 F: FnOnce(&mut Encoder<'a, W>) -> EncodeResult,
1277 self.emit_enum("Option", f)
1279 fn emit_option_none(&mut self) -> EncodeResult {
1280 self.emit_enum_variant("None", 0, 0, |_| Ok(()))
1282 fn emit_option_some<F>(&mut self, f: F) -> EncodeResult where
1283 F: FnOnce(&mut Encoder<'a, W>) -> EncodeResult,
1286 self.emit_enum_variant("Some", 1, 1, f)
1289 fn emit_seq<F>(&mut self, len: uint, f: F) -> EncodeResult where
1290 F: FnOnce(&mut Encoder<'a, W>) -> EncodeResult,
1293 try!(self.start_tag(EsVec as uint));
1294 try!(self._emit_tagged_uint(EsVecLen, len));
1299 fn emit_seq_elt<F>(&mut self, _idx: uint, f: F) -> EncodeResult where
1300 F: FnOnce(&mut Encoder<'a, W>) -> EncodeResult,
1303 try!(self.start_tag(EsVecElt as uint));
1308 fn emit_map<F>(&mut self, len: uint, f: F) -> EncodeResult where
1309 F: FnOnce(&mut Encoder<'a, W>) -> EncodeResult,
1312 try!(self.start_tag(EsMap as uint));
1313 try!(self._emit_tagged_uint(EsMapLen, len));
1318 fn emit_map_elt_key<F>(&mut self, _idx: uint, mut f: F) -> EncodeResult where
1319 F: FnMut(&mut Encoder<'a, W>) -> EncodeResult,
1322 try!(self.start_tag(EsMapKey as uint));
1327 fn emit_map_elt_val<F>(&mut self, _idx: uint, f: F) -> EncodeResult where
1328 F: FnOnce(&mut Encoder<'a, W>) -> EncodeResult,
1330 try!(self.start_tag(EsMapVal as uint));
1336 impl<'a, W: Writer + Seek> serialize::Encoder for Encoder<'a, W> {
1337 type Error = io::IoError;
1339 fn emit_nil(&mut self) -> EncodeResult {
1343 fn emit_uint(&mut self, v: uint) -> EncodeResult {
1344 self.wr_tagged_u64(EsUint as uint, v as u64)
1346 fn emit_u64(&mut self, v: u64) -> EncodeResult {
1347 self.wr_tagged_u64(EsU64 as uint, v)
1349 fn emit_u32(&mut self, v: u32) -> EncodeResult {
1350 self.wr_tagged_u32(EsU32 as uint, v)
1352 fn emit_u16(&mut self, v: u16) -> EncodeResult {
1353 self.wr_tagged_u16(EsU16 as uint, v)
1355 fn emit_u8(&mut self, v: u8) -> EncodeResult {
1356 self.wr_tagged_u8(EsU8 as uint, v)
1359 fn emit_int(&mut self, v: int) -> EncodeResult {
1360 self.wr_tagged_i64(EsInt as uint, v as i64)
1362 fn emit_i64(&mut self, v: i64) -> EncodeResult {
1363 self.wr_tagged_i64(EsI64 as uint, v)
1365 fn emit_i32(&mut self, v: i32) -> EncodeResult {
1366 self.wr_tagged_i32(EsI32 as uint, v)
1368 fn emit_i16(&mut self, v: i16) -> EncodeResult {
1369 self.wr_tagged_i16(EsI16 as uint, v)
1371 fn emit_i8(&mut self, v: i8) -> EncodeResult {
1372 self.wr_tagged_i8(EsI8 as uint, v)
1375 fn emit_bool(&mut self, v: bool) -> EncodeResult {
1376 self.wr_tagged_u8(EsBool as uint, v as u8)
1379 fn emit_f64(&mut self, v: f64) -> EncodeResult {
1380 let bits = unsafe { mem::transmute(v) };
1381 self.wr_tagged_u64(EsF64 as uint, bits)
1383 fn emit_f32(&mut self, v: f32) -> EncodeResult {
1384 let bits = unsafe { mem::transmute(v) };
1385 self.wr_tagged_u32(EsF32 as uint, bits)
1387 fn emit_char(&mut self, v: char) -> EncodeResult {
1388 self.wr_tagged_u32(EsChar as uint, v as u32)
1391 fn emit_str(&mut self, v: &str) -> EncodeResult {
1392 self.wr_tagged_str(EsStr as uint, v)
1395 fn emit_enum<F>(&mut self, name: &str, f: F) -> EncodeResult where
1396 F: FnOnce(&mut Encoder<'a, W>) -> EncodeResult,
1398 try!(self._emit_label(name));
1399 try!(self.start_tag(EsEnum as uint));
1404 fn emit_enum_variant<F>(&mut self,
1408 f: F) -> EncodeResult where
1409 F: FnOnce(&mut Encoder<'a, W>) -> EncodeResult,
1411 try!(self._emit_tagged_uint(EsEnumVid, v_id));
1412 try!(self.start_tag(EsEnumBody as uint));
1417 fn emit_enum_variant_arg<F>(&mut self, _: uint, f: F) -> EncodeResult where
1418 F: FnOnce(&mut Encoder<'a, W>) -> EncodeResult,
1423 fn emit_enum_struct_variant<F>(&mut self,
1427 f: F) -> EncodeResult where
1428 F: FnOnce(&mut Encoder<'a, W>) -> EncodeResult,
1430 self.emit_enum_variant(v_name, v_id, cnt, f)
1433 fn emit_enum_struct_variant_field<F>(&mut self,
1436 f: F) -> EncodeResult where
1437 F: FnOnce(&mut Encoder<'a, W>) -> EncodeResult,
1439 self.emit_enum_variant_arg(idx, f)
1442 fn emit_struct<F>(&mut self, _: &str, _len: uint, f: F) -> EncodeResult where
1443 F: FnOnce(&mut Encoder<'a, W>) -> EncodeResult,
1448 fn emit_struct_field<F>(&mut self, name: &str, _: uint, f: F) -> EncodeResult where
1449 F: FnOnce(&mut Encoder<'a, W>) -> EncodeResult,
1451 try!(self._emit_label(name));
1455 fn emit_tuple<F>(&mut self, len: uint, f: F) -> EncodeResult where
1456 F: FnOnce(&mut Encoder<'a, W>) -> EncodeResult,
1458 self.emit_seq(len, f)
1460 fn emit_tuple_arg<F>(&mut self, idx: uint, f: F) -> EncodeResult where
1461 F: FnOnce(&mut Encoder<'a, W>) -> EncodeResult,
1463 self.emit_seq_elt(idx, f)
1466 fn emit_tuple_struct<F>(&mut self, _: &str, len: uint, f: F) -> EncodeResult where
1467 F: FnOnce(&mut Encoder<'a, W>) -> EncodeResult,
1469 self.emit_seq(len, f)
1471 fn emit_tuple_struct_arg<F>(&mut self, idx: uint, f: F) -> EncodeResult where
1472 F: FnOnce(&mut Encoder<'a, W>) -> EncodeResult,
1474 self.emit_seq_elt(idx, f)
1477 fn emit_option<F>(&mut self, f: F) -> EncodeResult where
1478 F: FnOnce(&mut Encoder<'a, W>) -> EncodeResult,
1480 self.emit_enum("Option", f)
1482 fn emit_option_none(&mut self) -> EncodeResult {
1483 self.emit_enum_variant("None", 0, 0, |_| Ok(()))
1485 fn emit_option_some<F>(&mut self, f: F) -> EncodeResult where
1486 F: FnOnce(&mut Encoder<'a, W>) -> EncodeResult,
1489 self.emit_enum_variant("Some", 1, 1, f)
1492 fn emit_seq<F>(&mut self, len: uint, f: F) -> EncodeResult where
1493 F: FnOnce(&mut Encoder<'a, W>) -> EncodeResult,
1496 try!(self.start_tag(EsVec as uint));
1497 try!(self._emit_tagged_uint(EsVecLen, len));
1502 fn emit_seq_elt<F>(&mut self, _idx: uint, f: F) -> EncodeResult where
1503 F: FnOnce(&mut Encoder<'a, W>) -> EncodeResult,
1506 try!(self.start_tag(EsVecElt as uint));
1511 fn emit_map<F>(&mut self, len: uint, f: F) -> EncodeResult where
1512 F: FnOnce(&mut Encoder<'a, W>) -> EncodeResult,
1515 try!(self.start_tag(EsMap as uint));
1516 try!(self._emit_tagged_uint(EsMapLen, len));
1521 fn emit_map_elt_key<F>(&mut self, _idx: uint, mut f: F) -> EncodeResult where
1522 F: FnMut(&mut Encoder<'a, W>) -> EncodeResult,
1525 try!(self.start_tag(EsMapKey as uint));
1530 fn emit_map_elt_val<F>(&mut self, _idx: uint, f: F) -> EncodeResult where
1531 F: FnOnce(&mut Encoder<'a, W>) -> EncodeResult,
1533 try!(self.start_tag(EsMapVal as uint));
1540 // ___________________________________________________________________________
1545 use super::{Doc, reader, writer};
1546 use super::io::SeekableMemWriter;
1548 use serialize::{Encodable, Decodable};
1550 use std::option::Option;
1551 use std::option::Option::{None, Some};
1554 fn test_vuint_at() {
1562 0x10, 0x00, 0x00, 0x00,
1563 0x1f, 0xff, 0xff, 0xff
1566 let mut res: reader::Res;
1569 res = reader::vuint_at(data, 0).unwrap();
1570 assert_eq!(res.val, 0);
1571 assert_eq!(res.next, 1);
1572 res = reader::vuint_at(data, res.next).unwrap();
1573 assert_eq!(res.val, (1 << 7) - 1);
1574 assert_eq!(res.next, 2);
1577 res = reader::vuint_at(data, res.next).unwrap();
1578 assert_eq!(res.val, 0);
1579 assert_eq!(res.next, 4);
1580 res = reader::vuint_at(data, res.next).unwrap();
1581 assert_eq!(res.val, (1 << 14) - 1);
1582 assert_eq!(res.next, 6);
1585 res = reader::vuint_at(data, res.next).unwrap();
1586 assert_eq!(res.val, 0);
1587 assert_eq!(res.next, 9);
1588 res = reader::vuint_at(data, res.next).unwrap();
1589 assert_eq!(res.val, (1 << 21) - 1);
1590 assert_eq!(res.next, 12);
1593 res = reader::vuint_at(data, res.next).unwrap();
1594 assert_eq!(res.val, 0);
1595 assert_eq!(res.next, 16);
1596 res = reader::vuint_at(data, res.next).unwrap();
1597 assert_eq!(res.val, (1 << 28) - 1);
1598 assert_eq!(res.next, 20);
1602 fn test_option_int() {
1603 fn test_v(v: Option<int>) {
1604 debug!("v == {}", v);
1605 let mut wr = SeekableMemWriter::new();
1607 let mut rbml_w = writer::Encoder::new(&mut wr);
1608 let _ = v.encode(&mut rbml_w);
1610 let rbml_doc = Doc::new(wr.get_ref());
1611 let mut deser = reader::Decoder::new(rbml_doc);
1612 let v1 = Decodable::decode(&mut deser).unwrap();
1613 debug!("v1 == {}", v1);
1625 #![allow(non_snake_case)]
1630 pub fn vuint_at_A_aligned(b: &mut Bencher) {
1631 let data = range(0, 4*100).map(|i| {
1636 }).collect::<Vec<_>>();
1640 while i < data.len() {
1641 sum += reader::vuint_at(data.as_slice(), i).unwrap().val;
1648 pub fn vuint_at_A_unaligned(b: &mut Bencher) {
1649 let data = range(0, 4*100+1).map(|i| {
1654 }).collect::<Vec<_>>();
1658 while i < data.len() {
1659 sum += reader::vuint_at(data.as_slice(), i).unwrap().val;
1666 pub fn vuint_at_D_aligned(b: &mut Bencher) {
1667 let data = range(0, 4*100).map(|i| {
1673 }).collect::<Vec<_>>();
1677 while i < data.len() {
1678 sum += reader::vuint_at(data.as_slice(), i).unwrap().val;
1685 pub fn vuint_at_D_unaligned(b: &mut Bencher) {
1686 let data = range(0, 4*100+1).map(|i| {
1692 }).collect::<Vec<_>>();
1696 while i < data.len() {
1697 sum += reader::vuint_at(data.as_slice(), i).unwrap().val;