Add a T&& constructor to llvm::Optional.
authorJordan Rose <jordan_rose@apple.com>
Thu, 18 Oct 2012 22:22:55 +0000 (22:22 +0000)
committerJordan Rose <jordan_rose@apple.com>
Thu, 18 Oct 2012 22:22:55 +0000 (22:22 +0000)
This allows llvm::Optional to be used with movable-but-not-copyable types.
While LLVM itself is still C++03, there's no reason why tools built on
top of it can't use C++11 features.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@166241 91177308-0d34-0410-b5e6-96231b3b80d8

include/llvm/ADT/Optional.h

index ee8b69f3d12fde3ecf2181e5fe5716059f79efbc..ffef8d91b3077d7666388e743c3378f2d02c43e2 100644 (file)
 #ifndef LLVM_ADT_OPTIONAL
 #define LLVM_ADT_OPTIONAL
 
 #ifndef LLVM_ADT_OPTIONAL
 #define LLVM_ADT_OPTIONAL
 
+#include "LLVM/Support/Compiler.h"
 #include <cassert>
 
 #include <cassert>
 
+#if LLVM_USE_RVALUE_REFERENCES
+#include <utility>
+#endif
+
 namespace llvm {
 
 template<typename T>
 namespace llvm {
 
 template<typename T>
@@ -28,6 +33,10 @@ public:
   explicit Optional() : x(), hasVal(false) {}
   Optional(const T &y) : x(y), hasVal(true) {}
 
   explicit Optional() : x(), hasVal(false) {}
   Optional(const T &y) : x(y), hasVal(true) {}
 
+#if LLVM_USE_RVALUE_REFERENCES
+  Optional(T &&y) : x(std::forward<T>(y)), hasVal(true) {}
+#endif
+
   static inline Optional create(const T* y) {
     return y ? Optional(*y) : Optional();
   }
   static inline Optional create(const T* y) {
     return y ? Optional(*y) : Optional();
   }