about summary refs log tree commit diff
diff options
context:
space:
mode:
authorClar Charr <clar@charr.xyz>2018-05-08 21:30:38 -0400
committerClar Charr <clar@charr.xyz>2018-05-15 12:49:31 -0400
commit8ab2d15f6753054797c88f07028e4802c43b70ab (patch)
treed4f96192fc0a39b412dc4da697e615c7d65b7479
parentb183bd0ad40b0188fc242bfb9f68a0cf1704dbd9 (diff)
downloadrust-8ab2d15f6753054797c88f07028e4802c43b70ab.tar.gz
rust-8ab2d15f6753054797c88f07028e4802c43b70ab.zip
Add Option::xor method
-rw-r--r--src/libcore/option.rs36
1 files changed, 36 insertions, 0 deletions
diff --git a/src/libcore/option.rs b/src/libcore/option.rs
index 0dfdabee031..28f37f72d6f 100644
--- a/src/libcore/option.rs
+++ b/src/libcore/option.rs
@@ -705,6 +705,42 @@ impl<T> Option<T> {
         }
     }
 
+    /// Returns [`Some`] if exactly one of `self`, `optb` is [`Some`], otherwise returns `None`.
+    ///
+    /// [`Some`]: #variant.Some
+    /// [`None`]: #variant.None
+    ///
+    /// # Examples
+    ///
+    /// ```
+    /// #![feature(option_xor)]
+    ///
+    /// let x = Some(2);
+    /// let y: Option<u32> = None;
+    /// assert_eq!(x.xor(y), Some(2));
+    ///
+    /// let x: Option<u32> = None;
+    /// let y = Some(2);
+    /// assert_eq!(x.xor(y), Some(2));
+    ///
+    /// let x = Some(2);
+    /// let y = Some(2);
+    /// assert_eq!(x.xor(y), None);
+    ///
+    /// let x: Option<u32> = None;
+    /// let y: Option<u32> = None;
+    /// assert_eq!(x.xor(y), None);
+    /// ```
+    #[inline]
+    #[unstable(feature = "option_xor", issue = "50512")]
+    pub fn xor(self, optb: Option<T>) -> Option<T> {
+        match (self, optb) {
+            (Some(a), None) => Some(a),
+            (None, Some(b)) => Some(b),
+            _ => None,
+        }
+    }
+
     /////////////////////////////////////////////////////////////////////////
     // Entry-like operations to insert if None and return a reference
     /////////////////////////////////////////////////////////////////////////