7#ifndef PXR_BASE_VT_VISIT_VALUE_H
8#define PXR_BASE_VT_VISIT_VALUE_H
12#include "pxr/base/vt/value.h"
14PXR_NAMESPACE_OPEN_SCOPE
16namespace Vt_ValueVisitDetail {
22template <
class T,
class Visitor,
class ...Args>
24Visit(
VtValue const &val, Visitor &&visitor,
int, Args &&...args) ->
25 decltype(std::forward<Visitor>(visitor)(
26 val.UncheckedGet<T>(), std::forward<Args>(args)...))
28 return std::forward<Visitor>(visitor)(
29 val.UncheckedGet<T>(), std::forward<Args>(args)...);
32template <
class T,
class Visitor,
class ...Args>
34Visit(
VtValue const &val, Visitor &&visitor,
long, Args &&...args) {
35 return std::forward<Visitor>(visitor)(val, std::forward<Args>(args)...);
108template <
class Visitor,
class ...Args>
109auto VtVisitValue(
VtValue const &value, Visitor &&visitor, Args&&...args)
116#define VT_CASE_FOR_TYPE_INDEX(unused, elem) \
117 case VtGetKnownValueTypeIndex<VT_TYPE(elem)>(): \
118 return Vt_ValueVisitDetail::Visit<VT_TYPE(elem)>( \
119 value, std::forward<Visitor>(visitor), 0, \
120 std::forward<Args>(args)...); \
122VT_FOR_EACH_VALUE_TYPE(VT_CASE_FOR_TYPE_INDEX)
123#undef VT_CASE_FOR_TYPE_INDEX
127 return Vt_ValueVisitDetail::Visit<VtValue>(
128 value, std::forward<Visitor>(visitor), 0,
129 std::forward<Args>(args)...);
183 template <
class T,
class ...>
class Visitor,
184 typename ...TypeArgs,
187auto VtVisitValueType(
VtValue const &value, FnArgs&&...args)
194#define VT_CASE_FOR_TYPE_INDEX(unused, elem) \
195 case VtGetKnownValueTypeIndex<VT_TYPE(elem)>(): \
196 return Visitor<VT_TYPE(elem), TypeArgs...>::Visit( \
197 std::forward<FnArgs>(args)...); \
199VT_FOR_EACH_VALUE_TYPE(VT_CASE_FOR_TYPE_INDEX)
200#undef VT_CASE_FOR_TYPE_INDEX
204 return Visitor<VtValue, TypeArgs...>::Visit(
205 std::forward<FnArgs>(args)...);
238 template <
class T,
template <
class...>
class,
class ...>
class Visitor,
239 template <
class...>
class Tmpl,
240 typename ...TypeArgs,
243auto VtVisitValueType(
VtValue const &value, FnArgs&&...args)
250#define VT_CASE_FOR_TYPE_INDEX(unused, elem) \
251 case VtGetKnownValueTypeIndex<VT_TYPE(elem)>(): \
252 return Visitor<VT_TYPE(elem), Tmpl, TypeArgs...>::Visit( \
253 std::forward<FnArgs>(args)...); \
255VT_FOR_EACH_VALUE_TYPE(VT_CASE_FOR_TYPE_INDEX)
256#undef VT_CASE_FOR_TYPE_INDEX
260 return Visitor<VtValue, Tmpl, TypeArgs...>::Visit(
261 std::forward<FnArgs>(args)...);
265PXR_NAMESPACE_CLOSE_SCOPE
Provides a container which may hold any type, and provides introspection and iteration over array typ...
int GetKnownValueTypeIndex() const
Return VtKnownValueTypeIndex<T> for the held type T.