10 #ifndef INCLUDED_IMATHTYPETRAITS_H
11 #define INCLUDED_IMATHTYPETRAITS_H
13 #include <type_traits>
17 IMATH_INTERNAL_NAMESPACE_HEADER_ENTER
20 #if (IMATH_CPLUSPLUS_VERSION >= 14)
24 template <
bool B,
class T =
void>
30 #define IMATH_ENABLE_IF(...) \
31 IMATH_INTERNAL_NAMESPACE::enable_if_t<(__VA_ARGS__), int> = 0
33 #if IMATH_FOREIGN_VECTOR_INTEROP
79 template <
typename T,
typename Base>
struct has_xy
90 static Yes& test (
int);
93 template <
typename C>
static No& test (...);
99 (
sizeof (test<T> (0)) ==
sizeof (Yes) &&
100 sizeof (
T) == 2 *
sizeof (Base))
107 template <
typename T,
typename Base>
struct has_xyz
119 static Yes& test (
int);
122 template <
typename C>
static No& test (...);
128 (
sizeof (test<T> (0)) ==
sizeof (Yes) &&
129 sizeof (
T) == 3 *
sizeof (Base))
136 template <
typename T,
typename Base>
struct has_xyzw
149 static Yes& test (
int);
152 template <
typename C>
static No& test (...);
158 (
sizeof (test<T> (0)) ==
sizeof (Yes) &&
159 sizeof (
T) == 4 *
sizeof (Base))
166 template <
typename T,
typename Base,
int Nelem>
struct has_subscript
176 typename std::decay<decltype (C {}[0])>::
type,
181 template <
typename C>
static No&
test (...);
187 (
sizeof (test<T> (0)) ==
sizeof (
Yes) &&
188 sizeof (
T) == Nelem *
sizeof (Base))
193 template <
typename Base,
int Nelem>
194 struct has_subscript<Base[Nelem], Base, Nelem> :
public std::true_type
200 template <
typename T,
typename Base,
int Rows,
int Cols>
201 struct has_double_subscript
211 typename std::decay<decltype (C {}[0][0])>::
type,
216 template <
typename C>
static No&
test (...);
222 (
sizeof (test<T> (0)) ==
sizeof (
Yes) &&
223 sizeof (
T) == (Rows * Cols) *
sizeof (Base))
228 template <
typename Base,
int Rows,
int Cols>
229 struct has_double_subscript<Base[Rows][Cols], Base, Rows, Cols>
230 :
public std::true_type
237 IMATH_INTERNAL_NAMESPACE_HEADER_EXIT
239 #endif // INCLUDED_IMATHTYPETRAITS_H
typename std::enable_if< B, T >::type enable_if_t
Define Imath::enable_if_t to be std for C++14, equivalent for C++11.
cvex test(vector P=0;int unbound=3;export float s=0;export vector Cf=0;)
GLsizei const GLfloat * value
has_subscript<T>::value is true if T has a subscript operator.
GLint GLint GLsizei GLint GLenum GLenum type
#define IMATH_ENABLE_IF(...)