clang attribute wrappers
[folly.git] / folly / Optional.h
index 9947fd4adf05a864ef149e80da30e4f5982946e5..1832009054bb3a42ea71981837083dc20f7e15d7 100644 (file)
@@ -91,12 +91,14 @@ class OptionalEmptyException : public std::runtime_error {
 template<class Value>
 class Optional {
  public:
+  typedef Value value_type;
+
   static_assert(!std::is_reference<Value>::value,
                 "Optional may not be used with reference types");
   static_assert(!std::is_abstract<Value>::value,
                 "Optional may not be used with abstract types");
 
-  Optional()
+  Optional() noexcept
     : hasValue_(false) {
   }
 
@@ -211,18 +213,24 @@ class Optional {
     }
   }
 
-  const Value& value() const {
+  const Value& value() const& {
     require_value();
     return value_;
   }
 
-  Value& value() {
+  Value& value() {
     require_value();
     return value_;
   }
 
-  Value* get_pointer() { return hasValue_ ? &value_ : nullptr; }
-  const Value* get_pointer() const { return hasValue_ ? &value_ : nullptr; }
+  Value value() && {
+    require_value();
+    return std::move(value_);
+  }
+
+  const Value* get_pointer() const&  { return hasValue_ ? &value_ : nullptr; }
+        Value* get_pointer()      &  { return hasValue_ ? &value_ : nullptr; }
+        Value* get_pointer()      && = delete;
 
   bool hasValue() const { return hasValue_; }
 
@@ -230,8 +238,9 @@ class Optional {
     return hasValue();
   }
 
-  const Value& operator*() const { return value(); }
-        Value& operator*()       { return value(); }
+  const Value& operator*() const&  { return value(); }
+        Value& operator*()      &  { return value(); }
+        Value  operator*()      && { return std::move(value()); }
 
   const Value* operator->() const { return &value(); }
         Value* operator->()       { return &value(); }