12#ifndef OPENVDB_TYPELIST_HAS_BEEN_INCLUDED
13#define OPENVDB_TYPELIST_HAS_BEEN_INCLUDED
26template<
typename... Ts>
struct TypeList;
28namespace typelist_internal {
43template<
typename ListT,
size_t Idx,
typename =
void>
struct TSGetElementImpl;
48template<
typename... Ts,
size_t Idx>
49struct TSGetElementImpl<TypeList<Ts...>, Idx,
50 typename
std::enable_if<(Idx < sizeof...(Ts) && sizeof...(Ts))>::type> {
51 using type =
typename std::tuple_element<Idx, std::tuple<Ts...>>::type;
58template<
typename... Ts,
size_t Idx>
59struct TSGetElementImpl<TypeList<Ts...>, Idx,
60 typename
std::enable_if<!(Idx < sizeof...(Ts) && sizeof...(Ts))>::type> {
61 using type = NullType;
77template <
typename ListT,
typename T,
size_t=0>
85template <
typename T,
size_t Idx>
86struct TSHasTypeImpl<TypeList<>, T, Idx> {
87 static constexpr bool Value =
false;
88 static constexpr int64_t
Index = -1;
98template <
typename U,
typename T,
typename... Ts,
size_t Idx>
99struct TSHasTypeImpl<TypeList<U, Ts...>, T, Idx> :
100 TSHasTypeImpl<TypeList<Ts...>, T, Idx+1> {};
107template <
typename T,
typename... Ts,
size_t Idx>
108struct TSHasTypeImpl<TypeList<T, Ts...>, T, Idx>
110 static constexpr bool Value =
true;
111 static constexpr int64_t
Index =
static_cast<int64_t
>(Idx);
120template <
typename U,
typename ListT,
121 bool ListContainsType = TSHasTypeImpl<ListT, U>::Value>
122struct TSAppendUniqueImpl;
128template <
typename U,
typename... Ts>
129struct TSAppendUniqueImpl<U, TypeList<Ts...>, true> {
131 using RemovedU =
typename TypeList<Ts...>::template Remove<U>;
143 using type =
typename TypeList<U>::template Append<RemovedU>;
150template <
typename U,
typename... Ts>
151struct TSAppendUniqueImpl<U, TypeList<Ts...>, false> {
152 using type = TypeList<U, Ts...>;
165template <
typename... Ts>
166struct TSRecurseAppendUniqueImpl;
170struct TSRecurseAppendUniqueImpl<> {
171 using type = TypeList<>;
178template <
typename... Ts,
typename... OtherTs>
179struct TSRecurseAppendUniqueImpl<TypeList<Ts...>, OtherTs...> {
180 using type =
typename TSRecurseAppendUniqueImpl<OtherTs..., Ts...>::type;
188template <
typename U,
typename... Ts>
189struct TSRecurseAppendUniqueImpl<U, Ts...>
191 using type =
typename TSAppendUniqueImpl<U,
192 typename TSRecurseAppendUniqueImpl<Ts...>::type
201template<
typename ListT,
typename... Ts>
struct TSAppendImpl;
207template<
typename... Ts,
typename... OtherTs>
208struct TSAppendImpl<TypeList<Ts...>, OtherTs...> {
209 using type = TypeList<Ts..., OtherTs...>;
216template<
typename... Ts,
typename... OtherTs>
217struct TSAppendImpl<TypeList<Ts...>, TypeList<OtherTs...>> {
218 using type = TypeList<Ts..., OtherTs...>;
226template<
typename ListT,
typename T>
struct TSEraseImpl;
231struct TSEraseImpl<TypeList<>, T> {
using type = TypeList<>; };
238template<
typename... Ts,
typename T>
239struct TSEraseImpl<TypeList<T, Ts...>, T> {
240 using type =
typename TSEraseImpl<TypeList<Ts...>, T>::type;
249template<
typename T2,
typename... Ts,
typename T>
250struct TSEraseImpl<TypeList<T2, Ts...>, T> {
251 using type =
typename TSAppendImpl<TypeList<T2>,
252 typename TSEraseImpl<TypeList<Ts...>, T>::type>::type;
261template<
typename ListT,
typename... Ts>
struct TSRemoveImpl;
265template<
typename ListT>
266struct TSRemoveImpl<ListT> {
using type = ListT; };
273template<
typename ListT,
typename T,
typename... Ts>
274struct TSRemoveImpl<ListT, T, Ts...> {
275 using type =
typename TSRemoveImpl<typename TSEraseImpl<ListT, T>::type, Ts...>::type;
283template<
typename ListT,
typename... Ts>
284struct TSRemoveImpl<ListT, TypeList<Ts...>> {
285 using type =
typename TSRemoveImpl<ListT, Ts...>::type;
293struct TSRemoveFirstImpl {
294 using type = TypeList<>;
301template<
typename T,
typename... Ts>
302struct TSRemoveFirstImpl<TypeList<T, Ts...>> {
303 using type = TypeList<Ts...>;
312struct TSRemoveLastImpl {
using type = TypeList<>; };
321struct TSRemoveLastImpl<TypeList<T>> : TSRemoveLastImpl<T> {};
329template<
typename T,
typename... Ts>
330struct TSRemoveLastImpl<TypeList<T, Ts...>>
333 typename TypeList<T>::template
334 Append<
typename TSRemoveLastImpl<TypeList<Ts...>>::type>;
350template<
typename ListT,
size_t First,
size_t Last,
size_t Idx=0>
351struct TSRemoveIndicesImpl;
357template<
size_t First,
size_t Last,
size_t Idx>
358struct TSRemoveIndicesImpl<TypeList<>, First, Last, Idx> {
359 using type = TypeList<>;
367template<
typename T,
size_t First,
size_t Last,
size_t Idx>
368struct TSRemoveIndicesImpl<TypeList<T>, First, Last, Idx>
371 static constexpr bool Remove = Idx >= First && Idx <= Last;
373 using type =
typename std::conditional<Remove, TypeList<>, TypeList<T>>::type;
388template<
typename T,
typename... Ts,
size_t First,
size_t Last,
size_t Idx>
389struct TSRemoveIndicesImpl<TypeList<T, Ts...>, First, Last, Idx>
392 using ThisList =
typename TSRemoveIndicesImpl<TypeList<T>, First, Last, Idx>::type;
393 using NextList =
typename TSRemoveIndicesImpl<TypeList<Ts...>, First, Last, Idx+1>::type;
395 using type =
typename ThisList::template Append<NextList>;
405template<
template <
typename>
class OpT,
typename... Ts>
struct TSTranformImpl;
409template<
template <
typename>
class OpT>
410struct TSTranformImpl<OpT> {
411 using type = TypeList<>;
418template<
template <
typename>
class OpT,
typename T,
typename... Ts>
419struct TSTranformImpl<OpT, T, Ts...> {
421 using NextList =
typename TSTranformImpl<OpT, Ts...>::type;
425 using type =
typename TSTranformImpl<OpT>::type::template
426 Append<OpT<T>>::template
431template<
typename OpT>
inline void TSForEachImpl(OpT) {}
432template<
typename OpT,
typename T,
typename... Ts>
433inline void TSForEachImpl(OpT op) { op(T()); TSForEachImpl<OpT, Ts...>(op); }
435template<
template <
typename>
class OpT>
inline void TSForEachImpl() {}
436template<
template <
typename>
class OpT,
typename T,
typename... Ts>
437inline void TSForEachImpl() { OpT<T>()(); TSForEachImpl<OpT, Ts...>(); }
445template<
typename OpT,
typename BaseT,
typename T,
typename ...Ts>
446struct TSApplyImpl {
static bool apply(BaseT&, OpT&) {
return false; } };
456template<
typename OpT,
typename BaseT,
typename T,
typename ...Ts>
457struct TSApplyImpl<OpT, BaseT, TypeList<T, Ts...>>
460 typename std::conditional<std::is_const<BaseT>::value,
const T, T>::type;
462 static bool apply(BaseT& obj, OpT& op)
464 if (obj.template isType<T>()) {
465 op(
static_cast<CastT&
>(obj));
468 return TSApplyImpl<OpT, BaseT, TypeList<Ts...>>::apply(obj, op);
482template<
typename... Ts>
489 static constexpr size_t Size =
sizeof...(Ts);
494 using Get =
typename typelist_internal::TSGetElementImpl<Self, N>::type;
511 static constexpr bool Contains = typelist_internal::TSHasTypeImpl<Self, T>::Value;
527 static constexpr int64_t
Index = typelist_internal::TSHasTypeImpl<Self, T>::Index;
541 template<
typename ListT = TypeList<>>
542 using Unique =
typename typelist_internal::TSRecurseAppendUniqueImpl<ListT, Ts...>::type;
559 template<
typename... TypesToAppend>
560 using Append =
typename typelist_internal::TSAppendImpl<
Self, TypesToAppend...>::type;
572 template<
typename... TypesToRemove>
573 using Remove =
typename typelist_internal::TSRemoveImpl<
Self, TypesToRemove...>::type;
588 using PopFront =
typename typelist_internal::TSRemoveFirstImpl<Self>::type;
603 using PopBack =
typename typelist_internal::TSRemoveLastImpl<Self>::type;
619 template <
size_t First,
size_t Last>
620 using RemoveByIndex =
typename typelist_internal::TSRemoveIndicesImpl<Self, First, Last>::type;
639 template<
template <
typename>
class OpT>
640 using Transform =
typename typelist_internal::TSTranformImpl<OpT, Ts...>::type;
659 template<
template <
typename>
class OpT>
660 static void foreach() { typelist_internal::TSForEachImpl<OpT, Ts...>(); }
682 template<
typename OpT>
683 static void foreach(OpT op) { typelist_internal::TSForEachImpl<OpT, Ts...>(op); }
720 template<
typename OpT,
typename BaseT>
721 static bool apply(OpT op, BaseT& obj) {
722 return typelist_internal::TSApplyImpl<OpT, BaseT, Self>::apply(obj, op);
Index32 Index
Definition Types.h:54
Definition Exceptions.h:13
A list of types (not necessarily unique)
Definition TypeList.h:484
typename typelist_internal::TSRemoveImpl< Self, TypesToRemove... >::type Remove
Remove all occurrences of one or more types, or the members of another TypeList, from this list.
Definition TypeList.h:573
Get< 0 > Front
Definition TypeList.h:495
Get< Size-1 > Back
Definition TypeList.h:496
typename typelist_internal::TSGetElementImpl< Self, N >::type Get
Access a particular element of this type list. If the index is out of range, typelist_internal::NullT...
Definition TypeList.h:494
typename typelist_internal::TSRemoveIndicesImpl< Self, First, Last >::type RemoveByIndex
Return a new list with types removed by their location within the list. If First is equal to Last,...
Definition TypeList.h:620
typename typelist_internal::TSRecurseAppendUniqueImpl< ListT, Ts... >::type Unique
Remove any duplicate types from this TypeList by rotating the next valid type left (maintains the ord...
Definition TypeList.h:542
typename typelist_internal::TSRemoveFirstImpl< Self >::type PopFront
Remove the first element of this type list. Has no effect if the type list is already empty.
Definition TypeList.h:588
typename typelist_internal::TSTranformImpl< OpT, Ts... >::type Transform
Transform each type of this TypeList, rebuiling a new list of converted types. This method instantiat...
Definition TypeList.h:640
static bool apply(OpT op, BaseT &obj)
Invoke a templated, unary functor on a provide obj of type BaseT only if said object is an applicable...
Definition TypeList.h:721
typename typelist_internal::TSRemoveLastImpl< Self >::type PopBack
Remove the last element of this type list. Has no effect if the type list is already empty.
Definition TypeList.h:603
typename typelist_internal::TSAppendImpl< Self, TypesToAppend... >::type Append
Append types, or the members of another TypeList, to this list.
Definition TypeList.h:560
#define OPENVDB_VERSION_NAME
The version namespace name for this library version.
Definition version.h.in:121
#define OPENVDB_USE_VERSION_NAMESPACE
Definition version.h.in:212