24#ifndef PXR_BASE_VT_TRAITS_H
25#define PXR_BASE_VT_TRAITS_H
30#include "pxr/base/vt/api.h"
33#include <boost/type_traits/has_trivial_assign.hpp>
37PXR_NAMESPACE_OPEN_SCOPE
50struct VtValueTypeHasCheapCopy : boost::has_trivial_assign<T> {};
52#define VT_TYPE_IS_CHEAP_TO_COPY(T) \
53 template <> struct VtValueTypeHasCheapCopy<TF_PP_EAT_PARENS(T)> \
108struct VtTypedValueProxyBase {};
110struct VtIsTypedValueProxy : std::is_base_of<VtTypedValueProxyBase, T> {};
111#define VT_TYPE_IS_TYPED_VALUE_PROXY(T) \
112 template <> struct VtIsTypedValueProxy<TF_PP_EAT_PARENS(T)> \
117 typename std::enable_if<
118 !VtIsTypedValueProxy<T>::value,
int>::type = 0>
120VtGetProxiedObject(T
const &nonProxy) {
126struct VtGetProxiedType
128 using type =
typename std::decay<
129 decltype(VtGetProxiedObject(std::declval<T>()))>::type;
135struct VtErasedValueProxyBase {};
137struct VtIsErasedValueProxy : std::is_base_of<VtErasedValueProxyBase, T> {};
138#define VT_TYPE_IS_ERASED_VALUE_PROXY(T) \
139 template <> struct VtIsErasedValueProxy<TF_PP_EAT_PARENS(T)> \
145struct VtIsValueProxy :
146 std::integral_constant<
147 bool, VtIsTypedValueProxy<T>::value || VtIsErasedValueProxy<T>::value> {};
149PXR_NAMESPACE_CLOSE_SCOPE
Array concept. By default, types are not arrays.