Loading...
Searching...
No Matches
instantiateType.h
1//
2// Copyright 2016 Pixar
3//
4// Licensed under the Apache License, Version 2.0 (the "Apache License")
5// with the following modification; you may not use this file except in
6// compliance with the Apache License and the following modification to it:
7// Section 6. Trademarks. is deleted and replaced with:
8//
9// 6. Trademarks. This License does not grant permission to use the trade
10// names, trademarks, service marks, or product names of the Licensor
11// and its affiliates, except as required to comply with Section 4(c) of
12// the License and to reproduce the content of the NOTICE file.
13//
14// You may obtain a copy of the Apache License at
15//
16// http://www.apache.org/licenses/LICENSE-2.0
17//
18// Unless required by applicable law or agreed to in writing, software
19// distributed under the Apache License with the above modification is
20// distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
21// KIND, either express or implied. See the Apache License for the specific
22// language governing permissions and limitations under the Apache License.
23//
24/*
25 * This header is not meant to be included in a .h file.
26 * Complain if we see this header twice through.
27 */
28
29#ifdef PXR_BASE_TF_INSTANTIATE_TYPE_H
30#error This file should only be included once in any given source (.cpp) file.
31#endif
32
33#define PXR_BASE_TF_INSTANTIATE_TYPE_H
34
35#include "pxr/pxr.h"
37#include "pxr/base/tf/type.h"
38#include "pxr/base/tf/refPtr.h"
39
40PXR_NAMESPACE_OPEN_SCOPE
41
42template <typename T, bool AS_REF_PTR>
43struct Tf_TypeFactoryType {
44 struct FactoryType : public TfType::FactoryBase {
45 TfRefPtr<T> New() { return T::New(); }
46 };
47};
48template <class T>
49struct TfTest_RefPtrFactory {
50};
51
52template <typename T>
53struct Tf_TypeFactoryType<T, false> {
54 struct FactoryType : public TfType::FactoryBase {
55 T* New() { return new T; }
56 };
57};
58
59// Make the type actually manufacturable.
60template <typename T, bool MANUFACTURABLE>
61struct Tf_MakeTypeManufacturable {
62 static void Doit(TfType t) {
63 typedef typename Tf_TypeFactoryType<T, TF_SUPPORTS_REFPTR(T)>::FactoryType FT;
64 t.SetFactory<FT>();
65 }
66};
67
68// Don't make it manufacturable.
69template <typename T>
70struct Tf_MakeTypeManufacturable<T, false> {
71 static void Doit(TfType) {
72 }
73};
74
75#define _TF_REMOVE_PARENS_HELPER(...) __VA_ARGS__
76#define _TF_REMOVE_PARENS(parens) _TF_REMOVE_PARENS_HELPER parens
77
78#define TF_NO_PARENT() (TfType::Bases<>)
79#define TF_1_PARENT(p1) (TfType::Bases<p1 >)
80#define TF_2_PARENT(p1,p2) (TfType::Bases<p1, p2 >)
81#define TF_INSTANTIATE_TYPE(Type, flags, Bases) \
82 TF_REGISTRY_DEFINE_WITH_TYPE(TfType, Type) { \
83 TfType t1 = TfType::Define<Type, _TF_REMOVE_PARENS(Bases) >(); \
84 Tf_MakeTypeManufacturable<Type, (flags&TfType::MANUFACTURABLE)!=0 >::Doit(t1); \
85 }
86
87PXR_NAMESPACE_CLOSE_SCOPE
Define function attributes.
Reference-counted smart pointer utility class.
Definition: refPtr.h:601
Base class of all factory types.
Definition: type.h:73
TfType represents a dynamic runtime type.
Definition: type.h:65
TF_API void SetFactory(std::unique_ptr< FactoryBase > factory) const
Sets the factory object for this type.
Reference counting.