| // Copyright 2014 The Chromium Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #ifndef Nullable_h |
| #define Nullable_h |
| |
| #include "platform/heap/Handle.h" |
| #include "wtf/Assertions.h" |
| |
| namespace blink { |
| |
| enum class UnionTypeConversionMode { |
| Nullable, |
| NotNullable, |
| }; |
| |
| template <typename T> |
| class Nullable { |
| DISALLOW_NEW(); |
| |
| public: |
| Nullable() : m_value(), m_isNull(true) {} |
| |
| Nullable(std::nullptr_t) : m_value(), m_isNull(true) {} |
| |
| Nullable(const T& value) : m_value(value), m_isNull(false) {} |
| |
| Nullable(const Nullable& other) |
| : m_value(other.m_value), m_isNull(other.m_isNull) {} |
| |
| Nullable& operator=(const Nullable& other) { |
| m_value = other.m_value; |
| m_isNull = other.m_isNull; |
| return *this; |
| } |
| |
| Nullable& operator=(std::nullptr_t) { |
| m_value = T(); |
| m_isNull = true; |
| return *this; |
| } |
| |
| void set(const T& value) { |
| m_value = value; |
| m_isNull = false; |
| } |
| |
| void set(std::nullptr_t) { |
| m_value = T(); |
| m_isNull = true; |
| } |
| |
| const T& get() const { |
| ASSERT(!m_isNull); |
| return m_value; |
| } |
| T& get() { |
| ASSERT(!m_isNull); |
| return m_value; |
| } |
| bool isNull() const { return m_isNull; } |
| |
| explicit operator bool() const { return !m_isNull; } |
| |
| bool operator==(const Nullable& other) const { |
| return (m_isNull && other.m_isNull) || |
| (!m_isNull && !other.m_isNull && m_value == other.m_value); |
| } |
| |
| DEFINE_INLINE_TRACE() { TraceIfNeeded<T>::trace(visitor, m_value); } |
| |
| private: |
| T m_value; |
| bool m_isNull; |
| }; |
| |
| } // namespace blink |
| |
| #endif // Nullable_h |