28 #ifndef MRPT_COBJECT_H
29 #define MRPT_COBJECT_H
72 bool derivedFrom(
const char* pBaseClass_name)
const;
103 #define CLASS_ID(class_name) static_cast<const mrpt::utils::TRuntimeClassId*>(&class_name::class##class_name)
107 #define CLASS_ID_NAMESPACE(class_name,namespaceName) static_cast<const mrpt::utils::TRuntimeClassId*>(&namespaceName::class_name::class##class_name)
111 #define CLASS_ID_TEMPLATE(class_name,T) static_cast<const mrpt::utils::TRuntimeClassId*>(& template <class T> class_name<T>::class##class_name)
114 #define IS_CLASS( ptrObj, class_name ) ((ptrObj)->GetRuntimeClass()==CLASS_ID(class_name))
117 #define IS_DERIVED( ptrObj, class_name ) ((ptrObj)->GetRuntimeClass()->derivedFrom(CLASS_ID(class_name)))
148 virtual CObject *duplicate()
const = 0;
162 #define DEFINE_MRPT_OBJECT(class_name) \
166 static const mrpt::utils::TRuntimeClassId* _GetBaseClass(); \
167 static mrpt::utils::CLASSINIT _init_##class_name;\
170 typedef class_name##Ptr SmartPtr; \
171 static mrpt::utils::TRuntimeClassId class##class_name; \
172 static const mrpt::utils::TRuntimeClassId *classinfo; \
173 virtual const mrpt::utils::TRuntimeClassId* GetRuntimeClass() const; \
174 static mrpt::utils::CObject* CreateObject(); \
175 static class_name##Ptr Create(); \
176 virtual mrpt::utils::CObject *duplicate() const; \
179 EIGEN_MAKE_ALIGNED_OPERATOR_NEW \
183 #define DEFINE_MRPT_OBJECT_PRE_CUSTOM_BASE_LINKAGE(class_name, base_name, _LINKAGE_ ) \
184 DEFINE_MRPT_OBJECT_PRE_CUSTOM_BASE_LINKAGE2(class_name, base_name, _LINKAGE_ class_name)
187 #define DEFINE_MRPT_OBJECT_PRE_CUSTOM_BASE_NO_LINKAGE(class_name, base_name) \
188 DEFINE_MRPT_OBJECT_PRE_CUSTOM_BASE_LINKAGE2(class_name, base_name, class_name)
192 #define DEFINE_MRPT_OBJECT_PRE_CUSTOM_BASE_LINKAGE2(class_name, base_name, class_name_LINKAGE_ ) \
193 class class_name_LINKAGE_; \
195 struct class_name_LINKAGE_##Ptr : public base_name##Ptr \
197 typedef class_name value_type; \
198 inline class_name##Ptr() : base_name##Ptr(static_cast<base_name*>(NULL)) { } \
199 inline explicit class_name##Ptr(class_name* p) : base_name##Ptr( reinterpret_cast<base_name*>(p) ) { } \
200 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) ) } \
201 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) ) } \
202 inline void setFromPointerDoNotFreeAtDtor(const class_name* p) { this->set(const_cast<mrpt::utils::CObject*>(reinterpret_cast<const mrpt::utils::CObject*>(p))); m_holder->increment(); } \
204 inline class_name * pointer() { return reinterpret_cast<class_name*>(base_name##Ptr::pointer()); } \
206 inline const class_name * pointer() const { return reinterpret_cast<const class_name*>(base_name##Ptr::pointer()); } \
207 inline class_name* operator ->(void) { return reinterpret_cast<class_name*>( base_name##Ptr::operator ->() ); } \
208 inline const class_name* operator ->(void) const { return reinterpret_cast<const class_name*>( base_name##Ptr::operator ->() ); } \
209 inline class_name& operator *(void) { return *reinterpret_cast<class_name*>( base_name##Ptr::operator ->() ); } \
210 inline const class_name& operator *(void) const { return *reinterpret_cast<const class_name*>( base_name##Ptr::operator ->() ); } \
215 #define DEFINE_MRPT_OBJECT_PRE_CUSTOM_LINKAGE(class_name,_LINKAGE_) \
216 DEFINE_MRPT_OBJECT_PRE_CUSTOM_LINKAGE2(class_name, _LINKAGE_ class_name)
219 #define DEFINE_MRPT_OBJECT_PRE_NO_LINKAGE(class_name) \
220 DEFINE_MRPT_OBJECT_PRE_CUSTOM_LINKAGE2(class_name, class_name)
224 #define DEFINE_MRPT_OBJECT_PRE_CUSTOM_LINKAGE2(class_name,class_name_LINKAGE_) \
225 class class_name_LINKAGE_; \
227 struct class_name_LINKAGE_##Ptr : public mrpt::utils::CObjectPtr \
229 inline class_name##Ptr() : mrpt::utils::CObjectPtr(static_cast<mrpt::utils::CObject*>(NULL)) { } \
230 inline explicit class_name##Ptr(class_name* p) : mrpt::utils::CObjectPtr( reinterpret_cast<mrpt::utils::CObject*>(p) ) { } \
231 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) ) } \
232 inline void setFromPointerDoNotFreeAtDtor(const class_name* p) { this->set(const_cast<mrpt::utils::CObject*>(reinterpret_cast<const mrpt::utils::CObject*>(p))); m_holder->increment(); } \
234 inline class_name * pointer() { return reinterpret_cast<class_name*>(mrpt::utils::CObjectPtr::pointer()); } \
236 inline const class_name * pointer() const { return reinterpret_cast<const class_name*>(mrpt::utils::CObjectPtr::pointer()); } \
237 inline class_name* operator ->(void) { return reinterpret_cast<class_name*>( mrpt::utils::CObjectPtr::operator ->() ); } \
238 inline const class_name* operator ->(void) const { return reinterpret_cast<const class_name*>( mrpt::utils::CObjectPtr::operator ->() ); } \
239 inline class_name& operator *(void) { return *reinterpret_cast<class_name*>( mrpt::utils::CObjectPtr::operator ->() ); } \
240 inline const class_name& operator *(void) const { return *reinterpret_cast<const class_name*>( mrpt::utils::CObjectPtr::operator ->() ); } \
245 #define DEFINE_MRPT_OBJECT_PRE_CUSTOM_BASE(class_name, base_name) \
246 DEFINE_MRPT_OBJECT_PRE_CUSTOM_BASE_LINKAGE(class_name, base_name, BASE_IMPEXP )
250 #define DEFINE_MRPT_OBJECT_PRE(class_name) \
251 DEFINE_MRPT_OBJECT_PRE_CUSTOM_LINKAGE(class_name, BASE_IMPEXP ) // This macro is valid for classes within mrpt-core only.
255 #define IMPLEMENTS_MRPT_OBJECT(class_name, base,NameSpace) \
256 mrpt::utils::CObject* NameSpace::class_name::CreateObject() \
257 { return static_cast<mrpt::utils::CObject*>( new NameSpace::class_name ); } \
258 NameSpace::class_name##Ptr NameSpace::class_name::Create() \
259 { return NameSpace::class_name##Ptr( new NameSpace::class_name ); } \
260 const mrpt::utils::TRuntimeClassId* NameSpace::class_name::_GetBaseClass() \
261 { return CLASS_ID(base); } \
262 mrpt::utils::TRuntimeClassId NameSpace::class_name::class##class_name = { \
263 #class_name, NameSpace::class_name::CreateObject, &class_name::_GetBaseClass }; \
264 const mrpt::utils::TRuntimeClassId *NameSpace::class_name::classinfo = & NameSpace::class_name::class##class_name; \
265 const mrpt::utils::TRuntimeClassId* NameSpace::class_name::GetRuntimeClass() const \
266 { return CLASS_ID_NAMESPACE(class_name,NameSpace); } \
267 mrpt::utils::CLASSINIT NameSpace::class_name::_init_##class_name(CLASS_ID(base)); \
268 mrpt::utils::CObject * NameSpace::class_name::duplicate() const \
269 { return static_cast<mrpt::utils::CObject*>( new NameSpace::class_name(*this) ); }
274 #define DEFINE_VIRTUAL_MRPT_OBJECT(class_name) \
278 static const mrpt::utils::TRuntimeClassId* _GetBaseClass(); \
280 static const mrpt::utils::TRuntimeClassId class##class_name; \
281 virtual const mrpt::utils::TRuntimeClassId* GetRuntimeClass() const; \
282 friend class mrpt::utils::CStream; \
288 #define IMPLEMENTS_VIRTUAL_MRPT_OBJECT(class_name, base_class_name,NameSpace) \
289 const mrpt::utils::TRuntimeClassId* class_name::_GetBaseClass() \
290 { return CLASS_ID(base_class_name); } \
291 const mrpt::utils::TRuntimeClassId class_name::class##class_name = { \
292 #class_name, NULL, &class_name::_GetBaseClass }; \
293 const mrpt::utils::TRuntimeClassId* class_name::GetRuntimeClass() const \
294 { return CLASS_ID(class_name); }
306 template <
typename T,
typename C,
typename COUNTER>
312 template <
typename T,
typename C,
typename COUNTER>