8#ifndef PXR_BASE_TF_META_H
9#define PXR_BASE_TF_META_H
19PXR_NAMESPACE_OPEN_SCOPE
22template <
class... Args>
struct TfMetaList {};
25template<
template <
class...>
class Cls,
class List>
26struct Tf_MetaApplyImpl;
28template<
template <
class...>
class Cls,
class... Args>
29struct Tf_MetaApplyImpl<Cls, TfMetaList<Args...>>
31 using Type = Cls<Args...>;
35template <
template <
class...>
class Cls,
class TypeList>
36using TfMetaApply =
typename Tf_MetaApplyImpl<Cls, TypeList>::Type;
39template <
class Head,
class...>
40using TfMetaHead = Head;
43template <
class Head,
class... Tail>
44using TfMetaTail = TfMetaList<Tail...>;
46template <
class L1,
class L2>
47struct Tf_MetaConcatImpl;
49template <
class... A1s,
class... A2s>
50struct Tf_MetaConcatImpl<TfMetaList<A1s...>, TfMetaList<A2s...>>
52 using Type = TfMetaList<A1s..., A2s...>;
57template <
class L1,
class L2>
58using TfMetaConcat =
typename Tf_MetaConcatImpl<L1, L2>::Type;
63using TfMetaDecay = TfMetaList<std::decay_t<Ts>...>;
68using TfMetaLength = std::integral_constant<size_t,
sizeof...(Xs)>;
71template <
bool Condition>
72struct Tf_ConditionalImpl {
73 template <
class T,
class>
78struct Tf_ConditionalImpl<false> {
79 template <
class,
class F>
85template <
bool Cond,
class T,
class F>
86using TfConditionalType =
87 typename Tf_ConditionalImpl<Cond>::template Type<T, F>;
89PXR_NAMESPACE_CLOSE_SCOPE