12
12
#include < mrpt/core/safe_pointers.h>
13
13
#include < mrpt/typemeta/static_string.h> // literal()
14
14
15
- #include < functional>
16
15
#include < memory>
17
16
#include < vector>
18
17
@@ -32,11 +31,12 @@ class CObject;
32
31
struct TRuntimeClassId
33
32
{
34
33
using Ptr = safe_ptr<TRuntimeClassId>;
35
- const char * className;
34
+ const char * className = nullptr ;
36
35
/* * Create an object of the related class, or nullptr if it is virtual. */
37
- std::function<std::shared_ptr<CObject>(void )> ptrCreateObject;
36
+ std::shared_ptr<CObject> (*ptrCreateObject)() = nullptr ;
37
+
38
38
/* * Gets the base class runtime id. */
39
- const TRuntimeClassId* (*getBaseClass)();
39
+ const TRuntimeClassId* (*getBaseClass)() = nullptr ;
40
40
41
41
// Operations
42
42
std::shared_ptr<CObject> createObject () const ;
@@ -176,7 +176,7 @@ class CObject
176
176
{
177
177
protected:
178
178
static mrpt::rtti::TRuntimeClassId* _GetBaseClass ();
179
- static const mrpt::rtti::TRuntimeClassId runtimeClassId;
179
+ static constexpr mrpt::rtti::TRuntimeClassId runtimeClassId = { " CObject " , nullptr , nullptr } ;
180
180
181
181
public:
182
182
using Ptr = std::shared_ptr<CObject>;
@@ -206,10 +206,6 @@ inline mrpt::rtti::CObject::Ptr CObject::duplicateGetSmartPtr() const
206
206
#define DEFINE_MRPT_OBJECT (class_name, NameSpace ) \
207
207
/* ! @name RTTI stuff */ \
208
208
/* ! @{ */ \
209
- protected: \
210
- static const mrpt::rtti::TRuntimeClassId* _GetBaseClass (); \
211
- static const mrpt::rtti::TRuntimeClassId runtimeClassId; \
212
- \
213
209
public: \
214
210
/* ! A type for the associated smart pointer */ \
215
211
using Ptr = std::shared_ptr<NameSpace::class_name>; \
@@ -240,49 +236,55 @@ inline mrpt::rtti::CObject::Ptr CObject::duplicateGetSmartPtr() const
240
236
{ \
241
237
return std::make_unique<class_name>(std::forward<Args>(args)...); \
242
238
} \
239
+ \
240
+ protected: \
241
+ static const mrpt::rtti::TRuntimeClassId* _GetBaseClass (); \
242
+ static constexpr mrpt::rtti::TRuntimeClassId runtimeClassId = { \
243
+ #NameSpace " ::" #class_name, NameSpace::class_name::CreateObject, \
244
+ &class_name::_GetBaseClass}; \
245
+ \
243
246
/* ! @} */ \
244
247
public:
245
248
246
- #define INTERNAL_IMPLEMENTS_MRPT_OBJECT (class_name, base, NameSpace, class_registry_name ) \
247
- mrpt::rtti::CObject::Ptr NameSpace::class_name::CreateObject () \
248
- { \
249
- return std::static_pointer_cast<CObject>(std::make_shared<NameSpace::class_name>()); \
250
- } \
251
- const mrpt::rtti::TRuntimeClassId* NameSpace::class_name::_GetBaseClass () \
252
- { \
253
- return CLASS_ID (base); \
254
- } \
255
- const mrpt::rtti::TRuntimeClassId& NameSpace::class_name::GetRuntimeClassIdStatic () \
256
- { \
257
- return NameSpace::class_name::runtimeClassId; \
258
- } \
259
- const mrpt::rtti::TRuntimeClassId NameSpace::class_name::runtimeClassId = { \
260
- class_registry_name, NameSpace::class_name::CreateObject, &class_name::_GetBaseClass}; \
261
- const mrpt::rtti::TRuntimeClassId* NameSpace::class_name::GetRuntimeClass () const \
262
- { \
263
- return CLASS_ID_NAMESPACE (class_name, NameSpace); \
264
- } \
265
- mrpt::rtti::CObject* NameSpace::class_name::clone () const \
266
- { \
267
- return mrpt::rtti::internal::CopyCtor< \
268
- std::is_copy_constructible<NameSpace::class_name>::value>::clone (*this ); \
249
+ #define INTERNAL_IMPLEMENTS_MRPT_OBJECT (class_name, base, NameSpace ) \
250
+ mrpt::rtti::CObject::Ptr NameSpace::class_name::CreateObject () \
251
+ { \
252
+ return std::static_pointer_cast<CObject>(std::make_shared<NameSpace::class_name>()); \
253
+ } \
254
+ const mrpt::rtti::TRuntimeClassId* NameSpace::class_name::_GetBaseClass () \
255
+ { \
256
+ return CLASS_ID (base); \
257
+ } \
258
+ const mrpt::rtti::TRuntimeClassId& NameSpace::class_name::GetRuntimeClassIdStatic () \
259
+ { \
260
+ return NameSpace::class_name::runtimeClassId; \
261
+ } \
262
+ const mrpt::rtti::TRuntimeClassId* NameSpace::class_name::GetRuntimeClass () const \
263
+ { \
264
+ return CLASS_ID_NAMESPACE (class_name, NameSpace); \
265
+ } \
266
+ mrpt::rtti::CObject* NameSpace::class_name::clone () const \
267
+ { \
268
+ return mrpt::rtti::internal::CopyCtor< \
269
+ std::is_copy_constructible<NameSpace::class_name>::value>::clone (*this ); \
269
270
}
270
271
271
272
/* * Must be added to all CObject-derived classes implementation file.
272
273
* This registers class ns1::Foo as "ns1::Foo".
273
274
*/
274
275
#define IMPLEMENTS_MRPT_OBJECT (class_name, base, NameSpace ) \
275
- INTERNAL_IMPLEMENTS_MRPT_OBJECT (class_name, base, NameSpace, #NameSpace " :: " #class_name )
276
+ INTERNAL_IMPLEMENTS_MRPT_OBJECT (class_name, base, NameSpace)
276
277
277
278
/* * This declaration must be inserted in virtual CObject classes
278
279
* definition:
279
280
*/
280
- #define DEFINE_VIRTUAL_MRPT_OBJECT (class_name ) \
281
+ #define DEFINE_VIRTUAL_MRPT_OBJECT (class_name, NameSpace ) \
281
282
/* ! @name RTTI stuff */ \
282
283
/* ! @{ */ \
283
284
protected: \
284
285
static const mrpt::rtti::TRuntimeClassId* _GetBaseClass (); \
285
- static const mrpt::rtti::TRuntimeClassId runtimeClassId; \
286
+ static constexpr mrpt::rtti::TRuntimeClassId runtimeClassId = { \
287
+ #NameSpace " ::" #class_name, nullptr , &class_name::_GetBaseClass}; \
286
288
\
287
289
public: \
288
290
using Ptr = std::shared_ptr<class_name>; \
@@ -294,24 +296,22 @@ inline mrpt::rtti::CObject::Ptr CObject::duplicateGetSmartPtr() const
294
296
/* * This must be inserted as implementation of some required members for
295
297
* virtual CObject classes:
296
298
*/
297
- #define INTERNAL_IMPLEMENTS_VIRTUAL_MRPT_OBJECT (class_name, base_name, NS, registered_name ) \
298
- const mrpt::rtti::TRuntimeClassId* NS::class_name::_GetBaseClass () \
299
- { \
300
- return CLASS_ID (base_name); \
301
- } \
302
- const mrpt::rtti::TRuntimeClassId NS::class_name::runtimeClassId = { \
303
- registered_name, nullptr , &NS::class_name::_GetBaseClass}; \
304
- const mrpt::rtti::TRuntimeClassId* NS::class_name::GetRuntimeClass () const \
305
- { \
306
- return CLASS_ID (class_name); \
307
- } \
308
- const mrpt::rtti::TRuntimeClassId& NS::class_name::GetRuntimeClassIdStatic () \
309
- { \
310
- return NS::class_name::runtimeClassId; \
299
+ #define INTERNAL_IMPLEMENTS_VIRTUAL_MRPT_OBJECT (class_name, base_name, NS ) \
300
+ const mrpt::rtti::TRuntimeClassId* NS::class_name::_GetBaseClass () \
301
+ { \
302
+ return CLASS_ID (base_name); \
303
+ } \
304
+ const mrpt::rtti::TRuntimeClassId* NS::class_name::GetRuntimeClass () const \
305
+ { \
306
+ return CLASS_ID (class_name); \
307
+ } \
308
+ const mrpt::rtti::TRuntimeClassId& NS::class_name::GetRuntimeClassIdStatic () \
309
+ { \
310
+ return NS::class_name::runtimeClassId; \
311
311
}
312
312
313
313
#define IMPLEMENTS_VIRTUAL_MRPT_OBJECT (class_name, base, NS ) \
314
- INTERNAL_IMPLEMENTS_VIRTUAL_MRPT_OBJECT (class_name, base, NS, #NS " :: " #class_name )
314
+ INTERNAL_IMPLEMENTS_VIRTUAL_MRPT_OBJECT (class_name, base, NS)
315
315
316
316
/* * Register all pending classes - to be called just before
317
317
* de-serializing an object, for example. After calling this method,
0 commit comments