OpenVDB  10.0.1
Public Types | Static Public Member Functions | Static Public Attributes | List of all members
TypeList< Ts > Struct Template Reference

A list of types (not necessarily unique) More...

#include <openvdb/TypeList.h>

Public Types

using Self = TypeList
 The type of this list. More...
 
template<size_t N>
using Get = typename typelist_internal::TSGetElementImpl< Self, N >::type
 Access a particular element of this type list. If the index is out of range, typelist_internal::NullType is returned. More...
 
using Front = Get< 0 >
 
using Back = Get< Size-1 >
 
template<typename ListT = TypeList<>>
using Unique = typename typelist_internal::TSRecurseAppendUniqueImpl< ListT, Ts... >::type
 Remove any duplicate types from this TypeList by rotating the next valid type left (maintains the order of other types). Optionally combine the result with another TypeList. More...
 
template<typename... TypesToAppend>
using Append = typename typelist_internal::TSAppendImpl< Self, TypesToAppend... >::type
 Append types, or the members of another TypeList, to this list. More...
 
template<typename... TypesToRemove>
using Remove = typename typelist_internal::TSRemoveImpl< Self, TypesToRemove... >::type
 Remove all occurrences of one or more types, or the members of another TypeList, from this list. More...
 
using PopFront = typename typelist_internal::TSRemoveFirstImpl< Self >::type
 Remove the first element of this type list. Has no effect if the type list is already empty. More...
 
using PopBack = typename typelist_internal::TSRemoveLastImpl< Self >::type
 Remove the last element of this type list. Has no effect if the type list is already empty. More...
 
template<size_t First, size_t Last>
using RemoveByIndex = typename typelist_internal::TSRemoveIndicesImpl< Self, First, Last >::type
 Return a new list with types removed by their location within the list. If First is equal to Last, a single element is removed (if it exists). If First is greater than Last, the list remains unmodified. More...
 
template<template< typename > class OpT>
using Transform = typename typelist_internal::TSTranformImpl< OpT, Ts... >::type
 Transform each type of this TypeList, rebuiling a new list of converted types. This method instantiates a user provided Opt<T> to replace each type in the current list. More...
 

Static Public Member Functions

template<template< typename > class OpT>
static void foreach ()
 Invoke a templated class operator on each type in this list. Use this method if you only need access to the type for static methods. More...
 
template<typename OpT >
static void foreach (OpT op)
 Invoke a templated, unary functor on a value of each type in this list. More...
 
template<typename OpT , typename BaseT >
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 (derived) type also contained in the current TypeList. More...
 

Static Public Attributes

static constexpr size_t Size = sizeof...(Ts)
 The number of types in the type list. More...
 
template<typename T >
static constexpr bool Contains = typelist_internal::TSHasTypeImpl<Self, T>::Value
 True if this list contains the given type, false otherwise. More...
 
template<typename T >
static constexpr int64_t Index = typelist_internal::TSHasTypeImpl<Self, T>::Index
 Returns the index of the first found element of the given type, -1 if no matching element exists. More...
 

Detailed Description

template<typename... Ts>
struct openvdb::v10_0::TypeList< Ts >

A list of types (not necessarily unique)

Example:

Member Typedef Documentation

using Append = typename typelist_internal::TSAppendImpl<Self, TypesToAppend...>::type

Append types, or the members of another TypeList, to this list.

Warning
Appending nested TypeList<> objects causes them to expand to their contained list of types.

Example:

{
using NumericTypes = IntTypes::Append<RealTypes>;
}
{
using NumericTypes = IntTypes::Append<float>::Append<double>;
}
using Back = Get<Size-1>
using Front = Get<0>
using Get = typename typelist_internal::TSGetElementImpl<Self, N>::type

Access a particular element of this type list. If the index is out of range, typelist_internal::NullType is returned.

using PopBack = typename typelist_internal::TSRemoveLastImpl<Self>::type

Remove the last element of this type list. Has no effect if the type list is already empty.

Example:

{
using EmptyTypes = openvdb::TypeList<>;
}
{
IntTypes::PopBack; // openvdb::TypeList<Int16, Int32>;
EmptyTypes::PopBack; // openvdb::TypeList<>;
}
using PopFront = typename typelist_internal::TSRemoveFirstImpl<Self>::type

Remove the first element of this type list. Has no effect if the type list is already empty.

Example:

{
using EmptyTypes = openvdb::TypeList<>;
}
{
IntTypes::PopFront; // openvdb::TypeList<Int32, Int64>;
EmptyTypes::PopFront; // openvdb::TypeList<>;
}
using Remove = typename typelist_internal::TSRemoveImpl<Self, TypesToRemove...>::type

Remove all occurrences of one or more types, or the members of another TypeList, from this list.

Example:

{
using ShortTypes = NumericTypes::Remove<LongTypes>; // float, Int16, Int32
}
using RemoveByIndex = typename typelist_internal::TSRemoveIndicesImpl<Self, First, Last>::type

Return a new list with types removed by their location within the list. If First is equal to Last, a single element is removed (if it exists). If First is greater than Last, the list remains unmodified.

Example:

{
}
{
using IntTypes = NumericTypes::RemoveByIndex<0,1>; // openvdb::TypeList<Int16, Int32, Int64>;
using RealTypes = NumericTypes::RemoveByIndex<2,4>; // openvdb::TypeList<float, double>;
using RemoveFloat = NumericTypes::RemoveByIndex<0,0>; // openvdb::TypeList<double, Int16, Int32, Int64>;
}
using Self = TypeList

The type of this list.

using Transform = typename typelist_internal::TSTranformImpl<OpT, Ts...>::type

Transform each type of this TypeList, rebuiling a new list of converted types. This method instantiates a user provided Opt<T> to replace each type in the current list.

Warning
Transforming types to new TypeList<> objects causes them to expand to their contained list of types.

Example:

{
// Templated type decl, where the type T will be subsituted for each type
// in the TypeList being transformed.
template <typename T>
using ConvertedType = typename openvdb::PromoteType<T>::Next;
// Results in: openvdb::TypeList<Int64, double>;
using PromotedType = openvdb::TypeList<Int32, float>::Transform<ConvertedType>;
}
using Unique = typename typelist_internal::TSRecurseAppendUniqueImpl<ListT, Ts...>::type

Remove any duplicate types from this TypeList by rotating the next valid type left (maintains the order of other types). Optionally combine the result with another TypeList.

Example:

{
}
{
using UniqueTypes = Types::Unique<>; // <Int16, Int32, float, Int64>
}

Member Function Documentation

static bool apply ( OpT  op,
BaseT &  obj 
)
inlinestatic

Invoke a templated, unary functor on a provide obj of type BaseT only if said object is an applicable (derived) type also contained in the current TypeList.

This method loops over every type in the type list and calls an interface method on obj to check to see if the obj is interpretable as the given type. If it is, the method static casts obj to the type, invokes the provided functor with the casted type and returns, stopping further list iteration. obj is expected to supply an interface to validate the type which satisfies the prototype:

template <typename T> bool isType()

A full example (using dynamic_cast - see Grid/Tree implementations for string based comparisons:

struct Base {
virtual ~Base() = default;
template<typename T> bool isType() { return dynamic_cast<const T*>(this); }
};
struct MyType1 : public Base { void print() { std::cerr << "MyType1" << std::endl; } };
struct MyType2 : public Base { void print() { std::cerr << "MyType2" << std::endl; } };
using MyTypeList = TypeList<MyType1, MyType2>;
Base* getObj() { return new MyType2(); }
std::unique_ptr<Base> obj = getObj();
// Returns 'true', prints 'MyType2'
const bool success =
MyTypeList::apply([](const auto& type) { type.print(); }, *obj);
Note
The functor object is passed by value. Wrap it with std::ref pass by reference.
static void foreach ( )
inlinestatic

Invoke a templated class operator on each type in this list. Use this method if you only need access to the type for static methods.

Example:

#include <typeinfo>
template <typename T>
struct PintTypes() {
inline void operator()() { std::cout << typeid(T).name() << std::endl; }
};
MyTypes::foreach<PintTypes>(); // "i, f, d" (exact output is compiler-dependent)
Note
OpT must be a templated class. It is created and invoked for each type in this list.
static void foreach ( OpT  op)
inlinestatic

Invoke a templated, unary functor on a value of each type in this list.

Example:

#include <typeinfo>
template<typename ListT>
void printTypeList()
{
std::string sep;
auto op = [&](auto x) { // C++14
std::cout << sep << typeid(decltype(x)).name(); sep = ", "; };
}
printTypeList<MyTypes>(); // "i, f, d" (exact output is compiler-dependent)
Note
The functor object is passed by value. Wrap it with std::ref to use the same object for each type.

Member Data Documentation

constexpr bool Contains = typelist_internal::TSHasTypeImpl<Self, T>::Value
static

True if this list contains the given type, false otherwise.

Example:

constexpr int64_t Index = typelist_internal::TSHasTypeImpl<Self, T>::Index
static

Returns the index of the first found element of the given type, -1 if no matching element exists.

Example:

{
}
{
const int64_t L1 = openvdb::TypeList<IntTypes>::Index<Int32>; // 1
const int64_t L2 = openvdb::TypeList<RealTypes>::Index<Int32>; // -1
}
constexpr size_t Size = sizeof...(Ts)
static

The number of types in the type list.