38 template <
size_t... VALUES>
41 static_assert(
sizeof...(VALUES) == 0,
"CVB: no empty alternative lists");
44 template <
size_t VALUE>
45 struct MaxImpl<VALUE> : SizeT<VALUE>
49 template <
size_t VALUE0,
size_t VALUE1,
size_t... REST>
50 struct MaxImpl<VALUE0, VALUE1, REST...>
52 static const constexpr size_t value =
53 VALUE1 < VALUE0 ? MaxImpl<VALUE0, REST...>::value : MaxImpl<VALUE1, REST...>::value;
59 template <
size_t... VALUES>
60 static const constexpr size_t Max = MaxImpl<VALUES...>::value;
70 template <
bool... VALUES>
74 struct NoneIsImpl<> : BoolT<true>
79 struct NoneIsImpl<VALUE> : BoolT<!VALUE>
83 template <
bool VALUE,
bool... REST>
84 struct NoneIsImpl<VALUE, REST...> : BoolT<!VALUE && NoneIsImpl<REST...>::value>
90 template <
bool... VALUES>
91 static const constexpr bool NoneIs = NoneIsImpl<VALUES...>::value;
101 struct CappedIncrement : SizeT<V + 1>
106 struct CappedIncrement<size_t(-1)> : SizeT<size_t(-1)>
111 template <
class T,
class... REST>
115 struct IndexOfImpl<T> : SizeT<size_t(-1)>
119 template <
class T,
class... REST>
120 struct IndexOfImpl<T, T, REST...> : SizeT<0>
124 template <
class T,
class U,
class... REST>
125 struct IndexOfImpl<T, U, REST...> : SizeT<CappedIncrement<IndexOfImpl<T, REST...>::value>::value>
132 template <
class T,
class... TS>
133 static const constexpr size_t IndexOf =
134 IndexOfImpl<typename std::remove_cv<typename std::remove_reference<T>::type>::type, TS...>::value;
137 template <
class T,
class... TS>
138 static const constexpr bool Contains = BoolT<IndexOf<T, TS...> != size_t(-1)>::value;
142#pragma region IndexOfAssignable
148 template <
class T,
class... REST>
149 struct IndexOfAssignableImpl;
152 struct IndexOfAssignableImpl<T> : SizeT<size_t(-1)>
156 template <
class T,
class U,
class... REST>
157 struct IndexOfAssignableImpl<T, U, REST...>
159 static const constexpr size_t value =
167 template <
class T,
class... TS>
168 static const constexpr size_t IndexOfAssignable = IndexOfAssignableImpl<T, TS...>::value;
178 template <
size_t I,
class... TS>
181 template <
class T,
class... TS>
182 struct TypeAtImpl<0, T, TS...>
187 template <
size_t I,
class T,
class... TS>
188 struct TypeAtImpl<I, T, TS...>
190 using type =
typename TypeAtImpl<I - 1, TS...>::type;
196 template <
size_t I,
class... TS>
197 using TypeAt =
typename TypeAtImpl<I, TS...>::type;
201#pragma region VariantDestructor
204 struct VariantDestructor
207#pragma warning(disable : 4100)
210 void operator()(T &value)
const noexcept
219#pragma region VariantCopier
228 explicit VariantCopier(
void *data) noexcept
236 void operator()(
const T &value)
const
238 new (data_) T(value);
244#pragma region VariantMover
253 explicit VariantMover(
void *data) noexcept
261 void operator()(T &&value)
const
269#pragma region VariantEqual
278 explicit VariantEqual(
const void *data) noexcept
286 bool operator()(
const T &value)
const noexcept
288 return *
reinterpret_cast<const T *
>(data_) == value;
294#pragma region VariantLess
303 explicit VariantLess(
const void *data) noexcept
311 bool operator()(
const T &rhs)
const noexcept
313 return *
reinterpret_cast<const T *
>(lhs_) < rhs;