Chromium Code Reviews| Index: third_party/WebKit/Source/wtf/Optional.h |
| diff --git a/third_party/WebKit/Source/wtf/Optional.h b/third_party/WebKit/Source/wtf/Optional.h |
| index a28bd804308c3e218f80c575ac77cabae5448102..dbe1141ed592f815a815edad8acbae794616c0e3 100644 |
| --- a/third_party/WebKit/Source/wtf/Optional.h |
| +++ b/third_party/WebKit/Source/wtf/Optional.h |
| @@ -5,68 +5,15 @@ |
| #ifndef Optional_h |
| #define Optional_h |
| -#include "wtf/Alignment.h" |
| -#include "wtf/Allocator.h" |
| -#include "wtf/Assertions.h" |
| -#include "wtf/Noncopyable.h" |
| -#include "wtf/StdLibExtras.h" |
| - |
| -#include <new> |
| -#include <utility> |
| +#include "base/optional.h" |
| namespace WTF { |
| -// This is a lightweight template similar to std::experimental::optional. |
| -// It currently does not support assignment, swapping, comparison, etc. |
| -// |
| -// Use this instead of OwnPtr for cases where you only want to conditionally |
| -// construct a "scope" object. |
| -// |
| -// Example: |
| -// Optional<DrawingRecorder> recorder; |
| -// if (shouldDraw) |
| -// recorder.emplace(constructor, args, here); |
| -// // recorder destroyed at end of scope |
| -// |
| -// It can be used in WTF::Vector. |
| -// |
| -// Note in particular that unlike a pointer, though, dereferencing a const |
| -// optional yields a const reference. |
| - |
| +// See base/optional.h for documentation. |
| template <typename T> |
| -class Optional final { |
| - DISALLOW_NEW_EXCEPT_PLACEMENT_NEW(); |
| - WTF_MAKE_NONCOPYABLE(Optional); |
| -public: |
| - Optional() : m_ptr(nullptr) { } |
| - ~Optional() |
| - { |
| - if (m_ptr) |
| - m_ptr->~T(); |
| - } |
| - |
| - typedef T* Optional::*UnspecifiedBoolType; |
| - operator UnspecifiedBoolType() const { return m_ptr ? &Optional::m_ptr : nullptr; } |
| - |
| - T& operator*() { ASSERT_WITH_SECURITY_IMPLICATION(m_ptr); return *m_ptr; } |
| - const T& operator*() const { ASSERT_WITH_SECURITY_IMPLICATION(m_ptr); return *m_ptr; } |
| - T* operator->() { ASSERT_WITH_SECURITY_IMPLICATION(m_ptr); return m_ptr; } |
| - const T* operator->() const { ASSERT_WITH_SECURITY_IMPLICATION(m_ptr); return m_ptr; } |
| - T* get() { return m_ptr; } |
| - const T* get() const { return m_ptr; } |
| - |
| - template <typename... Args> |
| - void emplace(Args&&... args) |
| - { |
| - RELEASE_ASSERT(!m_ptr); |
| - m_ptr = reinterpret_cast_ptr<T*>(&m_storage.buffer); |
| - new (m_ptr) T(std::forward<Args>(args)...); |
| - } |
| - |
| -private: |
| - T* m_ptr; |
| - AlignedBuffer<sizeof(T), WTF_ALIGN_OF(T)> m_storage; |
| -}; |
| +using Optional = base::Optional<T>; |
| +constexpr base::nullopt_t nullopt(0); |
|
jbroman
2016/04/19 20:19:17
nit: I'd prefer " = base::nullopt" (and similar be
danakj
2016/04/19 20:28:49
Oh, yes good idea, I didn't like this either. Done
|
| +constexpr base::in_place_t in_place = {}; |
| } // namespace WTF |