Go to the documentation of this file.
10 #define MRPT_COBJECT_H
57 bool derivedFrom(
const char* pBaseClass_name)
const;
88 #define CLASS_ID(class_name) static_cast<const mrpt::utils::TRuntimeClassId*>(&class_name::class##class_name)
92 #define CLASS_ID_NAMESPACE(class_name,namespaceName) static_cast<const mrpt::utils::TRuntimeClassId*>(&namespaceName::class_name::class##class_name)
96 #define CLASS_ID_TEMPLATE(class_name,T) static_cast<const mrpt::utils::TRuntimeClassId*>(& template <class T> class_name<T>::class##class_name)
99 #define IS_CLASS( ptrObj, class_name ) ((ptrObj)->GetRuntimeClass()==CLASS_ID(class_name))
102 #define IS_DERIVED( ptrObj, class_name ) ((ptrObj)->GetRuntimeClass()->derivedFrom(CLASS_ID(class_name)))
133 virtual CObject *duplicate()
const = 0;
147 #define DEFINE_MRPT_OBJECT_CUSTOM_LINKAGE(class_name, _STATIC_LINKAGE_, _VIRTUAL_LINKAGE_) \
151 _STATIC_LINKAGE_ const mrpt::utils::TRuntimeClassId* _GetBaseClass(); \
152 _STATIC_LINKAGE_ mrpt::utils::CLASSINIT _init_##class_name;\
155 typedef class_name##Ptr SmartPtr; \
156 _STATIC_LINKAGE_ mrpt::utils::TRuntimeClassId class##class_name; \
157 _STATIC_LINKAGE_ const mrpt::utils::TRuntimeClassId *classinfo; \
158 _VIRTUAL_LINKAGE_ const mrpt::utils::TRuntimeClassId* GetRuntimeClass() const MRPT_OVERRIDE; \
159 _STATIC_LINKAGE_ mrpt::utils::CObject* CreateObject(); \
160 _STATIC_LINKAGE_ class_name##Ptr Create(); \
161 _VIRTUAL_LINKAGE_ mrpt::utils::CObject *duplicate() const MRPT_OVERRIDE; \
164 MRPT_MAKE_ALIGNED_OPERATOR_NEW \
167 #define DEFINE_MRPT_OBJECT(class_name) \
168 DEFINE_MRPT_OBJECT_CUSTOM_LINKAGE(class_name, static , virtual )
171 #define DEFINE_MRPT_OBJECT_PRE_CUSTOM_BASE_LINKAGE(class_name, base_name, _LINKAGE_ ) DEFINE_MRPT_OBJECT_PRE_CUSTOM_BASE_LINKAGE2(class_name, base_name, _LINKAGE_ class_name)
172 #define DEFINE_MRPT_OBJECT_POST_CUSTOM_BASE_LINKAGE(class_name, base_name, _LINKAGE_ ) DEFINE_MRPT_OBJECT_POST_CUSTOM_BASE_LINKAGE2(class_name, base_name, _LINKAGE_ class_name)
175 #define DEFINE_MRPT_OBJECT_PRE_CUSTOM_BASE_NO_LINKAGE(class_name, base_name) DEFINE_MRPT_OBJECT_PRE_CUSTOM_BASE_LINKAGE2(class_name, base_name, class_name)
176 #define DEFINE_MRPT_OBJECT_POST_CUSTOM_BASE_NO_LINKAGE(class_name, base_name) DEFINE_MRPT_OBJECT_POST_CUSTOM_BASE_LINKAGE2(class_name, base_name, class_name)
179 #define DEFINE_MRPT_OBJECT_PRE_CUSTOM_BASE_LINKAGE2(class_name, base_name, class_name_LINKAGE_ ) \
180 class class_name_LINKAGE_; \
181 struct class_name_LINKAGE_##Ptr;
184 #define DEFINE_MRPT_OBJECT_POST_CUSTOM_BASE_LINKAGE2(class_name, base_name, class_name_LINKAGE_ ) \
186 struct class_name_LINKAGE_##Ptr : public base_name##Ptr \
188 typedef class_name value_type; \
189 inline class_name##Ptr() : base_name##Ptr(static_cast<base_name*>(NULL)) { } \
190 inline explicit class_name##Ptr(class_name* p) : base_name##Ptr( static_cast<base_name*>(p) ) { } \
191 inline explicit class_name##Ptr(const base_name##Ptr & p) : base_name##Ptr(p) { ASSERTMSG_( p->GetRuntimeClass()->derivedFrom(#class_name),::mrpt::format("Wrong typecasting of smart pointers: %s -> %s",p->GetRuntimeClass()->className, #class_name) ) } \
192 inline explicit class_name##Ptr(const mrpt::utils::CObjectPtr & p) : base_name##Ptr(p) { ASSERTMSG_( p->GetRuntimeClass()->derivedFrom(#class_name),::mrpt::format("Wrong typecasting of smart pointers: %s -> %s",p->GetRuntimeClass()->className, #class_name) ) } \
193 inline void setFromPointerDoNotFreeAtDtor(const class_name* p) { this->set(const_cast<mrpt::utils::CObject*>(static_cast<const mrpt::utils::CObject*>(p))); m_holder->increment(); } \
195 inline class_name * pointer() { return dynamic_cast<class_name*>(base_name##Ptr::pointer()); } \
197 inline const class_name * pointer() const { return dynamic_cast<const class_name*>(base_name##Ptr::pointer()); } \
198 inline class_name* operator ->(void) { return dynamic_cast<class_name*>( base_name##Ptr::operator ->() ); } \
199 inline const class_name* operator ->(void) const { return dynamic_cast<const class_name*>( base_name##Ptr::operator ->() ); } \
200 inline class_name& operator *(void) { return *dynamic_cast<class_name*>( base_name##Ptr::operator ->() ); } \
201 inline const class_name& operator *(void) const { return *dynamic_cast<const class_name*>( base_name##Ptr::operator ->() ); } \
206 #define DEFINE_MRPT_OBJECT_PRE_CUSTOM_LINKAGE(class_name,_LINKAGE_) DEFINE_MRPT_OBJECT_PRE_CUSTOM_LINKAGE2(class_name, _LINKAGE_ class_name)
207 #define DEFINE_MRPT_OBJECT_POST_CUSTOM_LINKAGE(class_name,_LINKAGE_) DEFINE_MRPT_OBJECT_POST_CUSTOM_LINKAGE2(class_name, _LINKAGE_ class_name)
210 #define DEFINE_MRPT_OBJECT_PRE_NO_LINKAGE(class_name) DEFINE_MRPT_OBJECT_PRE_CUSTOM_LINKAGE2(class_name, class_name)
211 #define DEFINE_MRPT_OBJECT_POST_NO_LINKAGE(class_name) DEFINE_MRPT_OBJECT_POST_CUSTOM_LINKAGE2(class_name, class_name)
215 #define DEFINE_MRPT_OBJECT_PRE_CUSTOM_LINKAGE2(class_name,class_name_LINKAGE_) \
216 struct class_name_LINKAGE_##Ptr;
219 #define DEFINE_MRPT_OBJECT_POST_CUSTOM_LINKAGE2(class_name,class_name_LINKAGE_) \
221 struct class_name_LINKAGE_##Ptr : public mrpt::utils::CObjectPtr \
223 inline class_name##Ptr() : mrpt::utils::CObjectPtr(static_cast<mrpt::utils::CObject*>(NULL)) { } \
224 inline explicit class_name##Ptr(class_name* p) : mrpt::utils::CObjectPtr( static_cast<mrpt::utils::CObject*>(p) ) { } \
225 inline explicit class_name##Ptr(const mrpt::utils::CObjectPtr & p) : mrpt::utils::CObjectPtr(p) { ASSERTMSG_( p->GetRuntimeClass()->derivedFrom(#class_name),::mrpt::format("Wrong typecasting of smart pointers: %s -> %s",p->GetRuntimeClass()->className, #class_name) ) } \
226 inline void setFromPointerDoNotFreeAtDtor(const class_name* p) { this->set(const_cast<mrpt::utils::CObject*>(static_cast<const mrpt::utils::CObject*>(p))); m_holder->increment(); } \
228 inline class_name * pointer() { return dynamic_cast<class_name*>(mrpt::utils::CObjectPtr::pointer()); } \
230 inline const class_name * pointer() const { return dynamic_cast<const class_name*>(mrpt::utils::CObjectPtr::pointer()); } \
231 inline class_name* operator ->(void) { return dynamic_cast<class_name*>( mrpt::utils::CObjectPtr::operator ->() ); } \
232 inline const class_name* operator ->(void) const { return dynamic_cast<const class_name*>( mrpt::utils::CObjectPtr::operator ->() ); } \
233 inline class_name& operator *(void) { return *dynamic_cast<class_name*>( mrpt::utils::CObjectPtr::operator ->() ); } \
234 inline const class_name& operator *(void) const { return *dynamic_cast<const class_name*>( mrpt::utils::CObjectPtr::operator ->() ); } \
239 #define DEFINE_MRPT_OBJECT_PRE_CUSTOM_BASE(class_name, base_name) \
240 DEFINE_MRPT_OBJECT_PRE_CUSTOM_BASE_LINKAGE(class_name, base_name, BASE_IMPEXP )
244 #define DEFINE_MRPT_OBJECT_PRE(class_name) DEFINE_MRPT_OBJECT_PRE_CUSTOM_LINKAGE(class_name, BASE_IMPEXP ) // This macro is valid for classes within mrpt-base only.
245 #define DEFINE_MRPT_OBJECT_POST(class_name) DEFINE_MRPT_OBJECT_POST_CUSTOM_LINKAGE(class_name, BASE_IMPEXP ) // This macro is valid for classes within mrpt-base only.
249 #define IMPLEMENTS_MRPT_OBJECT(class_name, base,NameSpace) \
250 mrpt::utils::CObject* NameSpace::class_name::CreateObject() \
251 { return static_cast<mrpt::utils::CObject*>( new NameSpace::class_name ); } \
252 NameSpace::class_name##Ptr NameSpace::class_name::Create() \
253 { return NameSpace::class_name##Ptr( new NameSpace::class_name ); } \
254 const mrpt::utils::TRuntimeClassId* NameSpace::class_name::_GetBaseClass() \
255 { return CLASS_ID(base); } \
256 mrpt::utils::TRuntimeClassId NameSpace::class_name::class##class_name = { \
257 #class_name, NameSpace::class_name::CreateObject, &class_name::_GetBaseClass }; \
258 const mrpt::utils::TRuntimeClassId *NameSpace::class_name::classinfo = & NameSpace::class_name::class##class_name; \
259 const mrpt::utils::TRuntimeClassId* NameSpace::class_name::GetRuntimeClass() const \
260 { return CLASS_ID_NAMESPACE(class_name,NameSpace); } \
261 mrpt::utils::CLASSINIT NameSpace::class_name::_init_##class_name(CLASS_ID(base)); \
262 mrpt::utils::CObject * NameSpace::class_name::duplicate() const \
263 { return static_cast<mrpt::utils::CObject*>( new NameSpace::class_name(*this) ); }
268 #define DEFINE_VIRTUAL_MRPT_OBJECT(class_name) \
272 static const mrpt::utils::TRuntimeClassId* _GetBaseClass(); \
274 static const mrpt::utils::TRuntimeClassId class##class_name; \
275 virtual const mrpt::utils::TRuntimeClassId* GetRuntimeClass() const MRPT_OVERRIDE; \
276 friend class mrpt::utils::CStream; \
282 #define IMPLEMENTS_VIRTUAL_MRPT_OBJECT(class_name, base_class_name,NameSpace) \
283 const mrpt::utils::TRuntimeClassId* class_name::_GetBaseClass() \
284 { return CLASS_ID(base_class_name); } \
285 const mrpt::utils::TRuntimeClassId class_name::class##class_name = { \
286 #class_name, NULL, &class_name::_GetBaseClass }; \
287 const mrpt::utils::TRuntimeClassId* class_name::GetRuntimeClass() const \
288 { return CLASS_ID(class_name); }
300 template <
typename T,
typename C,
typename COUNTER>
306 template <
typename T,
typename C,
typename COUNTER>
bool aliases(const smart_ptr_base< T, C, COUNTER > &) const
CObject * clone() const
Cloning interface for smart pointers.
A smart pointer to a CObject object.
This is the global namespace for all Mobile Robot Programming Toolkit (MRPT) libraries.
Auxiliary structure used for CObject-based RTTI.
std::vector< const mrpt::utils::TRuntimeClassId * > BASE_IMPEXP getAllRegisteredClasses()
Returns a list with all the classes registered in the system through mrpt::utils::registerClass.
CObjectPtr & operator=(const CObjectPtr &r)
static const mrpt::utils::TRuntimeClassId classCObject
const TRuntimeClassId BASE_IMPEXP * findRegisteredClass(const std::string &className)
Return info about a given class by its name, or NULL if the class is not registered.
safe_ptr< TRuntimeClassId > TRuntimeClassIdPtr
A wrapper class for a "TRuntimeClassId *", well-defined with respect to copy operators and constructo...
mrpt::utils::CObjectPtr duplicateGetSmartPtr() const
Returns a copy of the object, indepently of its class, as a smart pointer (the newly created object w...
The virtual base class of all MRPT classes with a unified RTTI system.
#define CLASS_ID(class_name)
Access to runtime class ID for a defined class name.
void BASE_IMPEXP registerClassCustomName(const char *customName, const TRuntimeClassId *pNewClass)
Mostly for internal use within mrpt sources, to handle exceptional cases with multiple serialization ...
CObjectPtr & operator=(const CObject &data)
void BASE_IMPEXP registerClass(const mrpt::utils::TRuntimeClassId *pNewClass)
Register a class into the MRPT internal list of "CSerializable" descendents.
A wrapper class for pointers that can be safely copied with "=" operator without problems.
stlplus::smart_ptr_clone< CObject > BASE
CLASSINIT(const mrpt::utils::TRuntimeClassId *pNewClass)
virtual const mrpt::utils::TRuntimeClassId * GetRuntimeClass() const
Returns information about the class of an object in runtime.
CObjectPtr(const CObject &data)
A structure that holds runtime class type information.
CObjectPtr(CObject *data)
Page generated by Doxygen 1.8.16 for MRPT 1.4.0 SVN: at Mon Oct 14 23:08:25 UTC 2019 | | |