[llvm] r354214 - [NFC] Better encapsulation of llvm::Optional Storage

Serge Guelton via llvm-commits llvm-commits at lists.llvm.org
Sun Feb 17 05:12:42 PST 2019


Author: serge_sans_paille
Date: Sun Feb 17 05:12:42 2019
New Revision: 354214

URL: http://llvm.org/viewvc/llvm-project?rev=354214&view=rev
Log:
[NFC] Better encapsulation of llvm::Optional Storage

Modified:
    llvm/trunk/include/llvm/ADT/Optional.h

Modified: llvm/trunk/include/llvm/ADT/Optional.h
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/ADT/Optional.h?rev=354214&r1=354213&r2=354214&view=diff
==============================================================================
--- llvm/trunk/include/llvm/ADT/Optional.h (original)
+++ llvm/trunk/include/llvm/ADT/Optional.h Sun Feb 17 05:12:42 2019
@@ -30,10 +30,12 @@ class raw_ostream;
 
 namespace optional_detail {
 /// Storage for any type.
-template <typename T, bool = is_trivially_copyable<T>::value> struct OptionalStorage {
+template <typename T, bool = is_trivially_copyable<T>::value>
+class OptionalStorage {
   AlignedCharArrayUnion<T> storage;
   bool hasVal = false;
 
+public:
   OptionalStorage() = default;
 
   OptionalStorage(const T &y) : hasVal(true) { new (storage.buffer) T(y); }
@@ -107,6 +109,14 @@ template <typename T, bool = is_triviall
     assert(hasVal);
     return reinterpret_cast<const T *>(storage.buffer);
   }
+
+  template <typename... ArgTypes> void emplace(ArgTypes &&... Args) {
+    reset();
+    hasVal = true;
+    new (storage.buffer) T(std::forward<ArgTypes>(Args)...);
+  }
+
+  bool hasValue() const { return hasVal; }
 };
 
 } // namespace optional_detail
@@ -134,9 +144,7 @@ public:
 
   /// Create a new object by constructing it in place with the given arguments.
   template <typename... ArgTypes> void emplace(ArgTypes &&... Args) {
-    reset();
-    Storage.hasVal = true;
-    new (getPointer()) T(std::forward<ArgTypes>(Args)...);
+    Storage.emplace(std::forward<ArgTypes>(Args)...);
   }
 
   static inline Optional create(const T *y) {
@@ -151,19 +159,13 @@ public:
 
   void reset() { Storage.reset(); }
 
-  const T *getPointer() const {
-    assert(Storage.hasVal);
-    return reinterpret_cast<const T *>(Storage.storage.buffer);
-  }
-  T *getPointer() {
-    assert(Storage.hasVal);
-    return reinterpret_cast<T *>(Storage.storage.buffer);
-  }
+  const T *getPointer() const { return Storage.getPointer(); }
+  T *getPointer() { return Storage.getPointer(); }
   const T &getValue() const LLVM_LVALUE_FUNCTION { return *getPointer(); }
   T &getValue() LLVM_LVALUE_FUNCTION { return *getPointer(); }
 
-  explicit operator bool() const { return Storage.hasVal; }
-  bool hasValue() const { return Storage.hasVal; }
+  explicit operator bool() const { return hasValue(); }
+  bool hasValue() const { return Storage.hasValue(); }
   const T *operator->() const { return getPointer(); }
   T *operator->() { return getPointer(); }
   const T &operator*() const LLVM_LVALUE_FUNCTION { return *getPointer(); }




More information about the llvm-commits mailing list