@@ -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