Chromium Code Reviews| Index: Source/wtf/Optional.h |
| diff --git a/Source/wtf/Optional.h b/Source/wtf/Optional.h |
| index 0b453b53415a240799a8f0957fd869b2c0e5f7a3..264b45ed616936fddd1284997a7c3ff21520e711 100644 |
| --- a/Source/wtf/Optional.h |
| +++ b/Source/wtf/Optional.h |
| @@ -32,34 +32,31 @@ template <typename T> |
| class Optional { |
| WTF_MAKE_NONCOPYABLE(Optional); |
| public: |
| - Optional() : m_engaged(false) { } |
| + Optional() : m_ptr(nullptr) { } |
| ~Optional() |
| { |
| - if (m_engaged) |
| - storage()->~T(); |
| + if (m_ptr) |
| + m_ptr->~T(); |
| } |
| - typedef bool Optional::*UnspecifiedBoolType; |
| - operator UnspecifiedBoolType() const { return m_engaged ? &Optional::m_engaged : nullptr; } |
| + typedef T* Optional::*UnspecifiedBoolType; |
| + operator UnspecifiedBoolType() const { return m_ptr ? &Optional::m_ptr : nullptr; } |
|
esprehn
2015/06/02 22:13:08
This doesn't need the branch in it, you can just r
jbroman
2015/06/02 23:40:17
This is the pattern used in OwnPtr::operator Unspe
esprehn
2015/06/02 23:57:08
Right, just return a void* or something. Having a
|
| - T& operator*() { ASSERT(m_engaged); return *storage(); } |
| - const T& operator*() const { ASSERT(m_engaged); return *storage(); } |
| - T* operator->() { ASSERT(m_engaged); return storage(); } |
| - const T* operator->() const { ASSERT(m_engaged); return storage(); } |
| + 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; } |
| template <typename... Args> |
| void emplace(Args&&... args) |
| { |
| - ASSERT(!m_engaged); |
| - new (storage()) T(forward<Args>(args)...); |
| - m_engaged = true; |
| + RELEASE_ASSERT(!m_ptr); |
| + m_ptr = reinterpret_cast_ptr<T*>(&m_storage.buffer); |
| + new (m_ptr) T(forward<Args>(args)...); |
| } |
| private: |
| - T* storage() { return reinterpret_cast_ptr<T*>(&m_storage.buffer); } |
| - const T* storage() const { return reinterpret_cast_ptr<const T*>(&m_storage.buffer); } |
| - |
| - bool m_engaged; |
| + T* m_ptr; |
| AlignedBuffer<sizeof(T), WTF_ALIGN_OF(T)> m_storage; |
| }; |