diff options
| author | bors <bors@rust-lang.org> | 2015-01-05 14:51:03 +0000 |
|---|---|---|
| committer | bors <bors@rust-lang.org> | 2015-01-05 14:51:03 +0000 |
| commit | 03268bbf35d3ff2350d987fe7b60375839abdf2e (patch) | |
| tree | 86ecae7591630a6ccf7a69a47570577a0caea8c6 /src/libserialize/serialize.rs | |
| parent | 8e83af6e879535c33fd83d247d16619e39e0b951 (diff) | |
| parent | 0cb7a4062a3c69bb0c54f0c9136889a1006e4f62 (diff) | |
| download | rust-03268bbf35d3ff2350d987fe7b60375839abdf2e.tar.gz rust-03268bbf35d3ff2350d987fe7b60375839abdf2e.zip | |
auto merge of #20514 : alexcrichton/rust/serialize-associated-type, r=aturon
This commit moves the libserialize crate (and will force the hand of the rustc-serialize crate) to not require the `old_orphan_check` feature gate as well as using associated types wherever possible. Concretely, the following changes were made: * The error type of `Encoder` and `Decoder` is now an associated type, meaning that these traits have no type parameters. * The `Encoder` and `Decoder` type parameters on the `Encodable` and `Decodable` traits have moved to the corresponding method of the trait. This movement alleviates the dependency on `old_orphan_check` but implies that implementations can no longer be specialized for the type of encoder/decoder being implemented. Due to the trait definitions changing, this is a: [breaking-change]
Diffstat (limited to 'src/libserialize/serialize.rs')
| -rw-r--r-- | src/libserialize/serialize.rs | 513 |
1 files changed, 267 insertions, 246 deletions
diff --git a/src/libserialize/serialize.rs b/src/libserialize/serialize.rs index 558f9e603e1..0646ee1758f 100644 --- a/src/libserialize/serialize.rs +++ b/src/libserialize/serialize.rs @@ -19,406 +19,424 @@ use std::rc::Rc; use std::cell::{Cell, RefCell}; use std::sync::Arc; -pub trait Encoder<E> { +pub trait Encoder { + type Error; + // Primitive types: - fn emit_nil(&mut self) -> Result<(), E>; - fn emit_uint(&mut self, v: uint) -> Result<(), E>; - fn emit_u64(&mut self, v: u64) -> Result<(), E>; - fn emit_u32(&mut self, v: u32) -> Result<(), E>; - fn emit_u16(&mut self, v: u16) -> Result<(), E>; - fn emit_u8(&mut self, v: u8) -> Result<(), E>; - fn emit_int(&mut self, v: int) -> Result<(), E>; - fn emit_i64(&mut self, v: i64) -> Result<(), E>; - fn emit_i32(&mut self, v: i32) -> Result<(), E>; - fn emit_i16(&mut self, v: i16) -> Result<(), E>; - fn emit_i8(&mut self, v: i8) -> Result<(), E>; - fn emit_bool(&mut self, v: bool) -> Result<(), E>; - fn emit_f64(&mut self, v: f64) -> Result<(), E>; - fn emit_f32(&mut self, v: f32) -> Result<(), E>; - fn emit_char(&mut self, v: char) -> Result<(), E>; - fn emit_str(&mut self, v: &str) -> Result<(), E>; + fn emit_nil(&mut self) -> Result<(), Self::Error>; + fn emit_uint(&mut self, v: uint) -> Result<(), Self::Error>; + fn emit_u64(&mut self, v: u64) -> Result<(), Self::Error>; + fn emit_u32(&mut self, v: u32) -> Result<(), Self::Error>; + fn emit_u16(&mut self, v: u16) -> Result<(), Self::Error>; + fn emit_u8(&mut self, v: u8) -> Result<(), Self::Error>; + fn emit_int(&mut self, v: int) -> Result<(), Self::Error>; + fn emit_i64(&mut self, v: i64) -> Result<(), Self::Error>; + fn emit_i32(&mut self, v: i32) -> Result<(), Self::Error>; + fn emit_i16(&mut self, v: i16) -> Result<(), Self::Error>; + fn emit_i8(&mut self, v: i8) -> Result<(), Self::Error>; + fn emit_bool(&mut self, v: bool) -> Result<(), Self::Error>; + fn emit_f64(&mut self, v: f64) -> Result<(), Self::Error>; + fn emit_f32(&mut self, v: f32) -> Result<(), Self::Error>; + fn emit_char(&mut self, v: char) -> Result<(), Self::Error>; + fn emit_str(&mut self, v: &str) -> Result<(), Self::Error>; // Compound types: - fn emit_enum<F>(&mut self, name: &str, f: F) -> Result<(), E> where - F: FnOnce(&mut Self) -> Result<(), E>; + fn emit_enum<F>(&mut self, name: &str, f: F) -> Result<(), Self::Error> + where F: FnOnce(&mut Self) -> Result<(), Self::Error>; fn emit_enum_variant<F>(&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<F>(&mut self, a_idx: uint, f: F) -> Result<(), E> where - F: FnOnce(&mut Self) -> Result<(), E>; + f: F) -> Result<(), Self::Error> + where F: FnOnce(&mut Self) -> Result<(), Self::Error>; + fn emit_enum_variant_arg<F>(&mut self, a_idx: uint, f: F) + -> Result<(), Self::Error> + where F: FnOnce(&mut Self) -> Result<(), Self::Error>; fn emit_enum_struct_variant<F>(&mut self, v_name: &str, v_id: uint, len: uint, - f: F) -> Result<(), E> where - F: FnOnce(&mut Self) -> Result<(), E>; + f: F) -> Result<(), Self::Error> + where F: FnOnce(&mut Self) -> Result<(), Self::Error>; fn emit_enum_struct_variant_field<F>(&mut self, f_name: &str, f_idx: uint, - f: F) -> Result<(), E> where - F: FnOnce(&mut Self) -> Result<(), E>; + f: F) -> Result<(), Self::Error> + where F: FnOnce(&mut Self) -> Result<(), Self::Error>; + + fn emit_struct<F>(&mut self, name: &str, len: uint, f: F) + -> Result<(), Self::Error> + where F: FnOnce(&mut Self) -> Result<(), Self::Error>; + fn emit_struct_field<F>(&mut self, f_name: &str, f_idx: uint, f: F) + -> Result<(), Self::Error> + where F: FnOnce(&mut Self) -> Result<(), Self::Error>; + + fn emit_tuple<F>(&mut self, len: uint, f: F) -> Result<(), Self::Error> + where F: FnOnce(&mut Self) -> Result<(), Self::Error>; + fn emit_tuple_arg<F>(&mut self, idx: uint, f: F) -> Result<(), Self::Error> + where F: FnOnce(&mut Self) -> Result<(), Self::Error>; + + fn emit_tuple_struct<F>(&mut self, name: &str, len: uint, f: F) + -> Result<(), Self::Error> + where F: FnOnce(&mut Self) -> Result<(), Self::Error>; + fn emit_tuple_struct_arg<F>(&mut self, f_idx: uint, f: F) + -> Result<(), Self::Error> + where F: FnOnce(&mut Self) -> Result<(), Self::Error>; + + // Specialized types: + fn emit_option<F>(&mut self, f: F) -> Result<(), Self::Error> + where F: FnOnce(&mut Self) -> Result<(), Self::Error>; + fn emit_option_none(&mut self) -> Result<(), Self::Error>; + fn emit_option_some<F>(&mut self, f: F) -> Result<(), Self::Error> + where F: FnOnce(&mut Self) -> Result<(), Self::Error>; - fn emit_struct<F>(&mut self, name: &str, len: uint, f: F) -> Result<(), E> where - F: FnOnce(&mut Self) -> Result<(), E>; - fn emit_struct_field<F>(&mut self, f_name: &str, f_idx: uint, f: F) -> Result<(), E> where - F: FnOnce(&mut Self) -> Result<(), E>; + fn emit_seq<F>(&mut self, len: uint, f: F) -> Result<(), Self::Error> + where F: FnOnce(&mut Self) -> Result<(), Self::Error>; + fn emit_seq_elt<F>(&mut self, idx: uint, f: F) -> Result<(), Self::Error> + where F: FnOnce(&mut Self) -> Result<(), Self::Error>; - fn emit_tuple<F>(&mut self, len: uint, f: F) -> Result<(), E> where - F: FnOnce(&mut Self) -> Result<(), E>; - fn emit_tuple_arg<F>(&mut self, idx: uint, f: F) -> Result<(), E> where - F: FnOnce(&mut Self) -> Result<(), E>; + fn emit_map<F>(&mut self, len: uint, f: F) -> Result<(), Self::Error> + where F: FnOnce(&mut Self) -> Result<(), Self::Error>; + fn emit_map_elt_key<F>(&mut self, idx: uint, f: F) -> Result<(), Self::Error> + where F: FnMut(&mut Self) -> Result<(), Self::Error>; + fn emit_map_elt_val<F>(&mut self, idx: uint, f: F) -> Result<(), Self::Error> + where F: FnOnce(&mut Self) -> Result<(), Self::Error>; +} - fn emit_tuple_struct<F>(&mut self, name: &str, len: uint, f: F) -> Result<(), E> where - F: FnOnce(&mut Self) -> Result<(), E>; - fn emit_tuple_struct_arg<F>(&mut self, f_idx: uint, f: F) -> Result<(), E> where - F: FnOnce(&mut Self) -> Result<(), E>; +pub trait Decoder { + type Error; - // Specialized types: - fn emit_option<F>(&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<F>(&mut self, f: F) -> Result<(), E> where - F: FnOnce(&mut Self) -> Result<(), E>; - - fn emit_seq<F>(&mut self, len: uint, f: F) -> Result<(), E> where - F: FnOnce(&mut Self) -> Result<(), E>; - fn emit_seq_elt<F>(&mut self, idx: uint, f: F) -> Result<(), E> where - F: FnOnce(&mut Self) -> Result<(), E>; - - fn emit_map<F>(&mut self, len: uint, f: F) -> Result<(), E> where - F: FnOnce(&mut Self) -> Result<(), E>; - fn emit_map_elt_key<F>(&mut self, idx: uint, f: F) -> Result<(), E> where - F: FnMut(&mut Self) -> Result<(), E>; - fn emit_map_elt_val<F>(&mut self, idx: uint, f: F) -> Result<(), E> where - F: FnOnce(&mut Self) -> Result<(), E>; -} - -pub trait Decoder<E> { // Primitive types: - fn read_nil(&mut self) -> Result<(), E>; - fn read_uint(&mut self) -> Result<uint, E>; - fn read_u64(&mut self) -> Result<u64, E>; - fn read_u32(&mut self) -> Result<u32, E>; - fn read_u16(&mut self) -> Result<u16, E>; - fn read_u8(&mut self) -> Result<u8, E>; - fn read_int(&mut self) -> Result<int, E>; - fn read_i64(&mut self) -> Result<i64, E>; - fn read_i32(&mut self) -> Result<i32, E>; - fn read_i16(&mut self) -> Result<i16, E>; - fn read_i8(&mut self) -> Result<i8, E>; - fn read_bool(&mut self) -> Result<bool, E>; - fn read_f64(&mut self) -> Result<f64, E>; - fn read_f32(&mut self) -> Result<f32, E>; - fn read_char(&mut self) -> Result<char, E>; - fn read_str(&mut self) -> Result<String, E>; + fn read_nil(&mut self) -> Result<(), Self::Error>; + fn read_uint(&mut self) -> Result<uint, Self::Error>; + fn read_u64(&mut self) -> Result<u64, Self::Error>; + fn read_u32(&mut self) -> Result<u32, Self::Error>; + fn read_u16(&mut self) -> Result<u16, Self::Error>; + fn read_u8(&mut self) -> Result<u8, Self::Error>; + fn read_int(&mut self) -> Result<int, Self::Error>; + fn read_i64(&mut self) -> Result<i64, Self::Error>; + fn read_i32(&mut self) -> Result<i32, Self::Error>; + fn read_i16(&mut self) -> Result<i16, Self::Error>; + fn read_i8(&mut self) -> Result<i8, Self::Error>; + fn read_bool(&mut self) -> Result<bool, Self::Error>; + fn read_f64(&mut self) -> Result<f64, Self::Error>; + fn read_f32(&mut self) -> Result<f32, Self::Error>; + fn read_char(&mut self) -> Result<char, Self::Error>; + fn read_str(&mut self) -> Result<String, Self::Error>; // Compound types: - fn read_enum<T, F>(&mut self, name: &str, f: F) -> Result<T, E> where - F: FnOnce(&mut Self) -> Result<T, E>; - - fn read_enum_variant<T, F>(&mut self, names: &[&str], f: F) -> Result<T, E> where - F: FnMut(&mut Self, uint) -> Result<T, E>; - fn read_enum_variant_arg<T, F>(&mut self, a_idx: uint, f: F) -> Result<T, E> where - F: FnOnce(&mut Self) -> Result<T, E>; - - fn read_enum_struct_variant<T, F>(&mut self, names: &[&str], f: F) -> Result<T, E> where - F: FnMut(&mut Self, uint) -> Result<T, E>; + fn read_enum<T, F>(&mut self, name: &str, f: F) -> Result<T, Self::Error> + where F: FnOnce(&mut Self) -> Result<T, Self::Error>; + + fn read_enum_variant<T, F>(&mut self, names: &[&str], f: F) + -> Result<T, Self::Error> + where F: FnMut(&mut Self, uint) -> Result<T, Self::Error>; + fn read_enum_variant_arg<T, F>(&mut self, a_idx: uint, f: F) + -> Result<T, Self::Error> + where F: FnOnce(&mut Self) -> Result<T, Self::Error>; + + fn read_enum_struct_variant<T, F>(&mut self, names: &[&str], f: F) + -> Result<T, Self::Error> + where F: FnMut(&mut Self, uint) -> Result<T, Self::Error>; fn read_enum_struct_variant_field<T, F>(&mut self, &f_name: &str, f_idx: uint, f: F) - -> Result<T, E> where - F: FnOnce(&mut Self) -> Result<T, E>; + -> Result<T, Self::Error> + where F: FnOnce(&mut Self) -> Result<T, Self::Error>; - fn read_struct<T, F>(&mut self, s_name: &str, len: uint, f: F) -> Result<T, E> where - F: FnOnce(&mut Self) -> Result<T, E>; + fn read_struct<T, F>(&mut self, s_name: &str, len: uint, f: F) + -> Result<T, Self::Error> + where F: FnOnce(&mut Self) -> Result<T, Self::Error>; fn read_struct_field<T, F>(&mut self, f_name: &str, f_idx: uint, f: F) - -> Result<T, E> where - F: FnOnce(&mut Self) -> Result<T, E>; - - fn read_tuple<T, F>(&mut self, len: uint, f: F) -> Result<T, E> where - F: FnOnce(&mut Self) -> Result<T, E>; - fn read_tuple_arg<T, F>(&mut self, a_idx: uint, f: F) -> Result<T, E> where - F: FnOnce(&mut Self) -> Result<T, E>; - - fn read_tuple_struct<T, F>(&mut self, s_name: &str, len: uint, f: F) -> Result<T, E> where - F: FnOnce(&mut Self) -> Result<T, E>; - fn read_tuple_struct_arg<T, F>(&mut self, a_idx: uint, f: F) -> Result<T, E> where - F: FnOnce(&mut Self) -> Result<T, E>; + -> Result<T, Self::Error> + where F: FnOnce(&mut Self) -> Result<T, Self::Error>; + + fn read_tuple<T, F>(&mut self, len: uint, f: F) -> Result<T, Self::Error> + where F: FnOnce(&mut Self) -> Result<T, Self::Error>; + fn read_tuple_arg<T, F>(&mut self, a_idx: uint, f: F) + -> Result<T, Self::Error> + where F: FnOnce(&mut Self) -> Result<T, Self::Error>; + + fn read_tuple_struct<T, F>(&mut self, s_name: &str, len: uint, f: F) + -> Result<T, Self::Error> + where F: FnOnce(&mut Self) -> Result<T, Self::Error>; + fn read_tuple_struct_arg<T, F>(&mut self, a_idx: uint, f: F) + -> Result<T, Self::Error> + where F: FnOnce(&mut Self) -> Result<T, Self::Error>; // Specialized types: - fn read_option<T, F>(&mut self, f: F) -> Result<T, E> where - F: FnMut(&mut Self, bool) -> Result<T, E>; - - fn read_seq<T, F>(&mut self, f: F) -> Result<T, E> where - F: FnOnce(&mut Self, uint) -> Result<T, E>; - fn read_seq_elt<T, F>(&mut self, idx: uint, f: F) -> Result<T, E> where - F: FnOnce(&mut Self) -> Result<T, E>; - - fn read_map<T, F>(&mut self, f: F) -> Result<T, E> where - F: FnOnce(&mut Self, uint) -> Result<T, E>; - fn read_map_elt_key<T, F>(&mut self, idx: uint, f: F) -> Result<T, E> where - F: FnOnce(&mut Self) -> Result<T, E>; - fn read_map_elt_val<T, F>(&mut self, idx: uint, f: F) -> Result<T, E> where - F: FnOnce(&mut Self) -> Result<T, E>; + fn read_option<T, F>(&mut self, f: F) -> Result<T, Self::Error> + where F: FnMut(&mut Self, bool) -> Result<T, Self::Error>; + + fn read_seq<T, F>(&mut self, f: F) -> Result<T, Self::Error> + where F: FnOnce(&mut Self, uint) -> Result<T, Self::Error>; + fn read_seq_elt<T, F>(&mut self, idx: uint, f: F) -> Result<T, Self::Error> + where F: FnOnce(&mut Self) -> Result<T, Self::Error>; + + fn read_map<T, F>(&mut self, f: F) -> Result<T, Self::Error> + where F: FnOnce(&mut Self, uint) -> Result<T, Self::Error>; + fn read_map_elt_key<T, F>(&mut self, idx: uint, f: F) + -> Result<T, Self::Error> + where F: FnOnce(&mut Self) -> Result<T, Self::Error>; + fn read_map_elt_val<T, F>(&mut self, idx: uint, f: F) + -> Result<T, Self::Error> + where F: FnOnce(&mut Self) -> Result<T, Self::Error>; // Failure - fn error(&mut self, err: &str) -> E; + fn error(&mut self, err: &str) -> Self::Error; } -pub trait Encodable<S:Encoder<E>, E> for Sized? { - fn encode(&self, s: &mut S) -> Result<(), E>; +pub trait Encodable for Sized? { + fn encode<S: Encoder>(&self, s: &mut S) -> Result<(), S::Error>; } -pub trait Decodable<D:Decoder<E>, E> { - fn decode(d: &mut D) -> Result<Self, E>; +pub trait Decodable { + fn decode<D: Decoder>(d: &mut D) -> Result<Self, D::Error>; } -impl<E, S:Encoder<E>> Encodable<S, E> for uint { - fn encode(&self, s: &mut S) -> Result<(), E> { +impl Encodable for uint { + fn encode<S: Encoder>(&self, s: &mut S) -> Result<(), S::Error> { s.emit_uint(*self) } } -impl<E, D:Decoder<E>> Decodable<D, E> for uint { - fn decode(d: &mut D) -> Result<uint, E> { +impl Decodable for uint { + fn decode<D: Decoder>(d: &mut D) -> Result<uint, D::Error> { d.read_uint() } } -impl<E, S:Encoder<E>> Encodable<S, E> for u8 { - fn encode(&self, s: &mut S) -> Result<(), E> { +impl Encodable for u8 { + fn encode<S: Encoder>(&self, s: &mut S) -> Result<(), S::Error> { s.emit_u8(*self) } } -impl<E, D:Decoder<E>> Decodable<D, E> for u8 { - fn decode(d: &mut D) -> Result<u8, E> { +impl Decodable for u8 { + fn decode<D: Decoder>(d: &mut D) -> Result<u8, D::Error> { d.read_u8() } } -impl<E, S:Encoder<E>> Encodable<S, E> for u16 { - fn encode(&self, s: &mut S) -> Result<(), E> { +impl Encodable for u16 { + fn encode<S: Encoder>(&self, s: &mut S) -> Result<(), S::Error> { s.emit_u16(*self) } } -impl<E, D:Decoder<E>> Decodable<D, E> for u16 { - fn decode(d: &mut D) -> Result<u16, E> { +impl Decodable for u16 { + fn decode<D: Decoder>(d: &mut D) -> Result<u16, D::Error> { d.read_u16() } } -impl<E, S:Encoder<E>> Encodable<S, E> for u32 { - fn encode(&self, s: &mut S) -> Result<(), E> { +impl Encodable for u32 { + fn encode<S: Encoder>(&self, s: &mut S) -> Result<(), S::Error> { s.emit_u32(*self) } } -impl<E, D:Decoder<E>> Decodable<D, E> for u32 { - fn decode(d: &mut D) -> Result<u32, E> { +impl Decodable for u32 { + fn decode<D: Decoder>(d: &mut D) -> Result<u32, D::Error> { d.read_u32() } } -impl<E, S:Encoder<E>> Encodable<S, E> for u64 { - fn encode(&self, s: &mut S) -> Result<(), E> { +impl Encodable for u64 { + fn encode<S: Encoder>(&self, s: &mut S) -> Result<(), S::Error> { s.emit_u64(*self) } } -impl<E, D:Decoder<E>> Decodable<D, E> for u64 { - fn decode(d: &mut D) -> Result<u64, E> { +impl Decodable for u64 { + fn decode<D: Decoder>(d: &mut D) -> Result<u64, D::Error> { d.read_u64() } } -impl<E, S:Encoder<E>> Encodable<S, E> for int { - fn encode(&self, s: &mut S) -> Result<(), E> { +impl Encodable for int { + fn encode<S: Encoder>(&self, s: &mut S) -> Result<(), S::Error> { s.emit_int(*self) } } -impl<E, D:Decoder<E>> Decodable<D, E> for int { - fn decode(d: &mut D) -> Result<int, E> { +impl Decodable for int { + fn decode<D: Decoder>(d: &mut D) -> Result<int, D::Error> { d.read_int() } } -impl<E, S:Encoder<E>> Encodable<S, E> for i8 { - fn encode(&self, s: &mut S) -> Result<(), E> { +impl Encodable for i8 { + fn encode<S: Encoder>(&self, s: &mut S) -> Result<(), S::Error> { s.emit_i8(*self) } } -impl<E, D:Decoder<E>> Decodable<D, E> for i8 { - fn decode(d: &mut D) -> Result<i8, E> { +impl Decodable for i8 { + fn decode<D: Decoder>(d: &mut D) -> Result<i8, D::Error> { d.read_i8() } } -impl<E, S:Encoder<E>> Encodable<S, E> for i16 { - fn encode(&self, s: &mut S) -> Result<(), E> { +impl Encodable for i16 { + fn encode<S: Encoder>(&self, s: &mut S) -> Result<(), S::Error> { s.emit_i16(*self) } } -impl<E, D:Decoder<E>> Decodable<D, E> for i16 { - fn decode(d: &mut D) -> Result<i16, E> { +impl Decodable for i16 { + fn decode<D: Decoder>(d: &mut D) -> Result<i16, D::Error> { d.read_i16() } } -impl<E, S:Encoder<E>> Encodable<S, E> for i32 { - fn encode(&self, s: &mut S) -> Result<(), E> { +impl Encodable for i32 { + fn encode<S: Encoder>(&self, s: &mut S) -> Result<(), S::Error> { s.emit_i32(*self) } } -impl<E, D:Decoder<E>> Decodable<D, E> for i32 { - fn decode(d: &mut D) -> Result<i32, E> { +impl Decodable for i32 { + fn decode<D: Decoder>(d: &mut D) -> Result<i32, D::Error> { d.read_i32() } } -impl<E, S:Encoder<E>> Encodable<S, E> for i64 { - fn encode(&self, s: &mut S) -> Result<(), E> { +impl Encodable for i64 { + fn encode<S: Encoder>(&self, s: &mut S) -> Result<(), S::Error> { s.emit_i64(*self) } } -impl<E, D:Decoder<E>> Decodable<D, E> for i64 { - fn decode(d: &mut D) -> Result<i64, E> { +impl Decodable for i64 { + fn decode<D: Decoder>(d: &mut D) -> Result<i64, D::Error> { d.read_i64() } } -impl<E, S:Encoder<E>> Encodable<S, E> for str { - fn encode(&self, s: &mut S) -> Result<(), E> { +impl Encodable for str { + fn encode<S: Encoder>(&self, s: &mut S) -> Result<(), S::Error> { s.emit_str(self) } } -impl<E, S:Encoder<E>> Encodable<S, E> for String { - fn encode(&self, s: &mut S) -> Result<(), E> { +impl Encodable for String { + fn encode<S: Encoder>(&self, s: &mut S) -> Result<(), S::Error> { s.emit_str(self[]) } } -impl<E, D:Decoder<E>> Decodable<D, E> for String { - fn decode(d: &mut D) -> Result<String, E> { +impl Decodable for String { + fn decode<D: Decoder>(d: &mut D) -> Result<String, D::Error> { d.read_str() } } -impl<E, S:Encoder<E>> Encodable<S, E> for f32 { - fn encode(&self, s: &mut S) -> Result<(), E> { +impl Encodable for f32 { + fn encode<S: Encoder>(&self, s: &mut S) -> Result<(), S::Error> { s.emit_f32(*self) } } -impl<E, D:Decoder<E>> Decodable<D, E> for f32 { - fn decode(d: &mut D) -> Result<f32, E> { +impl Decodable for f32 { + fn decode<D: Decoder>(d: &mut D) -> Result<f32, D::Error> { d.read_f32() } } -impl<E, S:Encoder<E>> Encodable<S, E> for f64 { - fn encode(&self, s: &mut S) -> Result<(), E> { +impl Encodable for f64 { + fn encode<S: Encoder>(&self, s: &mut S) -> Result<(), S::Error> { s.emit_f64(*self) } } -impl<E, D:Decoder<E>> Decodable<D, E> for f64 { - fn decode(d: &mut D) -> Result<f64, E> { +impl Decodable for f64 { + fn decode<D: Decoder>(d: &mut D) -> Result<f64, D::Error> { d.read_f64() } } -impl<E, S:Encoder<E>> Encodable<S, E> for bool { - fn encode(&self, s: &mut S) -> Result<(), E> { +impl Encodable for bool { + fn encode<S: Encoder>(&self, s: &mut S) -> Result<(), S::Error> { s.emit_bool(*self) } } -impl<E, D:Decoder<E>> Decodable<D, E> for bool { - fn decode(d: &mut D) -> Result<bool, E> { +impl Decodable for bool { + fn decode<D: Decoder>(d: &mut D) -> Result<bool, D::Error> { d.read_bool() } } -impl<E, S:Encoder<E>> Encodable<S, E> for char { - fn encode(&self, s: &mut S) -> Result<(), E> { +impl Encodable for char { + fn encode<S: Encoder>(&self, s: &mut S) -> Result<(), S::Error> { s.emit_char(*self) } } -impl<E, D:Decoder<E>> Decodable<D, E> for char { - fn decode(d: &mut D) -> Result<char, E> { +impl Decodable for char { + fn decode<D: Decoder>(d: &mut D) -> Result<char, D::Error> { d.read_char() } } -impl<E, S:Encoder<E>> Encodable<S, E> for () { - fn encode(&self, s: &mut S) -> Result<(), E> { +impl Encodable for () { + fn encode<S: Encoder>(&self, s: &mut S) -> Result<(), S::Error> { s.emit_nil() } } -impl<E, D:Decoder<E>> Decodable<D, E> for () { - fn decode(d: &mut D) -> Result<(), E> { +impl Decodable for () { + fn decode<D: Decoder>(d: &mut D) -> Result<(), D::Error> { d.read_nil() } } -impl<'a, E, S: Encoder<E>, Sized? T: Encodable<S, E>> Encodable<S, E> for &'a T { - fn encode(&self, s: &mut S) -> Result<(), E> { +impl<'a, Sized? T: Encodable> Encodable for &'a T { + fn encode<S: Encoder>(&self, s: &mut S) -> Result<(), S::Error> { (**self).encode(s) } } -impl<E, S: Encoder<E>, Sized? T: Encodable<S, E>> Encodable<S, E> for Box<T> { - fn encode(&self, s: &mut S) -> Result<(), E> { +impl<Sized? T: Encodable> Encodable for Box<T> { + fn encode<S: Encoder>(&self, s: &mut S) -> Result<(), S::Error> { (**self).encode(s) } } -impl<E, D:Decoder<E>, T: Decodable<D, E>> Decodable<D, E> for Box<T> { - fn decode(d: &mut D) -> Result<Box<T>, E> { +impl< T: Decodable> Decodable for Box<T> { + fn decode<D: Decoder>(d: &mut D) -> Result<Box<T>, D::Error> { Ok(box try!(Decodable::decode(d))) } } -impl<E, D:Decoder<E>, T: Decodable<D, E>> Decodable<D, E> for Box<[T]> { - fn decode(d: &mut D) -> Result<Box<[T]>, E> { +impl< T: Decodable> Decodable for Box<[T]> { + fn decode<D: Decoder>(d: &mut D) -> Result<Box<[T]>, D::Error> { let v: Vec<T> = try!(Decodable::decode(d)); Ok(v.into_boxed_slice()) } } -impl<E, S:Encoder<E>,T:Encodable<S, E>> Encodable<S, E> for Rc<T> { +impl<T:Encodable> Encodable for Rc<T> { #[inline] - fn encode(&self, s: &mut S) -> Result<(), E> { + fn encode<S: Encoder>(&self, s: &mut S) -> Result<(), S::Error> { (**self).encode(s) } } -impl<E, D:Decoder<E>,T:Decodable<D, E>> Decodable<D, E> for Rc<T> { +impl<T:Decodable> Decodable for Rc<T> { #[inline] - fn decode(d: &mut D) -> Result<Rc<T>, E> { + fn decode<D: Decoder>(d: &mut D) -> Result<Rc<T>, D::Error> { Ok(Rc::new(try!(Decodable::decode(d)))) } } -impl<E, S:Encoder<E>,T:Encodable<S, E>> Encodable<S, E> for [T] { - fn encode(&self, s: &mut S) -> Result<(), E> { +impl<T:Encodable> Encodable for [T] { + fn encode<S: Encoder>(&self, s: &mut S) -> Result<(), S::Error> { s.emit_seq(self.len(), |s| { for (i, e) in self.iter().enumerate() { try!(s.emit_seq_elt(i, |s| e.encode(s))) @@ -428,8 +446,8 @@ impl<E, S:Encoder<E>,T:Encodable<S, E>> Encodable<S, E> for [T] { } } -impl<E, S:Encoder<E>,T:Encodable<S, E>> Encodable<S, E> for Vec<T> { - fn encode(&self, s: &mut S) -> Result<(), E> { +impl<T:Encodable> Encodable for Vec<T> { + fn encode<S: Encoder>(&self, s: &mut S) -> Result<(), S::Error> { s.emit_seq(self.len(), |s| { for (i, e) in self.iter().enumerate() { try!(s.emit_seq_elt(i, |s| e.encode(s))) @@ -439,8 +457,8 @@ impl<E, S:Encoder<E>,T:Encodable<S, E>> Encodable<S, E> for Vec<T> { } } -impl<E, D:Decoder<E>,T:Decodable<D, E>> Decodable<D, E> for Vec<T> { - fn decode(d: &mut D) -> Result<Vec<T>, E> { +impl<T:Decodable> Decodable for Vec<T> { + fn decode<D: Decoder>(d: &mut D) -> Result<Vec<T>, D::Error> { d.read_seq(|d, len| { let mut v = Vec::with_capacity(len); for i in range(0, len) { @@ -451,8 +469,8 @@ impl<E, D:Decoder<E>,T:Decodable<D, E>> Decodable<D, E> for Vec<T> { } } -impl<E, S:Encoder<E>,T:Encodable<S, E>> Encodable<S, E> for Option<T> { - fn encode(&self, s: &mut S) -> Result<(), E> { +impl<T:Encodable> Encodable for Option<T> { + fn encode<S: Encoder>(&self, s: &mut S) -> Result<(), S::Error> { s.emit_option(|s| { match *self { None => s.emit_option_none(), @@ -462,8 +480,8 @@ impl<E, S:Encoder<E>,T:Encodable<S, E>> Encodable<S, E> for Option<T> { } } -impl<E, D:Decoder<E>,T:Decodable<D, E>> Decodable<D, E> for Option<T> { - fn decode(d: &mut D) -> Result<Option<T>, E> { +impl<T:Decodable> Decodable for Option<T> { + fn decode<D: Decoder>(d: &mut D) -> Result<Option<T>, D::Error> { d.read_option(|d, b| { if b { Ok(Some(try!(Decodable::decode(d)))) @@ -487,22 +505,23 @@ macro_rules! count_idents { macro_rules! tuple { () => (); ( $($name:ident,)+ ) => ( - impl<E, D:Decoder<E>,$($name:Decodable<D, E>),*> Decodable<D,E> for ($($name,)*) { + impl<$($name:Decodable),*> Decodable for ($($name,)*) { #[allow(non_snake_case)] - fn decode(d: &mut D) -> Result<($($name,)*), E> { + fn decode<D: Decoder>(d: &mut D) -> Result<($($name,)*), D::Error> { let len: uint = count_idents!($($name),*); d.read_tuple(len, |d| { let mut i = 0; - let ret = ($(try!(d.read_tuple_arg({ i+=1; i-1 }, |d| -> Result<$name,E> { + let ret = ($(try!(d.read_tuple_arg({ i+=1; i-1 }, + |d| -> Result<$name,D::Error> { Decodable::decode(d) })),)*); return Ok(ret); }) } } - impl<E, S:Encoder<E>,$($name:Encodable<S, E>),*> Encodable<S, E> for ($($name,)*) { + impl<$($name:Encodable),*> Encodable for ($($name,)*) { #[allow(non_snake_case)] - fn encode(&self, s: &mut S) -> Result<(), E> { + fn encode<S: Encoder>(&self, s: &mut S) -> Result<(), S::Error> { let ($(ref $name,)*) = *self; let mut n = 0; $(let $name = $name; n += 1;)* @@ -519,40 +538,40 @@ macro_rules! tuple { tuple! { T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, } -impl<E, S: Encoder<E>> Encodable<S, E> for path::posix::Path { - fn encode(&self, e: &mut S) -> Result<(), E> { +impl Encodable for path::posix::Path { + fn encode<S: Encoder>(&self, e: &mut S) -> Result<(), S::Error> { self.as_vec().encode(e) } } -impl<E, D: Decoder<E>> Decodable<D, E> for path::posix::Path { - fn decode(d: &mut D) -> Result<path::posix::Path, E> { +impl Decodable for path::posix::Path { + fn decode<D: Decoder>(d: &mut D) -> Result<path::posix::Path, D::Error> { let bytes: Vec<u8> = try!(Decodable::decode(d)); Ok(path::posix::Path::new(bytes)) } } -impl<E, S: Encoder<E>> Encodable<S, E> for path::windows::Path { - fn encode(&self, e: &mut S) -> Result<(), E> { +impl Encodable for path::windows::Path { + fn encode<S: Encoder>(&self, e: &mut S) -> Result<(), S::Error> { self.as_vec().encode(e) } } -impl<E, D: Decoder<E>> Decodable<D, E> for path::windows::Path { - fn decode(d: &mut D) -> Result<path::windows::Path, E> { +impl Decodable for path::windows::Path { + fn decode<D: Decoder>(d: &mut D) -> Result<path::windows::Path, D::Error> { let bytes: Vec<u8> = try!(Decodable::decode(d)); Ok(path::windows::Path::new(bytes)) } } -impl<E, S: Encoder<E>, T: Encodable<S, E> + Copy> Encodable<S, E> for Cell<T> { - fn encode(&self, s: &mut S) -> Result<(), E> { +impl<T: Encodable + Copy> Encodable for Cell<T> { + fn encode<S: Encoder>(&self, s: &mut S) -> Result<(), S::Error> { self.get().encode(s) } } -impl<E, D: Decoder<E>, T: Decodable<D, E> + Copy> Decodable<D, E> for Cell<T> { - fn decode(d: &mut D) -> Result<Cell<T>, E> { +impl<T: Decodable + Copy> Decodable for Cell<T> { + fn decode<D: Decoder>(d: &mut D) -> Result<Cell<T>, D::Error> { Ok(Cell::new(try!(Decodable::decode(d)))) } } @@ -562,26 +581,26 @@ impl<E, D: Decoder<E>, T: Decodable<D, E> + Copy> Decodable<D, E> for Cell<T> { // `encoder.error("attempting to Encode borrowed RefCell")` // from `encode` when `try_borrow` returns `None`. -impl<E, S: Encoder<E>, T: Encodable<S, E>> Encodable<S, E> for RefCell<T> { - fn encode(&self, s: &mut S) -> Result<(), E> { +impl<T: Encodable> Encodable for RefCell<T> { + fn encode<S: Encoder>(&self, s: &mut S) -> Result<(), S::Error> { self.borrow().encode(s) } } -impl<E, D: Decoder<E>, T: Decodable<D, E>> Decodable<D, E> for RefCell<T> { - fn decode(d: &mut D) -> Result<RefCell<T>, E> { +impl<T: Decodable> Decodable for RefCell<T> { + fn decode<D: Decoder>(d: &mut D) -> Result<RefCell<T>, D::Error> { Ok(RefCell::new(try!(Decodable::decode(d)))) } } -impl<E, S:Encoder<E>, T:Encodable<S, E>> Encodable<S, E> for Arc<T> { - fn encode(&self, s: &mut S) -> Result<(), E> { +impl<T:Encodable> Encodable for Arc<T> { + fn encode<S: Encoder>(&self, s: &mut S) -> Result<(), S::Error> { (**self).encode(s) } } -impl<E, D:Decoder<E>,T:Decodable<D, E>+Send+Sync> Decodable<D, E> for Arc<T> { - fn decode(d: &mut D) -> Result<Arc<T>, E> { +impl<T:Decodable+Send+Sync> Decodable for Arc<T> { + fn decode<D: Decoder>(d: &mut D) -> Result<Arc<T>, D::Error> { Ok(Arc::new(try!(Decodable::decode(d)))) } } @@ -589,14 +608,15 @@ impl<E, D:Decoder<E>,T:Decodable<D, E>+Send+Sync> Decodable<D, E> for Arc<T> { // ___________________________________________________________________________ // Helper routines -pub trait EncoderHelpers<E> { - fn emit_from_vec<T, F>(&mut self, v: &[T], f: F) -> Result<(), E> where - F: FnMut(&mut Self, &T) -> Result<(), E>; +pub trait EncoderHelpers: Encoder { + fn emit_from_vec<T, F>(&mut self, v: &[T], f: F) + -> Result<(), <Self as Encoder>::Error> + where F: FnMut(&mut Self, &T) -> Result<(), <Self as Encoder>::Error>; } -impl<E, S:Encoder<E>> EncoderHelpers<E> for S { - fn emit_from_vec<T, F>(&mut self, v: &[T], mut f: F) -> Result<(), E> where - F: FnMut(&mut S, &T) -> Result<(), E>, +impl<S:Encoder> EncoderHelpers for S { + fn emit_from_vec<T, F>(&mut self, v: &[T], mut f: F) -> Result<(), S::Error> where + F: FnMut(&mut S, &T) -> Result<(), S::Error>, { self.emit_seq(v.len(), |this| { for (i, e) in v.iter().enumerate() { @@ -609,14 +629,15 @@ impl<E, S:Encoder<E>> EncoderHelpers<E> for S { } } -pub trait DecoderHelpers<E> { - fn read_to_vec<T, F>(&mut self, f: F) -> Result<Vec<T>, E> where - F: FnMut(&mut Self) -> Result<T, E>; +pub trait DecoderHelpers: Decoder { + fn read_to_vec<T, F>(&mut self, f: F) + -> Result<Vec<T>, <Self as Decoder>::Error> where + F: FnMut(&mut Self) -> Result<T, <Self as Decoder>::Error>; } -impl<E, D:Decoder<E>> DecoderHelpers<E> for D { - fn read_to_vec<T, F>(&mut self, mut f: F) -> Result<Vec<T>, E> where F: - FnMut(&mut D) -> Result<T, E>, +impl<D: Decoder> DecoderHelpers for D { + fn read_to_vec<T, F>(&mut self, mut f: F) -> Result<Vec<T>, D::Error> where F: + FnMut(&mut D) -> Result<T, D::Error>, { self.read_seq(|this, len| { let mut v = Vec::with_capacity(len); |
