From 54e685d4fd70eeb607668fed2026ac6cafec6107 Mon Sep 17 00:00:00 2001 From: Kevin Ballard Date: Thu, 1 Aug 2013 15:18:10 -0700 Subject: [PATCH] option: mutate() and mutate_default() should return bool Fixes #8047. --- src/librustc/middle/trans/_match.rs | 2 +- src/libstd/option.rs | 29 ++++++++++++++++++++++++----- 2 files changed, 25 insertions(+), 6 deletions(-) diff --git a/src/librustc/middle/trans/_match.rs b/src/librustc/middle/trans/_match.rs index 5f9351e4e12e7..9922106a66380 100644 --- a/src/librustc/middle/trans/_match.rs +++ b/src/librustc/middle/trans/_match.rs @@ -1159,7 +1159,7 @@ fn store_non_ref_bindings(bcx: @mut Block, add_clean_temp_mem(bcx, lldest, binding_info.ty); temp_cleanups.push(lldest); temp_cleanups - } + }; } TrByRef => {} } diff --git a/src/libstd/option.rs b/src/libstd/option.rs index 7eca47743d6a6..547c453b02d1a 100644 --- a/src/libstd/option.rs +++ b/src/libstd/option.rs @@ -235,19 +235,24 @@ impl Option { self.take().map_consume_default(def, blk) } - /// Apply a function to the contained value or do nothing - pub fn mutate(&mut self, f: &fn(T) -> T) { + /// Apply a function to the contained value or do nothing. + /// Returns true if the contained value was mutated. + pub fn mutate(&mut self, f: &fn(T) -> T) -> bool { if self.is_some() { *self = Some(f(self.take_unwrap())); - } + true + } else { false } } - /// Apply a function to the contained value or set it to a default - pub fn mutate_default(&mut self, def: T, f: &fn(T) -> T) { + /// Apply a function to the contained value or set it to a default. + /// Returns true if the contained value was mutated, or false if set to the default. + pub fn mutate_default(&mut self, def: T, f: &fn(T) -> T) -> bool { if self.is_some() { *self = Some(f(self.take_unwrap())); + true } else { *self = Some(def); + false } } @@ -575,4 +580,18 @@ mod tests { assert_eq!(it.size_hint(), (0, Some(0))); assert!(it.next().is_none()); } + + #[test] + fn test_mutate() { + let mut x = Some(3i); + assert!(x.mutate(|i| i+1)); + assert_eq!(x, Some(4i)); + assert!(x.mutate_default(0, |i| i+1)); + assert_eq!(x, Some(5i)); + x = None; + assert!(!x.mutate(|i| i+1)); + assert_eq!(x, None); + assert!(!x.mutate_default(0i, |i| i+1)); + assert_eq!(x, Some(0i)); + } }