35 #ifndef IE_CORE_RUNTIMETYPED_H
36 #define IE_CORE_RUNTIMETYPED_H
38 #include "IECore/Export.h"
39 #include "IECore/RefCounted.h"
40 #include "IECore/TypeIds.h"
48 #include "tbb/spin_rw_mutex.h"
53 #define IE_CORE_DECLARETYPEFNS( TYPENAME )\
54 IECore::TypeId typeId() const override { return TYPENAME ## TypeId; };\
55 const char *typeName() const override { return #TYPENAME; };\
56 static IECore::TypeId staticTypeId() { return TYPENAME ## TypeId; };\
57 static const char *staticTypeName() { return #TYPENAME; };\
58 static IECore::TypeId baseTypeId() { return BaseClass::staticTypeId(); };\
59 static const char *baseTypeName() { return BaseClass::staticTypeName(); };
61 #define IE_CORE_DECLAREEXTENSIONTYPEFNS( TYPENAME, TYPEID )\
62 IECore::TypeId typeId() const override { return IECore::TypeId(TYPEID); };\
63 const char *typeName() const override { return #TYPENAME; };\
64 static IECore::TypeId staticTypeId() { return IECore::TypeId(TYPEID); };\
65 static const char *staticTypeName() { return #TYPENAME; };\
66 static IECore::TypeId baseTypeId() { return BaseClass::staticTypeId(); };\
67 static const char *baseTypeName() { return BaseClass::staticTypeName(); };
69 #define IE_CORE_DECLARETYPEISINSTANCEFUNCTIONS() \
70 bool isInstanceOf( IECore::TypeId typeId ) const override { return typeId==staticTypeId() ? true : BaseClass::isInstanceOf( typeId ); }; \
71 bool isInstanceOf( const char *typeName ) const override { return !strcmp( typeName, staticTypeName() ) ? true : BaseClass::isInstanceOf( typeName ); }; \
73 #define IE_CORE_DECLAREINHERITSFROMFUNCTIONS() \
74 static bool inheritsFrom( IECore::TypeId typeId ) { return BaseClass::staticTypeId()==typeId ? true : BaseClass::inheritsFrom( typeId ); }; \
75 static bool inheritsFrom( const char *typeName ) { return !strcmp(BaseClass::staticTypeName(), typeName ) ? true : BaseClass::inheritsFrom( typeName ); } \
77 #define IE_CORE_DECLARERUNTIMETYPEDDESCRIPTION( TYPE ) \
79 static const IECore::RunTimeTyped::TypeDescription<TYPE> g_typeDescription;\
82 #define IE_CORE_DEFINERUNTIMETYPEDDESCRIPTION( TYPE ) \
83 const IECore::RunTimeTyped::TypeDescription<TYPE> TYPE::g_typeDescription;
85 #define IE_CORE_DEFINERUNTIMETYPED( TYPE ) \
86 IE_CORE_DEFINERUNTIMETYPEDDESCRIPTION( TYPE )
92 #define IE_CORE_DECLARERUNTIMETYPED( TYPE, BASETYPE )\
93 typedef BASETYPE BaseClass;\
94 IE_CORE_DECLAREMEMBERPTR( TYPE )\
95 IE_CORE_DECLARETYPEFNS( TYPE )\
96 IE_CORE_DECLARETYPEISINSTANCEFUNCTIONS()\
97 IE_CORE_DECLAREINHERITSFROMFUNCTIONS()\
98 IE_CORE_DECLARERUNTIMETYPEDDESCRIPTION( TYPE ) \
106 #define IE_CORE_DECLARERUNTIMETYPEDEXTENSION( TYPE, TYPEID, BASETYPE )\
107 typedef BASETYPE BaseClass; \
108 IE_CORE_DECLAREMEMBERPTR( TYPE ) \
109 IE_CORE_DECLAREEXTENSIONTYPEFNS( TYPE, TYPEID )\
110 IE_CORE_DECLARETYPEISINSTANCEFUNCTIONS()\
111 IE_CORE_DECLAREINHERITSFROMFUNCTIONS()\
112 IE_CORE_DECLARERUNTIMETYPEDDESCRIPTION( TYPE )
116 #define IECORE_RUNTIMETYPED_DECLARETEMPLATE( TYPENAME, BASETYPENAME ) \
117 IE_CORE_DECLAREMEMBERPTR( TYPENAME ) \
118 IECore::TypeId typeId() const override; \
119 const char *typeName() const override; \
120 static IECore::TypeId staticTypeId(); \
121 static const char *staticTypeName(); \
122 static IECore::TypeId baseTypeId(); \
123 static const char *baseTypeName(); \
124 bool isInstanceOf( IECore::TypeId typeId ) const override; \
125 bool isInstanceOf( const char *typeName ) const override; \
126 static bool inheritsFrom( IECore::TypeId typeId ); \
127 static bool inheritsFrom( const char *typeName ); \
128 typedef BASETYPENAME BaseClass; \
130 #define IECORE_RUNTIMETYPED_DEFINETEMPLATESPECIALISATION( TYPENAME, TYPEID ) \
135 template<> IECORE_API \
136 IECore::TypeId TYPENAME::typeId() const \
138 return IECore::TypeId( TYPEID ); \
140 template<> IECORE_API \
141 IECore::TypeId TYPENAME::staticTypeId() \
143 return IECore::TypeId( TYPEID ); \
145 template<> IECORE_API \
146 const char *TYPENAME::typeName() const \
150 template<> IECORE_API \
151 const char *TYPENAME::staticTypeName() \
156 template<> IECORE_API \
157 IECore::TypeId TYPENAME::baseTypeId() \
159 return BaseClass::staticTypeId(); \
162 template<> IECORE_API \
163 const char *TYPENAME::baseTypeName() \
165 return BaseClass::staticTypeName(); \
168 template<> IECORE_API \
169 bool TYPENAME::isInstanceOf( IECore::TypeId typeId ) const \
171 if( typeId==staticTypeId() ) \
175 return BaseClass::isInstanceOf( typeId ); \
178 template<> IECORE_API \
179 bool TYPENAME::isInstanceOf( const char *typeName ) const \
181 if( !strcmp( typeName, staticTypeName() ) ) \
185 return BaseClass::isInstanceOf( typeName ); \
188 template<> IECORE_API \
189 bool TYPENAME::inheritsFrom( IECore::TypeId typeId ) \
191 return BaseClass::staticTypeId()==typeId ? true : BaseClass::inheritsFrom( typeId ); \
194 template<> IECORE_API \
195 bool TYPENAME::inheritsFrom( const char *typeName ) \
197 return !strcmp( BaseClass::staticTypeName(), typeName ) ? true : BaseClass::inheritsFrom( typeName ); \
200 class IECORE_API RunTimeTyped :
public RefCounted
235 virtual TypeId typeId()
const;
238 virtual const char *typeName()
const;
241 static TypeId staticTypeId();
243 static const char *staticTypeName();
247 static TypeId baseTypeId();
251 static const char *baseTypeName();
255 virtual bool isInstanceOf(
TypeId typeId )
const;
258 virtual bool isInstanceOf(
const char *typeName )
const;
261 static bool inheritsFrom(
TypeId typeId );
263 static bool inheritsFrom(
const char *typeName );
265 static bool inheritsFrom(
TypeId type,
TypeId baseType );
267 static bool inheritsFrom(
const char *typeName,
const char *baseTypeName );
277 static const std::vector<TypeId> &baseTypeIds(
TypeId typeId );
282 static const std::set<TypeId> &derivedTypeIds(
TypeId typeId );
287 static TypeId typeIdFromTypeName(
const char *typeName );
291 static const char *typeNameFromTypeId(
TypeId typeId );
294 static void registerType(
TypeId derivedTypeId,
const char *derivedTypeName,
TypeId baseTypeId );
300 struct TypeDescription
305 typedef std::map< TypeId, TypeId > BaseTypeRegistryMap;
306 typedef std::map< TypeId, std::vector<TypeId> > BaseTypesRegistryMap;
307 typedef std::map< TypeId, std::set< TypeId > > DerivedTypesRegistryMap;
309 typedef tbb::spin_rw_mutex Mutex;
311 static Mutex g_baseTypeIdsMutex;
312 static Mutex g_derivedTypeIdsMutex;
314 static BaseTypeRegistryMap &baseTypeRegistry();
315 static DerivedTypesRegistryMap &derivedTypesRegistry();
317 static BaseTypesRegistryMap &completeBaseTypesRegistry();
318 static DerivedTypesRegistryMap &completeDerivedTypesRegistry();
320 static void derivedTypeIdsWalk(
TypeId typeId, std::set<TypeId> & );
322 typedef std::map<TypeId, std::string> TypeIdsToTypeNamesMap;
323 typedef std::map<std::string, TypeId> TypeNamesToTypeIdsMap;
325 static TypeIdsToTypeNamesMap &typeIdsToTypeNames();
326 static TypeNamesToTypeIdsMap &typeNamesToTypeIds();
330 IE_CORE_DECLAREPTR( RunTimeTyped );
335 template<
typename T,
typename S>
336 boost::intrusive_ptr<T>
runTimeCast(
const boost::intrusive_ptr<S> &src );
340 template<
typename T,
typename S>
347 template<
typename T,
typename S>
348 inline boost::intrusive_ptr<T>
assertedStaticCast(
const boost::intrusive_ptr<T> &src );
353 template<
typename T,
typename S>
358 #include "IECore/RunTimeTyped.inl"
360 #endif // IE_CORE_RUNTIMETYPED_H
boost::intrusive_ptr< T > runTimeCast(const boost::intrusive_ptr< S > &src)
RefCounted BaseClass
A typedef for the class this class derives from. All RunTimeTyped classes define this typedef...
Definition: RunTimeTyped.h:216
boost::intrusive_ptr< T > assertedStaticCast(const boost::intrusive_ptr< T > &src)
TypeId
Definition: TypeIds.h:46
Definition: RefCounted.h:124
Definition: RunTimeTyped.h:211
This namespace contains all components of the core library.
Definition: AddSmoothSkinningInfluencesOp.h:43