}
#[cfg(stage0)]
- fn read_option<T>(&self, f: &fn() -> T) -> Option<T> {
+ fn read_option<T>(&self, f: &fn(bool) -> T) -> T {
debug!("read_option()");
do self.read_enum("Option") || {
do self.read_enum_variant |idx| {
match idx {
- 0 => None,
- 1 => Some(f()),
+ 0 => f(false),
+ 1 => f(true),
_ => fail!(),
}
}
#[cfg(stage1)]
#[cfg(stage2)]
#[cfg(stage3)]
- fn read_option<T>(&self, f: &fn() -> T) -> Option<T> {
+ fn read_option<T>(&self, f: &fn(bool) -> T) -> T {
debug!("read_option()");
do self.read_enum("Option") || {
do self.read_enum_variant(["None", "Some"]) |idx| {
match idx {
- 0 => None,
- 1 => Some(f()),
+ 0 => f(false),
+ 1 => f(true),
_ => fail!(),
}
}
}
}
- fn read_option<T>(&self, f: &fn() -> T) -> Option<T> {
+ fn read_option<T>(&self, f: &fn(bool) -> T) -> T {
match *self.peek() {
- Null => { self.pop(); None }
- _ => Some(f()),
+ Null => { self.pop(); f(false) }
+ _ => f(true),
}
}
}
fn read_tup_elt<T>(&self, idx: uint, f: &fn() -> T) -> T;
// Specialized types:
- fn read_option<T>(&self, f: &fn() -> T) -> Option<T>;
+ fn read_option<T>(&self, f: &fn(bool) -> T) -> T;
}
pub trait Encodable<S:Encoder> {
impl<D:Decoder,T:Decodable<D>> Decodable<D> for Option<T> {
fn decode(d: &D) -> Option<T> {
- d.read_option(|| Decodable::decode(d))
+ do d.read_option |b| {
+ if b {
+ Some(Decodable::decode(d))
+ } else {
+ None
+ }
+ }
}
}