@@ -393,36 +393,40 @@ inline constexpr TypeDesc TypeUstringhash(TypeDesc::USTRINGHASH);
393393// / A template mechanism for getting the a base type from C type
394394// /
395395template <typename T> struct BaseTypeFromC {};
396- template <> struct BaseTypeFromC <unsigned char > { static const TypeDesc::BASETYPE value = TypeDesc::UINT8; };
397- template <> struct BaseTypeFromC <char > { static const TypeDesc::BASETYPE value = TypeDesc::INT8; };
398- template <> struct BaseTypeFromC <uint16_t > { static const TypeDesc::BASETYPE value = TypeDesc::UINT16; };
399- template <> struct BaseTypeFromC <int16_t > { static const TypeDesc::BASETYPE value = TypeDesc::INT16; };
400- template <> struct BaseTypeFromC <uint32_t > { static const TypeDesc::BASETYPE value = TypeDesc::UINT; };
401- template <> struct BaseTypeFromC <int32_t > { static const TypeDesc::BASETYPE value = TypeDesc::INT; };
402- template <> struct BaseTypeFromC <uint64_t > { static const TypeDesc::BASETYPE value = TypeDesc::UINT64; };
403- template <> struct BaseTypeFromC <int64_t > { static const TypeDesc::BASETYPE value = TypeDesc::INT64; };
396+ template <> struct BaseTypeFromC <unsigned char > { static constexpr TypeDesc::BASETYPE value = TypeDesc::UINT8; };
397+ template <> struct BaseTypeFromC <char > { static constexpr TypeDesc::BASETYPE value = TypeDesc::INT8; };
398+ template <> struct BaseTypeFromC <uint16_t > { static constexpr TypeDesc::BASETYPE value = TypeDesc::UINT16; };
399+ template <> struct BaseTypeFromC <int16_t > { static constexpr TypeDesc::BASETYPE value = TypeDesc::INT16; };
400+ template <> struct BaseTypeFromC <uint32_t > { static constexpr TypeDesc::BASETYPE value = TypeDesc::UINT; };
401+ template <> struct BaseTypeFromC <int32_t > { static constexpr TypeDesc::BASETYPE value = TypeDesc::INT; };
402+ template <> struct BaseTypeFromC <uint64_t > { static constexpr TypeDesc::BASETYPE value = TypeDesc::UINT64; };
403+ template <> struct BaseTypeFromC <int64_t > { static constexpr TypeDesc::BASETYPE value = TypeDesc::INT64; };
404404#if defined(__GNUC__) && __WORDSIZE == 64 && !(defined(__APPLE__) && defined(__MACH__))
405405// Some platforms consider int64_t and long long to be different types, even
406406// though they are actually the same size.
407407static_assert (!std::is_same_v<unsigned long long , uint64_t >);
408408static_assert (!std::is_same_v<long long , int64_t >);
409- template <> struct BaseTypeFromC <unsigned long long > { static const TypeDesc::BASETYPE value = TypeDesc::UINT64; };
410- template <> struct BaseTypeFromC <long long > { static const TypeDesc::BASETYPE value = TypeDesc::INT64; };
409+ template <> struct BaseTypeFromC <unsigned long long > { static constexpr TypeDesc::BASETYPE value = TypeDesc::UINT64; };
410+ template <> struct BaseTypeFromC <long long > { static constexpr TypeDesc::BASETYPE value = TypeDesc::INT64; };
411411#endif
412412#if defined(_HALF_H_) || defined(IMATH_HALF_H_)
413- template <> struct BaseTypeFromC <half> { static const TypeDesc::BASETYPE value = TypeDesc::HALF; };
413+ template <> struct BaseTypeFromC <half> { static constexpr TypeDesc::BASETYPE value = TypeDesc::HALF; };
414414#endif
415- template <> struct BaseTypeFromC <float > { static const TypeDesc::BASETYPE value = TypeDesc::FLOAT; };
416- template <> struct BaseTypeFromC <double > { static const TypeDesc::BASETYPE value = TypeDesc::DOUBLE; };
417- template <> struct BaseTypeFromC <const char *> { static const TypeDesc::BASETYPE value = TypeDesc::STRING; };
418- template <> struct BaseTypeFromC <char *> { static const TypeDesc::BASETYPE value = TypeDesc::STRING; };
419- template <> struct BaseTypeFromC <std::string> { static const TypeDesc::BASETYPE value = TypeDesc::STRING; };
420- template <> struct BaseTypeFromC <string_view> { static const TypeDesc::BASETYPE value = TypeDesc::STRING; };
415+ template <> struct BaseTypeFromC <float > { static constexpr TypeDesc::BASETYPE value = TypeDesc::FLOAT; };
416+ template <> struct BaseTypeFromC <double > { static constexpr TypeDesc::BASETYPE value = TypeDesc::DOUBLE; };
417+ template <> struct BaseTypeFromC <const char *> { static constexpr TypeDesc::BASETYPE value = TypeDesc::STRING; };
418+ template <> struct BaseTypeFromC <char *> { static constexpr TypeDesc::BASETYPE value = TypeDesc::STRING; };
419+ template <> struct BaseTypeFromC <std::string> { static constexpr TypeDesc::BASETYPE value = TypeDesc::STRING; };
420+ template <> struct BaseTypeFromC <string_view> { static constexpr TypeDesc::BASETYPE value = TypeDesc::STRING; };
421421class ustring ;
422- template <> struct BaseTypeFromC <ustring> { static const TypeDesc::BASETYPE value = TypeDesc::STRING; };
423- template <size_t S> struct BaseTypeFromC <char [S]> { static const TypeDesc::BASETYPE value = TypeDesc::STRING; };
424- template <size_t S> struct BaseTypeFromC <const char [S]> { static const TypeDesc::BASETYPE value = TypeDesc::STRING; };
425- template <typename P> struct BaseTypeFromC <P*> { static const TypeDesc::BASETYPE value = TypeDesc::PTR; };
422+ template <> struct BaseTypeFromC <ustring> { static constexpr TypeDesc::BASETYPE value = TypeDesc::STRING; };
423+ template <size_t S> struct BaseTypeFromC <char [S]> { static constexpr TypeDesc::BASETYPE value = TypeDesc::STRING; };
424+ template <size_t S> struct BaseTypeFromC <const char [S]> { static constexpr TypeDesc::BASETYPE value = TypeDesc::STRING; };
425+ template <typename P> struct BaseTypeFromC <P*> { static constexpr TypeDesc::BASETYPE value = TypeDesc::PTR; };
426+
427+ // / `BaseTypeFromC_v<T>` is shorthand for `BaseTypeFromC<T>::value()`.
428+ template <typename T>
429+ constexpr TypeDesc::BASETYPE BaseTypeFromC_v = BaseTypeFromC<std::remove_cv_t <T>>::value();
426430
427431// / A template mechanism for getting the TypeDesc from a C type.
428432// / The default for simple types is just the TypeDesc based on BaseTypeFromC.
@@ -468,6 +472,9 @@ template<> struct TypeDescFromC<Imath::Box3f> { static const constexpr TypeDesc
468472template <> struct TypeDescFromC <Imath::Box3i> { static const constexpr TypeDesc value () { return TypeBox3i; } };
469473#endif
470474
475+ // / `TypeDescFromC_v<T>` is shorthand for `TypeDescFromC<T>::value()`.
476+ template <typename T>
477+ constexpr TypeDesc TypeDescFromC_v = TypeDescFromC<std::remove_cv_t <T>>::value();
471478
472479class ustringhash ; // forward declaration
473480
0 commit comments