Skip to content

Commit

Permalink
make cloned generic over deref... and have its tests actually run
Browse files Browse the repository at this point in the history
  • Loading branch information
Gankra committed Nov 18, 2014
1 parent f092793 commit 9702fb9
Show file tree
Hide file tree
Showing 2 changed files with 29 additions and 12 deletions.
8 changes: 5 additions & 3 deletions src/libcore/option.rs
Expand Up @@ -153,6 +153,7 @@ use result::{Result, Ok, Err};
use slice;
use slice::AsSlice;
use clone::Clone;
use ops::Deref;

// Note that this is not a lang item per se, but it has a hidden dependency on
// `Iterator`, which is one. The compiler assumes that the `next` method of
Expand Down Expand Up @@ -694,11 +695,12 @@ impl<T> Option<T> {
}
}

impl<'a, T: Clone> Option<&'a T> {
/// Maps an Option<&T> to an Option<T> by cloning the contents of the Option<&T>.
impl<'a, T: Clone, D: Deref<T>> Option<D> {
/// Maps an Option<D> to an Option<T> by dereffing and cloning the contents of the Option.
/// Useful for converting an Option<&T> to an Option<T>.
#[unstable = "recently added as part of collections reform"]
pub fn cloned(self) -> Option<T> {
self.map(|t| t.clone())
self.map(|t| t.deref().clone())
}
}

Expand Down
33 changes: 24 additions & 9 deletions src/libcoretest/option.rs
Expand Up @@ -241,14 +241,29 @@ fn test_collect() {
assert!(v == None);
}

#[test]
fn test_cloned() {
let s = 1u32;
let n: Option<&'static u32> = None;
let o = Some(&s);

assert_eq!(o.clone(), Some(&s));
assert_eq!(o.cloned(), Some(1u32));

assert_eq!(n.clone(), None);
assert_eq!(n.cloned(), None);
let val1 = 1u32;
let mut val2 = 2u32;
let val1_ref = &val1;
let opt_none: Option<&'static u32> = None;
let opt_ref = Some(&val1);
let opt_ref_ref = Some(&val1_ref);
let opt_mut_ref = Some(&mut val2);

// None works
assert_eq!(opt_none.clone(), None);
assert_eq!(opt_none.cloned(), None);

// Mutable refs work
assert_eq!(opt_mut_ref.cloned(), Some(2u32));

// Immutable ref works
assert_eq!(opt_ref.clone(), Some(&val1));
assert_eq!(opt_ref.cloned(), Some(1u32));

// Double Immutable ref works
assert_eq!(opt_ref_ref.clone(), Some(&val1_ref));
assert_eq!(opt_ref_ref.clone().cloned(), Some(&val1));
assert_eq!(opt_ref_ref.cloned().cloned(), Some(1u32));
}

0 comments on commit 9702fb9

Please sign in to comment.