about summary refs log tree commit diff
path: root/src/libstd
diff options
context:
space:
mode:
authorErick Tryzelaar <erick.tryzelaar@gmail.com>2013-03-28 13:11:14 -0700
committerErick Tryzelaar <erick.tryzelaar@gmail.com>2013-03-28 13:11:24 -0700
commitaa779c1240afd0f5e46897b6ddfa55126471bf19 (patch)
tree6001cd7ab3fe1998802fa8383f69d97000629f7a /src/libstd
parentce9e5ecb6c1f833eccb520b4179cf86329331fa6 (diff)
downloadrust-aa779c1240afd0f5e46897b6ddfa55126471bf19.tar.gz
rust-aa779c1240afd0f5e46897b6ddfa55126471bf19.zip
std: change Decoder::read_option to return a generic type
This allows read_option to be used with a custom option type instead
of just core::Option.
Diffstat (limited to 'src/libstd')
-rw-r--r--src/libstd/ebml.rs12
-rw-r--r--src/libstd/json.rs6
-rw-r--r--src/libstd/serialize.rs10
3 files changed, 17 insertions, 11 deletions
diff --git a/src/libstd/ebml.rs b/src/libstd/ebml.rs
index 5855add7975..331bede5b7a 100644
--- a/src/libstd/ebml.rs
+++ b/src/libstd/ebml.rs
@@ -411,13 +411,13 @@ pub mod reader {
         }
 
         #[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!(),
                     }
                 }
@@ -427,13 +427,13 @@ pub mod reader {
         #[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!(),
                     }
                 }
diff --git a/src/libstd/json.rs b/src/libstd/json.rs
index c48b210dca2..4b0e313330d 100644
--- a/src/libstd/json.rs
+++ b/src/libstd/json.rs
@@ -980,10 +980,10 @@ impl<'self> serialize::Decoder for Decoder<'self> {
         }
     }
 
-    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),
         }
     }
 }
diff --git a/src/libstd/serialize.rs b/src/libstd/serialize.rs
index 02f4a934874..3c9ad0d77d1 100644
--- a/src/libstd/serialize.rs
+++ b/src/libstd/serialize.rs
@@ -118,7 +118,7 @@ pub trait Decoder {
     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> {
@@ -395,7 +395,13 @@ impl<S:Encoder,T:Encodable<S>> Encodable<S> for Option<T> {
 
 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
+            }
+        }
     }
 }