Main MRPT website > C++ reference for MRPT 1.9.9
CObject.cpp
Go to the documentation of this file.
1 /* +------------------------------------------------------------------------+
2  | Mobile Robot Programming Toolkit (MRPT) |
3  | http://www.mrpt.org/ |
4  | |
5  | Copyright (c) 2005-2018, Individual contributors, see AUTHORS file |
6  | See: http://www.mrpt.org/Authors - All rights reserved. |
7  | Released under BSD License. See details in http://www.mrpt.org/License |
8  +------------------------------------------------------------------------+ */
9 
10 #include "rtti-precomp.h" // Precompiled headers
11 
12 #include <mrpt/rtti/CObject.h>
13 #include <cstdio>
15 
16 using namespace mrpt;
17 using namespace mrpt::rtti;
18 
20 {
22 }
23 
24 bool TRuntimeClassId::derivedFrom(const TRuntimeClassId* pBaseClass) const
25 {
26  ASSERT_(pBaseClass != nullptr);
27 
28  // The same class??
29  if (pBaseClass == this) return true;
30 
31  // Automatically register all pending classes, just in case:
33 
34  // Check heritage:
35  const TRuntimeClassId* pClassThis = this;
36  while (pClassThis != nullptr)
37  {
38  if (pClassThis == pBaseClass) return true;
39 
40  if (pClassThis->getBaseClass)
41  pClassThis = (*pClassThis->getBaseClass)();
42  else
43  pClassThis = nullptr; // The root class
44  }
45 
46  // Parent class not found
47  return false;
48 }
49 
50 bool TRuntimeClassId::derivedFrom(const char* pBaseClass_name) const
51 {
52  // Automatically register all pending classes, just in case:
54 
55  const TRuntimeClassId* pBaseClass = findRegisteredClass(pBaseClass_name);
56  ASSERTMSG_(
57  pBaseClass != nullptr,
58  format("Class %s not registered??", pBaseClass_name));
59 
60  // The same class??
61  if (pBaseClass == this) return true;
62 
63  // Check heritage:
64  const TRuntimeClassId* pClassThis = this;
65  while (pClassThis != nullptr)
66  {
67  if (pClassThis == pBaseClass) return true;
68 
69  if (pClassThis->getBaseClass)
70  pClassThis = (*pClassThis->getBaseClass)();
71  else
72  pClassThis = nullptr; // The root class
73  }
74 
75  // Parent class not found
76  return false;
77 }
78 
80 {
81  if (!ptrCreateObject)
82  {
83  fprintf(
84  stderr,
85  "[TRuntimeClassId::createObject] Trying to create an object "
86  "without dynamic constructor. classname=`%s`\n",
87  className != nullptr ? className : "nullptr");
88  return nullptr;
89  }
90 
91  try
92  {
93  CObject* ret = (*ptrCreateObject)();
94  return ret;
95  }
96  catch (std::bad_alloc&)
97  {
98  throw;
99  }
100 }
101 
102 // For class CObject, special methods must be defined
103 // since it has no base class. These methods are defined
104 // automatically for derived classes.
106 const struct TRuntimeClassId CObject::runtimeClassId = {"CObject", nullptr,
107  nullptr};
108 
110 {
111  auto pR = findRegisteredClass(className);
112  if (!pR) return nullptr;
113  return pR->createObject();
114 }
115 
117  const std::string& className)
118 {
120  auto pR = findRegisteredClass(className);
121  if (pR) ret.reset(pR->createObject());
122  return ret;
123 }
CObject.h
mrpt::rtti::TRuntimeClassId::ptrCreateObject
mrpt::rtti::CObject *(* ptrCreateObject)()
Create an object of the related class, or nullptr if it is virtual.
Definition: CObject.h:35
mrpt::rtti::CObject::Ptr
std::shared_ptr< CObject > Ptr
Definition: CObject.h:149
mrpt::rtti::TRuntimeClassId
A structure that holds runtime class type information.
Definition: CObject.h:30
mrpt::rtti::registerAllPendingClasses
void registerAllPendingClasses()
Register all pending classes - to be called just before de-serializing an object, for example.
Definition: internal_class_registry.cpp:133
mrpt::rtti::CObject::runtimeClassId
static const mrpt::rtti::TRuntimeClassId runtimeClassId
Definition: CObject.h:146
mrpt::rtti::CObject::_GetBaseClass
static mrpt::rtti::TRuntimeClassId * _GetBaseClass()
Definition: CObject.cpp:105
mrpt::rtti::TRuntimeClassId::className
const char * className
Definition: CObject.h:33
mrpt
This is the global namespace for all Mobile Robot Programming Toolkit (MRPT) libraries.
Definition: CKalmanFilterCapable.h:30
ASSERT_
#define ASSERT_(f)
Defines an assertion mechanism.
Definition: exceptions.h:113
mrpt::rtti::TRuntimeClassId::getBaseClass
const TRuntimeClassId *(* getBaseClass)()
Gets the base class runtime id.
Definition: CObject.h:37
rtti-precomp.h
mrpt::rtti::classFactory
mrpt::rtti::CObject * classFactory(const std::string &className)
Creates an object given by its registered name.
Definition: CObject.cpp:109
mrpt::format
std::string format(const char *fmt,...) MRPT_printf_format_check(1
A std::string version of C sprintf.
Definition: format.cpp:16
mrpt::rtti::CObject
The virtual base class of all MRPT classes with a unified RTTI system.
Definition: CObject.h:142
mrpt::rtti::TRuntimeClassId::derivedFrom
bool derivedFrom(const TRuntimeClassId *pBaseClass) const
Definition: CObject.cpp:24
mrpt::rtti::TRuntimeClassId::createObject
mrpt::rtti::CObject * createObject() const
Definition: CObject.cpp:79
ASSERTMSG_
#define ASSERTMSG_(f, __ERROR_MSG)
Defines an assertion mechanism.
Definition: exceptions.h:101
internal_class_registry.h
mrpt::system::os::fprintf
int fprintf(FILE *fil, const char *format,...) noexcept MRPT_printf_format_check(2
An OS-independent version of fprintf.
Definition: os.cpp:406
mrpt::rtti
Definition: CListOfClasses.h:17
mrpt::rtti::CObject::GetRuntimeClassIdStatic
static const mrpt::rtti::TRuntimeClassId & GetRuntimeClassIdStatic()
Definition: CObject.cpp:19
string
GLsizei const GLchar ** string
Definition: glext.h:4101
mrpt::rtti::classFactoryPtr
mrpt::rtti::CObject::Ptr classFactoryPtr(const std::string &className)
Like classFactory() but returns a smart pointer.
Definition: CObject.cpp:116
mrpt::rtti::findRegisteredClass
const TRuntimeClassId * findRegisteredClass(const std::string &className)
Return info about a given class by its name, or nullptr if the class is not registered.
Definition: internal_class_registry.cpp:202



Page generated by Doxygen 1.8.17 for MRPT 1.9.9 Git: ad3a9d8ae Tue May 1 23:10:22 2018 -0700 at miƩ 12 jul 2023 10:03:34 CEST