diff --git a/src/libcore/option.rs b/src/libcore/option.rs index e0393fdf5e3..99478886017 100644 --- a/src/libcore/option.rs +++ b/src/libcore/option.rs @@ -42,6 +42,7 @@ let unwrapped_msg = match msg { */ use cmp::{Eq,Ord}; +use ops::Add; use kinds::Copy; use util; use num::Zero; @@ -85,6 +86,18 @@ impl Ord for Option { } } +impl> Add, Option> for Option { + #[inline(always)] + pure fn add(&self, other: &Option) -> Option { + match (*self, *other) { + (None, None) => None, + (_, None) => *self, + (None, _) => *other, + (Some(ref lhs), Some(ref rhs)) => Some(*lhs + *rhs) + } + } +} + #[inline(always)] pub pure fn get(opt: Option) -> T { /*! diff --git a/src/test/run-pass/option_addition.rs b/src/test/run-pass/option_addition.rs new file mode 100644 index 00000000000..92420562706 --- /dev/null +++ b/src/test/run-pass/option_addition.rs @@ -0,0 +1,27 @@ +fn main() { + let foo = 1; + let bar = 2; + let foobar = foo + bar; + + let nope = optint(0) + optint(0); + let somefoo = optint(foo) + optint(0); + let somebar = optint(bar) + optint(0); + let somefoobar = optint(foo) + optint(bar); + + match nope { + None => (), + Some(foo) => fail!(fmt!("expected None, but found %?", foo)) + } + fail_unless!(foo == somefoo.get()); + fail_unless!(bar == somebar.get()); + fail_unless!(foobar == somefoobar.get()); +} + +fn optint(in: int) -> Option { + if in == 0 { + return None; + } + else { + return Some(in); + } +}