]> git.lizzy.rs Git - rust.git/commitdiff
implement cloned for Option
authorAlexis Beingessner <a.beingessner@gmail.com>
Fri, 7 Nov 2014 19:05:50 +0000 (14:05 -0500)
committerAlexis Beingessner <a.beingessner@gmail.com>
Sun, 16 Nov 2014 15:39:03 +0000 (10:39 -0500)
src/libcore/option.rs
src/libcoretest/option.rs

index d41dbb11adb198cc0fe905bc56905cfe07e097f5..5ae1060dd292f69aef18d5223ddce6ec92b75ede 100644 (file)
 use result::{Result, Ok, Err};
 use slice;
 use slice::AsSlice;
+use clone::Clone;
 
 // 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
@@ -676,6 +677,14 @@ pub fn take(&mut self) -> 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>.
+    #[unstable = "recently added as part of collections reform"]
+    pub fn cloned(self) -> Option<T> {
+        self.map(|t| t.clone())
+    }
+}
+
 impl<T: Default> Option<T> {
     /// Returns the contained value or a default
     ///
index 18444fc424082d4d56e4a44dd109b089b0b3733c..6138986e1d185fea67b4460e8ee66c46a7b2c040 100644 (file)
@@ -11,6 +11,7 @@
 use core::option::*;
 use core::kinds::marker;
 use core::mem;
+use core::clone::Clone;
 
 #[test]
 fn test_get_ptr() {
@@ -239,3 +240,15 @@ fn test_collect() {
 
     assert!(v == None);
 }
+
+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);
+}
\ No newline at end of file