ClassFactory.h
Go to the documentation of this file.
1 /*+-------------------------------------------------------------------------+
2  | MultiVehicle simulator (libmvsim) |
3  | |
4  | Copyright (C) 2014-2024 Jose Luis Blanco Claraco |
5  | Copyright (C) 2017 Borys Tymchenko (Odessa Polytechnic University) |
6  | Distributed under 3-clause BSD License |
7  | See COPYING |
8  +-------------------------------------------------------------------------+ */
9 #pragma once
10 
11 #include <mvsim/basic_types.h>
12 
13 #include <map>
14 #include <memory>
15 #include <stdexcept>
16 #include <string>
17 
18 namespace mvsim
19 {
24 template <class CLASS, typename ARG1 = void, typename ARG2 = int>
26 {
27  public:
28  using Ptr = std::shared_ptr<CLASS>;
29 
30  struct TClassData
31  {
32  CLASS* (*ptr_factory1)(ARG1);
33  CLASS* (*ptr_factory2)(ARG1, ARG2);
34  TClassData() : ptr_factory1(nullptr), ptr_factory2(nullptr) {}
35  };
36 
37  void do_register(const std::string& class_name, const TClassData& data)
38  {
39  classes_[class_name] = data;
40  }
41 
42  Ptr create(const std::string& class_name, ARG1 a1) const
43  {
44  auto it = classes_.find(class_name);
45  if (it == classes_.end())
46  throw std::runtime_error(
47  (std::string("ClassFactory: Unknown class ") + class_name).c_str());
48  if (!it->second.ptr_factory1)
49  throw std::runtime_error(
50  (std::string("ClassFactory: factory(1) pointer is nullptr for ") + class_name)
51  .c_str());
52  return Ptr((*it->second.ptr_factory1)(a1));
53  }
54  Ptr create(const std::string& class_name, ARG1 a1, ARG2 a2) const
55  {
56  auto it = classes_.find(class_name);
57  if (it == classes_.end())
58  throw std::runtime_error(
59  (std::string("ClassFactory: Unknown class ") + class_name).c_str());
60  if (!it->second.ptr_factory2)
61  throw std::runtime_error(
62  (std::string("ClassFactory: factory(2) pointer is nullptr for ") + class_name)
63  .c_str());
64  return Ptr((*it->second.ptr_factory2)(a1, a2));
65  }
66 
67  private:
68  std::map<std::string, TClassData> classes_;
69 }; // namespace mvsim
70 
71 #define DECLARES_REGISTER_CLASS1(CLASS_NAME, BASE_CLASS, ARG1) \
72  public: \
73  static BASE_CLASS* Create(ARG1 a1) { return new CLASS_NAME(a1); }
74 #define DECLARES_REGISTER_CLASS2(CLASS_NAME, BASE_CLASS, ARG1, ARG2) \
75  public: \
76  static BASE_CLASS* Create(ARG1 a1, ARG2 a2) { return new CLASS_NAME(a1, a2); }
77 
78 #define REGISTER_CLASS1(FACTORY_TYPE, FACTORY_OBJ, TEXTUAL_NAME, CLASS_NAME) \
79  { \
80  FACTORY_TYPE::TClassData data; \
81  data.ptr_factory1 = &CLASS_NAME::Create; \
82  FACTORY_OBJ.do_register(TEXTUAL_NAME, data); \
83  }
84 
85 #define REGISTER_CLASS2(FACTORY_TYPE, FACTORY_OBJ, TEXTUAL_NAME, CLASS_NAME) \
86  { \
87  FACTORY_TYPE::TClassData data; \
88  data.ptr_factory2 = &CLASS_NAME::Create; \
89  FACTORY_OBJ.do_register(TEXTUAL_NAME, data); \
90  }
91 } // namespace mvsim
mvsim::ClassFactory::create
Ptr create(const std::string &class_name, ARG1 a1, ARG2 a2) const
Definition: ClassFactory.h:54
mvsim
Definition: Client.h:21
mvsim::ClassFactory::TClassData::ptr_factory1
CLASS *(* ptr_factory1)(ARG1)
Definition: ClassFactory.h:32
mvsim::ClassFactory::Ptr
std::shared_ptr< CLASS > Ptr
Definition: ClassFactory.h:28
mvsim::ClassFactory::TClassData::TClassData
TClassData()
Definition: ClassFactory.h:34
basic_types.h
mvsim::ClassFactory::TClassData::ptr_factory2
CLASS *(* ptr_factory2)(ARG1, ARG2)
Definition: ClassFactory.h:33
mvsim::ClassFactory::create
Ptr create(const std::string &class_name, ARG1 a1) const
Definition: ClassFactory.h:42
mvsim::ClassFactory::classes_
std::map< std::string, TClassData > classes_
Definition: ClassFactory.h:68
mvsim::ClassFactory::do_register
void do_register(const std::string &class_name, const TClassData &data)
Definition: ClassFactory.h:37
mvsim::ClassFactory::TClassData
Definition: ClassFactory.h:30
mvsim::ClassFactory
Definition: ClassFactory.h:25


mvsim
Author(s):
autogenerated on Wed May 28 2025 02:13:07