5#ifndef V8_BASE_DISCRIMINATED_UNION_H_
6#define V8_BASE_DISCRIMINATED_UNION_H_
39template <
typename TagEnum,
typename... Ts>
44 static_assert((std::is_trivially_destructible_v<Ts> && ...));
61 static_assert(index <
sizeof...(Ts));
62 static_assert(index < std::numeric_limits<uint8_t>::max());
66 new (
data_)
T(std::forward<T>(data));
73 static_assert(index <
sizeof...(Ts));
74 static_assert(index < std::numeric_limits<uint8_t>::max());
76 new (
data_)
T(std::forward<T>(data));
83 constexpr const auto&
get()
const {
86 return *
reinterpret_cast<const T*
>(
data_);
91 constexpr auto&
get() {
94 return *
reinterpret_cast<T*
>(
data_);
99 constexpr const auto&
get()
const {
101 return *
reinterpret_cast<const T*
>(
data_);
105 template <
typename T>
108 return *
reinterpret_cast<T*
>(
data_);
112 alignas(std::max({
alignof(Ts)...}))
char data_[std::max({
sizeof(Ts)...})];
113 static_assert(
sizeof...(Ts) <= std::numeric_limits<uint8_t>::max());
constexpr DiscriminatedUnion(T &&data) V8_NOEXCEPT
constexpr const auto & get() const
char data_[std::max({sizeof(Ts)...})]
DiscriminatedUnion & operator=(DiscriminatedUnion &&other) V8_NOEXCEPT=default
DiscriminatedUnion & operator=(const DiscriminatedUnion &other) V8_NOEXCEPT=default
constexpr DiscriminatedUnion(Tag tag, T &&data) V8_NOEXCEPT
DiscriminatedUnion(DiscriminatedUnion &&other) V8_NOEXCEPT=default
constexpr Tag tag() const
DiscriminatedUnion(const DiscriminatedUnion &other) V8_NOEXCEPT=default
constexpr size_t index_of_type_v
typename detail::nth_type< N, T... >::type nth_type_t
#define DCHECK_EQ(v1, v2)