diff --git a/src/libserialize/json.rs b/src/libserialize/json.rs index 7919ac0eff16..37bd11ba59f4 100644 --- a/src/libserialize/json.rs +++ b/src/libserialize/json.rs @@ -458,17 +458,19 @@ impl<'a> ::Encoder for Encoder<'a> { escape_str(self.writer, v) } - fn emit_enum(&mut self, - _name: &str, - f: |&mut Encoder<'a>| -> EncodeResult) -> EncodeResult { + fn emit_enum(&mut self, _name: &str, f: F) -> EncodeResult where + F: FnOnce(&mut Encoder<'a>) -> EncodeResult, + { f(self) } - fn emit_enum_variant(&mut self, - name: &str, - _id: uint, - cnt: uint, - f: |&mut Encoder<'a>| -> EncodeResult) -> EncodeResult { + fn emit_enum_variant(&mut self, + name: &str, + _id: uint, + cnt: uint, + f: F) -> EncodeResult where + F: FnOnce(&mut Encoder<'a>) -> EncodeResult, + { // enums are encoded as strings or objects // Bunny => "Bunny" // Kangaroo(34,"William") => {"variant": "Kangaroo", "fields": [34,"William"]} @@ -483,100 +485,113 @@ impl<'a> ::Encoder for Encoder<'a> { } } - fn emit_enum_variant_arg(&mut self, - idx: uint, - f: |&mut Encoder<'a>| -> EncodeResult) -> EncodeResult { + fn emit_enum_variant_arg(&mut self, idx: uint, f: F) -> EncodeResult where + F: FnOnce(&mut Encoder<'a>) -> EncodeResult, + { if idx != 0 { try!(write!(self.writer, ",")); } f(self) } - fn emit_enum_struct_variant(&mut self, - name: &str, - id: uint, - cnt: uint, - f: |&mut Encoder<'a>| -> EncodeResult) -> EncodeResult { + fn emit_enum_struct_variant(&mut self, + name: &str, + id: uint, + cnt: uint, + f: F) -> EncodeResult where + F: FnOnce(&mut Encoder<'a>) -> EncodeResult, + { self.emit_enum_variant(name, id, cnt, f) } - fn emit_enum_struct_variant_field(&mut self, - _: &str, - idx: uint, - f: |&mut Encoder<'a>| -> EncodeResult) -> EncodeResult { + fn emit_enum_struct_variant_field(&mut self, + _: &str, + idx: uint, + f: F) -> EncodeResult where + F: FnOnce(&mut Encoder<'a>) -> EncodeResult, + { self.emit_enum_variant_arg(idx, f) } - fn emit_struct(&mut self, - _: &str, - _: uint, - f: |&mut Encoder<'a>| -> EncodeResult) -> EncodeResult { + fn emit_struct(&mut self, _: &str, _: uint, f: F) -> EncodeResult where + F: FnOnce(&mut Encoder<'a>) -> EncodeResult, + { try!(write!(self.writer, "{{")); try!(f(self)); write!(self.writer, "}}") } - fn emit_struct_field(&mut self, - name: &str, - idx: uint, - f: |&mut Encoder<'a>| -> EncodeResult) -> EncodeResult { + fn emit_struct_field(&mut self, name: &str, idx: uint, f: F) -> EncodeResult where + F: FnOnce(&mut Encoder<'a>) -> EncodeResult, + { if idx != 0 { try!(write!(self.writer, ",")); } try!(escape_str(self.writer, name)); try!(write!(self.writer, ":")); f(self) } - fn emit_tuple(&mut self, len: uint, f: |&mut Encoder<'a>| -> EncodeResult) -> EncodeResult { + fn emit_tuple(&mut self, len: uint, f: F) -> EncodeResult where + F: FnOnce(&mut Encoder<'a>) -> EncodeResult, + { self.emit_seq(len, f) } - fn emit_tuple_arg(&mut self, - idx: uint, - f: |&mut Encoder<'a>| -> EncodeResult) -> EncodeResult { + fn emit_tuple_arg(&mut self, idx: uint, f: F) -> EncodeResult where + F: FnOnce(&mut Encoder<'a>) -> EncodeResult, + { self.emit_seq_elt(idx, f) } - fn emit_tuple_struct(&mut self, - _name: &str, - len: uint, - f: |&mut Encoder<'a>| -> EncodeResult) -> EncodeResult { + fn emit_tuple_struct(&mut self, _name: &str, len: uint, f: F) -> EncodeResult where + F: FnOnce(&mut Encoder<'a>) -> EncodeResult, + { self.emit_seq(len, f) } - fn emit_tuple_struct_arg(&mut self, - idx: uint, - f: |&mut Encoder<'a>| -> EncodeResult) -> EncodeResult { + fn emit_tuple_struct_arg(&mut self, idx: uint, f: F) -> EncodeResult where + F: FnOnce(&mut Encoder<'a>) -> EncodeResult, + { self.emit_seq_elt(idx, f) } - fn emit_option(&mut self, f: |&mut Encoder<'a>| -> EncodeResult) -> EncodeResult { + fn emit_option(&mut self, f: F) -> EncodeResult where + F: FnOnce(&mut Encoder<'a>) -> EncodeResult, + { f(self) } fn emit_option_none(&mut self) -> EncodeResult { self.emit_nil() } - fn emit_option_some(&mut self, f: |&mut Encoder<'a>| -> EncodeResult) -> EncodeResult { + fn emit_option_some(&mut self, f: F) -> EncodeResult where + F: FnOnce(&mut Encoder<'a>) -> EncodeResult, + { f(self) } - fn emit_seq(&mut self, _len: uint, f: |&mut Encoder<'a>| -> EncodeResult) -> EncodeResult { + fn emit_seq(&mut self, _len: uint, f: F) -> EncodeResult where + F: FnOnce(&mut Encoder<'a>) -> EncodeResult, + { try!(write!(self.writer, "[")); try!(f(self)); write!(self.writer, "]") } - fn emit_seq_elt(&mut self, idx: uint, f: |&mut Encoder<'a>| -> EncodeResult) -> EncodeResult { + fn emit_seq_elt(&mut self, idx: uint, f: F) -> EncodeResult where + F: FnOnce(&mut Encoder<'a>) -> EncodeResult, + { if idx != 0 { try!(write!(self.writer, ",")); } f(self) } - fn emit_map(&mut self, _len: uint, f: |&mut Encoder<'a>| -> EncodeResult) -> EncodeResult { + fn emit_map(&mut self, _len: uint, f: F) -> EncodeResult where + F: FnOnce(&mut Encoder<'a>) -> EncodeResult, + { try!(write!(self.writer, "{{")); try!(f(self)); write!(self.writer, "}}") } - fn emit_map_elt_key(&mut self, - idx: uint, - f: |&mut Encoder<'a>| -> EncodeResult) -> EncodeResult { + fn emit_map_elt_key(&mut self, idx: uint, mut f: F) -> EncodeResult where + F: FnMut(&mut Encoder<'a>) -> EncodeResult, + { if idx != 0 { try!(write!(self.writer, ",")) } // ref #12967, make sure to wrap a key in double quotes, // in the event that its of a type that omits them (eg numbers) @@ -594,9 +609,9 @@ impl<'a> ::Encoder for Encoder<'a> { Ok(()) } - fn emit_map_elt_val(&mut self, - _idx: uint, - f: |&mut Encoder<'a>| -> EncodeResult) -> EncodeResult { + fn emit_map_elt_val(&mut self, _idx: uint, f: F) -> EncodeResult where + F: FnOnce(&mut Encoder<'a>) -> EncodeResult, + { try!(write!(self.writer, ":")); f(self) } @@ -663,17 +678,20 @@ impl<'a> ::Encoder for PrettyEncoder<'a> { escape_str(self.writer, v) } - fn emit_enum(&mut self, - _name: &str, - f: |&mut PrettyEncoder<'a>| -> EncodeResult) -> EncodeResult { + fn emit_enum(&mut self, _name: &str, f: F) -> EncodeResult where + F: FnOnce(&mut PrettyEncoder<'a>) -> EncodeResult, + { f(self) } - fn emit_enum_variant(&mut self, - name: &str, - _id: uint, - cnt: uint, - f: |&mut PrettyEncoder<'a>| -> EncodeResult) -> EncodeResult { + fn emit_enum_variant(&mut self, + name: &str, + _id: uint, + cnt: uint, + f: F) + -> EncodeResult where + F: FnOnce(&mut PrettyEncoder<'a>) -> EncodeResult, + { if cnt == 0 { escape_str(self.writer, name) } else { @@ -697,9 +715,9 @@ impl<'a> ::Encoder for PrettyEncoder<'a> { } } - fn emit_enum_variant_arg(&mut self, - idx: uint, - f: |&mut PrettyEncoder<'a>| -> EncodeResult) -> EncodeResult { + fn emit_enum_variant_arg(&mut self, idx: uint, f: F) -> EncodeResult where + F: FnOnce(&mut PrettyEncoder<'a>) -> EncodeResult, + { if idx != 0 { try!(write!(self.writer, ",\n")); } @@ -707,26 +725,29 @@ impl<'a> ::Encoder for PrettyEncoder<'a> { f(self) } - fn emit_enum_struct_variant(&mut self, - name: &str, - id: uint, - cnt: uint, - f: |&mut PrettyEncoder<'a>| -> EncodeResult) -> EncodeResult { + fn emit_enum_struct_variant(&mut self, + name: &str, + id: uint, + cnt: uint, + f: F) -> EncodeResult where + F: FnOnce(&mut PrettyEncoder<'a>) -> EncodeResult, + { self.emit_enum_variant(name, id, cnt, f) } - fn emit_enum_struct_variant_field(&mut self, - _: &str, - idx: uint, - f: |&mut PrettyEncoder<'a>| -> EncodeResult) -> EncodeResult { + fn emit_enum_struct_variant_field(&mut self, + _: &str, + idx: uint, + f: F) -> EncodeResult where + F: FnOnce(&mut PrettyEncoder<'a>) -> EncodeResult, + { self.emit_enum_variant_arg(idx, f) } - fn emit_struct(&mut self, - _: &str, - len: uint, - f: |&mut PrettyEncoder<'a>| -> EncodeResult) -> EncodeResult { + fn emit_struct(&mut self, _: &str, len: uint, f: F) -> EncodeResult where + F: FnOnce(&mut PrettyEncoder<'a>) -> EncodeResult, + { if len == 0 { write!(self.writer, "{{}}") } else { @@ -740,10 +761,9 @@ impl<'a> ::Encoder for PrettyEncoder<'a> { } } - fn emit_struct_field(&mut self, - name: &str, - idx: uint, - f: |&mut PrettyEncoder<'a>| -> EncodeResult) -> EncodeResult { + fn emit_struct_field(&mut self, name: &str, idx: uint, f: F) -> EncodeResult where + F: FnOnce(&mut PrettyEncoder<'a>) -> EncodeResult, + { if idx == 0 { try!(write!(self.writer, "\n")); } else { @@ -755,40 +775,43 @@ impl<'a> ::Encoder for PrettyEncoder<'a> { f(self) } - fn emit_tuple(&mut self, - len: uint, - f: |&mut PrettyEncoder<'a>| -> EncodeResult) -> EncodeResult { + fn emit_tuple(&mut self, len: uint, f: F) -> EncodeResult where + F: FnOnce(&mut PrettyEncoder<'a>) -> EncodeResult, + { self.emit_seq(len, f) } - fn emit_tuple_arg(&mut self, - idx: uint, - f: |&mut PrettyEncoder<'a>| -> EncodeResult) -> EncodeResult { + fn emit_tuple_arg(&mut self, idx: uint, f: F) -> EncodeResult where + F: FnOnce(&mut PrettyEncoder<'a>) -> EncodeResult, + { self.emit_seq_elt(idx, f) } - fn emit_tuple_struct(&mut self, - _: &str, - len: uint, - f: |&mut PrettyEncoder<'a>| -> EncodeResult) -> EncodeResult { + fn emit_tuple_struct(&mut self, _: &str, len: uint, f: F) -> EncodeResult where + F: FnOnce(&mut PrettyEncoder<'a>) -> EncodeResult, + { self.emit_seq(len, f) } - fn emit_tuple_struct_arg(&mut self, - idx: uint, - f: |&mut PrettyEncoder<'a>| -> EncodeResult) -> EncodeResult { + fn emit_tuple_struct_arg(&mut self, idx: uint, f: F) -> EncodeResult where + F: FnOnce(&mut PrettyEncoder<'a>) -> EncodeResult, + { self.emit_seq_elt(idx, f) } - fn emit_option(&mut self, f: |&mut PrettyEncoder<'a>| -> EncodeResult) -> EncodeResult { + fn emit_option(&mut self, f: F) -> EncodeResult where + F: FnOnce(&mut PrettyEncoder<'a>) -> EncodeResult, + { f(self) } fn emit_option_none(&mut self) -> EncodeResult { self.emit_nil() } - fn emit_option_some(&mut self, f: |&mut PrettyEncoder<'a>| -> EncodeResult) -> EncodeResult { + fn emit_option_some(&mut self, f: F) -> EncodeResult where + F: FnOnce(&mut PrettyEncoder<'a>) -> EncodeResult, + { f(self) } - fn emit_seq(&mut self, - len: uint, - f: |&mut PrettyEncoder<'a>| -> EncodeResult) -> EncodeResult { + fn emit_seq(&mut self, len: uint, f: F) -> EncodeResult where + F: FnOnce(&mut PrettyEncoder<'a>) -> EncodeResult, + { if len == 0 { write!(self.writer, "[]") } else { @@ -802,9 +825,9 @@ impl<'a> ::Encoder for PrettyEncoder<'a> { } } - fn emit_seq_elt(&mut self, - idx: uint, - f: |&mut PrettyEncoder<'a>| -> EncodeResult) -> EncodeResult { + fn emit_seq_elt(&mut self, idx: uint, f: F) -> EncodeResult where + F: FnOnce(&mut PrettyEncoder<'a>) -> EncodeResult, + { if idx == 0 { try!(write!(self.writer, "\n")); } else { @@ -814,9 +837,9 @@ impl<'a> ::Encoder for PrettyEncoder<'a> { f(self) } - fn emit_map(&mut self, - len: uint, - f: |&mut PrettyEncoder<'a>| -> EncodeResult) -> EncodeResult { + fn emit_map(&mut self, len: uint, f: F) -> EncodeResult where + F: FnOnce(&mut PrettyEncoder<'a>) -> EncodeResult, + { if len == 0 { write!(self.writer, "{{}}") } else { @@ -830,9 +853,9 @@ impl<'a> ::Encoder for PrettyEncoder<'a> { } } - fn emit_map_elt_key(&mut self, - idx: uint, - f: |&mut PrettyEncoder<'a>| -> EncodeResult) -> EncodeResult { + fn emit_map_elt_key(&mut self, idx: uint, mut f: F) -> EncodeResult where + F: FnMut(&mut PrettyEncoder<'a>) -> EncodeResult, + { if idx == 0 { try!(write!(self.writer, "\n")); } else { @@ -855,9 +878,9 @@ impl<'a> ::Encoder for PrettyEncoder<'a> { Ok(()) } - fn emit_map_elt_val(&mut self, - _idx: uint, - f: |&mut PrettyEncoder<'a>| -> EncodeResult) -> EncodeResult { + fn emit_map_elt_val(&mut self, _idx: uint, f: F) -> EncodeResult where + F: FnOnce(&mut PrettyEncoder<'a>) -> EncodeResult, + { try!(write!(self.writer, ": ")); f(self) } @@ -2052,17 +2075,16 @@ impl ::Decoder for Decoder { expect!(self.pop(), String) } - fn read_enum(&mut self, - name: &str, - f: |&mut Decoder| -> DecodeResult) -> DecodeResult { + fn read_enum(&mut self, name: &str, f: F) -> DecodeResult where + F: FnOnce(&mut Decoder) -> DecodeResult, + { debug!("read_enum({})", name); f(self) } - fn read_enum_variant(&mut self, - names: &[&str], - f: |&mut Decoder, uint| -> DecodeResult) - -> DecodeResult { + fn read_enum_variant(&mut self, names: &[&str], f: F) -> DecodeResult where + F: FnOnce(&mut Decoder, uint) -> DecodeResult, + { debug!("read_enum_variant(names={})", names); let name = match self.pop() { Json::String(s) => s, @@ -2103,46 +2125,48 @@ impl ::Decoder for Decoder { f(self, idx) } - fn read_enum_variant_arg(&mut self, idx: uint, f: |&mut Decoder| -> DecodeResult) - -> DecodeResult { + fn read_enum_variant_arg(&mut self, idx: uint, f: F) -> DecodeResult where + F: FnOnce(&mut Decoder) -> DecodeResult, + { debug!("read_enum_variant_arg(idx={})", idx); f(self) } - fn read_enum_struct_variant(&mut self, - names: &[&str], - f: |&mut Decoder, uint| -> DecodeResult) - -> DecodeResult { + fn read_enum_struct_variant(&mut self, names: &[&str], f: F) -> DecodeResult where + F: FnOnce(&mut Decoder, uint) -> DecodeResult, + { debug!("read_enum_struct_variant(names={})", names); self.read_enum_variant(names, f) } - fn read_enum_struct_variant_field(&mut self, + fn read_enum_struct_variant_field(&mut self, name: &str, idx: uint, - f: |&mut Decoder| -> DecodeResult) - -> DecodeResult { + f: F) + -> DecodeResult where + F: FnOnce(&mut Decoder) -> DecodeResult, + { debug!("read_enum_struct_variant_field(name={}, idx={})", name, idx); self.read_enum_variant_arg(idx, f) } - fn read_struct(&mut self, - name: &str, - len: uint, - f: |&mut Decoder| -> DecodeResult) - -> DecodeResult { + fn read_struct(&mut self, name: &str, len: uint, f: F) -> DecodeResult where + F: FnOnce(&mut Decoder) -> DecodeResult, + { debug!("read_struct(name={}, len={})", name, len); let value = try!(f(self)); self.pop(); Ok(value) } - fn read_struct_field(&mut self, - name: &str, - idx: uint, - f: |&mut Decoder| -> DecodeResult) - -> DecodeResult { + fn read_struct_field(&mut self, + name: &str, + idx: uint, + f: F) + -> DecodeResult where + F: FnOnce(&mut Decoder) -> DecodeResult, + { debug!("read_struct_field(name={}, idx={})", name, idx); let mut obj = try!(expect!(self.pop(), Object)); @@ -2165,12 +2189,11 @@ impl ::Decoder for Decoder { Ok(value) } - fn read_tuple(&mut self, - tuple_len: uint, - f: |&mut Decoder| -> DecodeResult) - -> DecodeResult { + fn read_tuple(&mut self, tuple_len: uint, f: F) -> DecodeResult where + F: FnOnce(&mut Decoder) -> DecodeResult, + { debug!("read_tuple()"); - self.read_seq(|d, len| { + self.read_seq(move |d, len| { if len == tuple_len { f(d) } else { @@ -2179,31 +2202,37 @@ impl ::Decoder for Decoder { }) } - fn read_tuple_arg(&mut self, - idx: uint, - f: |&mut Decoder| -> DecodeResult) -> DecodeResult { + fn read_tuple_arg(&mut self, idx: uint, f: F) -> DecodeResult where + F: FnOnce(&mut Decoder) -> DecodeResult, + { debug!("read_tuple_arg(idx={})", idx); self.read_seq_elt(idx, f) } - fn read_tuple_struct(&mut self, - name: &str, - len: uint, - f: |&mut Decoder| -> DecodeResult) - -> DecodeResult { + fn read_tuple_struct(&mut self, + name: &str, + len: uint, + f: F) + -> DecodeResult where + F: FnOnce(&mut Decoder) -> DecodeResult, + { debug!("read_tuple_struct(name={})", name); self.read_tuple(len, f) } - fn read_tuple_struct_arg(&mut self, - idx: uint, - f: |&mut Decoder| -> DecodeResult) - -> DecodeResult { + fn read_tuple_struct_arg(&mut self, + idx: uint, + f: F) + -> DecodeResult where + F: FnOnce(&mut Decoder) -> DecodeResult, + { debug!("read_tuple_struct_arg(idx={})", idx); self.read_tuple_arg(idx, f) } - fn read_option(&mut self, f: |&mut Decoder, bool| -> DecodeResult) -> DecodeResult { + fn read_option(&mut self, f: F) -> DecodeResult where + F: FnOnce(&mut Decoder, bool) -> DecodeResult, + { debug!("read_option()"); match self.pop() { Json::Null => f(self, false), @@ -2211,7 +2240,9 @@ impl ::Decoder for Decoder { } } - fn read_seq(&mut self, f: |&mut Decoder, uint| -> DecodeResult) -> DecodeResult { + fn read_seq(&mut self, f: F) -> DecodeResult where + F: FnOnce(&mut Decoder, uint) -> DecodeResult, + { debug!("read_seq()"); let array = try!(expect!(self.pop(), Array)); let len = array.len(); @@ -2221,14 +2252,16 @@ impl ::Decoder for Decoder { f(self, len) } - fn read_seq_elt(&mut self, - idx: uint, - f: |&mut Decoder| -> DecodeResult) -> DecodeResult { + fn read_seq_elt(&mut self, idx: uint, f: F) -> DecodeResult where + F: FnOnce(&mut Decoder) -> DecodeResult, + { debug!("read_seq_elt(idx={})", idx); f(self) } - fn read_map(&mut self, f: |&mut Decoder, uint| -> DecodeResult) -> DecodeResult { + fn read_map(&mut self, f: F) -> DecodeResult where + F: FnOnce(&mut Decoder, uint) -> DecodeResult, + { debug!("read_map()"); let obj = try!(expect!(self.pop(), Object)); let len = obj.len(); @@ -2239,14 +2272,16 @@ impl ::Decoder for Decoder { f(self, len) } - fn read_map_elt_key(&mut self, idx: uint, f: |&mut Decoder| -> DecodeResult) - -> DecodeResult { + fn read_map_elt_key(&mut self, idx: uint, f: F) -> DecodeResult where + F: FnOnce(&mut Decoder) -> DecodeResult, + { debug!("read_map_elt_key(idx={})", idx); f(self) } - fn read_map_elt_val(&mut self, idx: uint, f: |&mut Decoder| -> DecodeResult) - -> DecodeResult { + fn read_map_elt_val(&mut self, idx: uint, f: F) -> DecodeResult where + F: FnOnce(&mut Decoder) -> DecodeResult, + { debug!("read_map_elt_val(idx={})", idx); f(self) } diff --git a/src/libserialize/lib.rs b/src/libserialize/lib.rs index 9711d5c7209b..390b3976562f 100644 --- a/src/libserialize/lib.rs +++ b/src/libserialize/lib.rs @@ -24,6 +24,7 @@ Core encoding and decoding interfaces. html_playground_url = "http://play.rust-lang.org/")] #![allow(unknown_features)] #![feature(macro_rules, default_type_params, phase, slicing_syntax, globs)] +#![feature(unboxed_closures)] // test harness access #[cfg(test)] diff --git a/src/libserialize/serialize.rs b/src/libserialize/serialize.rs index 7539a6dc3486..98bd2f6bc930 100644 --- a/src/libserialize/serialize.rs +++ b/src/libserialize/serialize.rs @@ -39,58 +39,61 @@ pub trait Encoder { fn emit_str(&mut self, v: &str) -> Result<(), E>; // Compound types: - fn emit_enum(&mut self, name: &str, f: |&mut Self| -> Result<(), E>) -> Result<(), E>; + fn emit_enum(&mut self, name: &str, f: F) -> Result<(), E> where + F: FnOnce(&mut Self) -> Result<(), E>; - fn emit_enum_variant(&mut self, - v_name: &str, - v_id: uint, - len: uint, - f: |&mut Self| -> Result<(), E>) -> Result<(), E>; - fn emit_enum_variant_arg(&mut self, - a_idx: uint, - f: |&mut Self| -> Result<(), E>) -> Result<(), E>; + fn emit_enum_variant(&mut self, v_name: &str, + v_id: uint, + len: uint, + f: F) -> Result<(), E> where + F: FnOnce(&mut Self) -> Result<(), E>; + fn emit_enum_variant_arg(&mut self, a_idx: uint, f: F) -> Result<(), E> where + F: FnOnce(&mut Self) -> Result<(), E>; - fn emit_enum_struct_variant(&mut self, - v_name: &str, - v_id: uint, - len: uint, - f: |&mut Self| -> Result<(), E>) -> Result<(), E>; - fn emit_enum_struct_variant_field(&mut self, - f_name: &str, - f_idx: uint, - f: |&mut Self| -> Result<(), E>) -> Result<(), E>; + fn emit_enum_struct_variant(&mut self, v_name: &str, + v_id: uint, + len: uint, + f: F) -> Result<(), E> where + F: FnOnce(&mut Self) -> Result<(), E>; + fn emit_enum_struct_variant_field(&mut self, + f_name: &str, + f_idx: uint, + f: F) -> Result<(), E> where + F: FnOnce(&mut Self) -> Result<(), E>; - fn emit_struct(&mut self, - name: &str, - len: uint, - f: |&mut Self| -> Result<(), E>) -> Result<(), E>; - fn emit_struct_field(&mut self, - f_name: &str, - f_idx: uint, - f: |&mut Self| -> Result<(), E>) -> Result<(), E>; + fn emit_struct(&mut self, name: &str, len: uint, f: F) -> Result<(), E> where + F: FnOnce(&mut Self) -> Result<(), E>; + fn emit_struct_field(&mut self, f_name: &str, f_idx: uint, f: F) -> Result<(), E> where + F: FnOnce(&mut Self) -> Result<(), E>; - fn emit_tuple(&mut self, len: uint, f: |&mut Self| -> Result<(), E>) -> Result<(), E>; - fn emit_tuple_arg(&mut self, idx: uint, f: |&mut Self| -> Result<(), E>) -> Result<(), E>; + fn emit_tuple(&mut self, len: uint, f: F) -> Result<(), E> where + F: FnOnce(&mut Self) -> Result<(), E>; + fn emit_tuple_arg(&mut self, idx: uint, f: F) -> Result<(), E> where + F: FnOnce(&mut Self) -> Result<(), E>; - fn emit_tuple_struct(&mut self, - name: &str, - len: uint, - f: |&mut Self| -> Result<(), E>) -> Result<(), E>; - fn emit_tuple_struct_arg(&mut self, - f_idx: uint, - f: |&mut Self| -> Result<(), E>) -> Result<(), E>; + fn emit_tuple_struct(&mut self, name: &str, len: uint, f: F) -> Result<(), E> where + F: FnOnce(&mut Self) -> Result<(), E>; + fn emit_tuple_struct_arg(&mut self, f_idx: uint, f: F) -> Result<(), E> where + F: FnOnce(&mut Self) -> Result<(), E>; // Specialized types: - fn emit_option(&mut self, f: |&mut Self| -> Result<(), E>) -> Result<(), E>; + fn emit_option(&mut self, f: F) -> Result<(), E> where + F: FnOnce(&mut Self) -> Result<(), E>; fn emit_option_none(&mut self) -> Result<(), E>; - fn emit_option_some(&mut self, f: |&mut Self| -> Result<(), E>) -> Result<(), E>; + fn emit_option_some(&mut self, f: F) -> Result<(), E> where + F: FnOnce(&mut Self) -> Result<(), E>; - fn emit_seq(&mut self, len: uint, f: |this: &mut Self| -> Result<(), E>) -> Result<(), E>; - fn emit_seq_elt(&mut self, idx: uint, f: |this: &mut Self| -> Result<(), E>) -> Result<(), E>; + fn emit_seq(&mut self, len: uint, f: F) -> Result<(), E> where + F: FnOnce(&mut Self) -> Result<(), E>; + fn emit_seq_elt(&mut self, idx: uint, f: F) -> Result<(), E> where + F: FnOnce(&mut Self) -> Result<(), E>; - fn emit_map(&mut self, len: uint, f: |&mut Self| -> Result<(), E>) -> Result<(), E>; - fn emit_map_elt_key(&mut self, idx: uint, f: |&mut Self| -> Result<(), E>) -> Result<(), E>; - fn emit_map_elt_val(&mut self, idx: uint, f: |&mut Self| -> Result<(), E>) -> Result<(), E>; + fn emit_map(&mut self, len: uint, f: F) -> Result<(), E> where + F: FnOnce(&mut Self) -> Result<(), E>; + fn emit_map_elt_key(&mut self, idx: uint, f: F) -> Result<(), E> where + F: FnMut(&mut Self) -> Result<(), E>; + fn emit_map_elt_val(&mut self, idx: uint, f: F) -> Result<(), E> where + F: FnOnce(&mut Self) -> Result<(), E>; } pub trait Decoder { @@ -113,57 +116,57 @@ pub trait Decoder { fn read_str(&mut self) -> Result; // Compound types: - fn read_enum(&mut self, name: &str, f: |&mut Self| -> Result) -> Result; + fn read_enum(&mut self, name: &str, f: F) -> Result where + F: FnOnce(&mut Self) -> Result; - fn read_enum_variant(&mut self, - names: &[&str], - f: |&mut Self, uint| -> Result) - -> Result; - fn read_enum_variant_arg(&mut self, - a_idx: uint, - f: |&mut Self| -> Result) - -> Result; + fn read_enum_variant(&mut self, names: &[&str], f: F) -> Result where + F: FnOnce(&mut Self, uint) -> Result; + fn read_enum_variant_arg(&mut self, a_idx: uint, f: F) -> Result where + F: FnOnce(&mut Self) -> Result; - fn read_enum_struct_variant(&mut self, - names: &[&str], - f: |&mut Self, uint| -> Result) - -> Result; - fn read_enum_struct_variant_field(&mut self, - &f_name: &str, - f_idx: uint, - f: |&mut Self| -> Result) - -> Result; + fn read_enum_struct_variant(&mut self, names: &[&str], f: F) -> Result where + F: FnOnce(&mut Self, uint) -> Result; + fn read_enum_struct_variant_field(&mut self, + &f_name: &str, + f_idx: uint, + f: F) + -> Result where + F: FnOnce(&mut Self) -> Result; - fn read_struct(&mut self, s_name: &str, len: uint, f: |&mut Self| -> Result) - -> Result; - fn read_struct_field(&mut self, - f_name: &str, - f_idx: uint, - f: |&mut Self| -> Result) - -> Result; + fn read_struct(&mut self, s_name: &str, len: uint, f: F) -> Result where + F: FnOnce(&mut Self) -> Result; + fn read_struct_field(&mut self, + f_name: &str, + f_idx: uint, + f: F) + -> Result where + F: FnOnce(&mut Self) -> Result; - fn read_tuple(&mut self, len: uint, f: |&mut Self| -> Result) -> Result; - fn read_tuple_arg(&mut self, a_idx: uint, f: |&mut Self| -> Result) -> Result; + fn read_tuple(&mut self, len: uint, f: F) -> Result where + F: FnOnce(&mut Self) -> Result; + fn read_tuple_arg(&mut self, a_idx: uint, f: F) -> Result where + F: FnOnce(&mut Self) -> Result; - fn read_tuple_struct(&mut self, - s_name: &str, - len: uint, - f: |&mut Self| -> Result) - -> Result; - fn read_tuple_struct_arg(&mut self, - a_idx: uint, - f: |&mut Self| -> Result) - -> Result; + fn read_tuple_struct(&mut self, s_name: &str, len: uint, f: F) -> Result where + F: FnOnce(&mut Self) -> Result; + fn read_tuple_struct_arg(&mut self, a_idx: uint, f: F) -> Result where + F: FnOnce(&mut Self) -> Result; // Specialized types: - fn read_option(&mut self, f: |&mut Self, bool| -> Result) -> Result; + fn read_option(&mut self, f: F) -> Result where + F: FnOnce(&mut Self, bool) -> Result; - fn read_seq(&mut self, f: |&mut Self, uint| -> Result) -> Result; - fn read_seq_elt(&mut self, idx: uint, f: |&mut Self| -> Result) -> Result; + fn read_seq(&mut self, f: F) -> Result where + F: FnOnce(&mut Self, uint) -> Result; + fn read_seq_elt(&mut self, idx: uint, f: F) -> Result where + F: FnOnce(&mut Self) -> Result; - fn read_map(&mut self, f: |&mut Self, uint| -> Result) -> Result; - fn read_map_elt_key(&mut self, idx: uint, f: |&mut Self| -> Result) -> Result; - fn read_map_elt_val(&mut self, idx: uint, f: |&mut Self| -> Result) -> Result; + fn read_map(&mut self, f: F) -> Result where + F: FnOnce(&mut Self, uint) -> Result; + fn read_map_elt_key(&mut self, idx: uint, f: F) -> Result where + F: FnOnce(&mut Self) -> Result; + fn read_map_elt_val(&mut self, idx: uint, f: F) -> Result where + F: FnOnce(&mut Self) -> Result; // Failure fn error(&mut self, err: &str) -> E; @@ -585,13 +588,14 @@ impl,T:Decodable+Send+Sync> Decodable for Arc { // Helper routines pub trait EncoderHelpers { - fn emit_from_vec(&mut self, - v: &[T], - f: |&mut Self, v: &T| -> Result<(), E>) -> Result<(), E>; + fn emit_from_vec(&mut self, v: &[T], f: F) -> Result<(), E> where + F: FnMut(&mut Self, &T) -> Result<(), E>; } impl> EncoderHelpers for S { - fn emit_from_vec(&mut self, v: &[T], f: |&mut S, &T| -> Result<(), E>) -> Result<(), E> { + fn emit_from_vec(&mut self, v: &[T], mut f: F) -> Result<(), E> where + F: FnMut(&mut S, &T) -> Result<(), E>, + { self.emit_seq(v.len(), |this| { for (i, e) in v.iter().enumerate() { try!(this.emit_seq_elt(i, |this| { @@ -604,11 +608,14 @@ impl> EncoderHelpers for S { } pub trait DecoderHelpers { - fn read_to_vec(&mut self, f: |&mut Self| -> Result) -> Result, E>; + fn read_to_vec(&mut self, f: F) -> Result, E> where + F: FnMut(&mut Self) -> Result; } impl> DecoderHelpers for D { - fn read_to_vec(&mut self, f: |&mut D| -> Result) -> Result, E> { + fn read_to_vec(&mut self, mut f: F) -> Result, E> where F: + FnMut(&mut D) -> Result, + { self.read_seq(|this, len| { let mut v = Vec::with_capacity(len); for i in range(0, len) {