OpenTwin 0.1
OpenTwin
 
Loading...
Searching...
No Matches
FactoryTemplate.hpp
Go to the documentation of this file.
1
4// ###########################################################################################################################################################################################################################################################################################################################
5
6#pragma once
7
8// OpenTwin header
9#include "OTCore/Logger.h"
10#include "OTCore/Serializable.h"
12
13// std header
14#include <type_traits>
15
16template<class ValueType>
18 auto it = m_constructors.find(_key);
19 if (it != m_constructors.end()) {
20 OT_LOG_E("Constructor already registered");
21 return;
22 }
23 m_constructors.insert_or_assign(_key, _constructor);
24}
25
26template<class ValueType>
28 m_constructors.erase(_key);
29}
30
31template<class ValueType>
32ValueType* ot::FactoryTemplate<ValueType>::createFromKey(const std::string& _key) {
33 auto it = m_constructors.find(_key);
34 if (it == m_constructors.end()) {
35 OT_LOG_E("Constructor \"" + _key + "\" not found");
36 return nullptr;
37 }
38 else {
39 return it->second();
40 }
42
43template<class ValueType>
44ValueType* ot::FactoryTemplate<ValueType>::createFromJSON(const ConstJsonObject& _jsonObject, const char* _typeKey) {
45 std::string t = json::getString(_jsonObject, _typeKey);
46 if (t.empty()) {
47 return nullptr;
48 }
49
50 ValueType* ret = this->createFromKey(t);
52 // Check if the created object is a serializable object
53 Serializable* s = dynamic_cast<Serializable*>(ret);
54 if (s) {
55 s->setFromJsonObject(_jsonObject);
56 }
57
58 return ret;
59}
60
61template<class ValueType>
62ValueType* ot::FactoryTemplate<ValueType>::createFromJSON(const ConstJsonObject& _jsonObject, const std::string& _typeKey) {
63 return this->createFromJSON(_jsonObject, _typeKey.c_str());
64}
65
66// ###########################################################################################################################################################################################################################################################################################################################
67
68// ###########################################################################################################################################################################################################################################################################################################################
69
70// ###########################################################################################################################################################################################################################################################################################################################
71
72template <class FactoryType, typename CreatedType>
74 : m_key(_key)
75{
76 static_assert(std::is_same<decltype(&FactoryType::instance), decltype(&FactoryType::instance)>::value,
77 "Factory must have a static 'instance' function.");
78
79 static_assert(std::is_same<decltype(&FactoryType::instance), FactoryType& (*)()>::value,
80 "Factory must have a static 'instance' function which returns a reference to the global factory instance.");
81
82 FactoryType::instance().registerConstructor(_key, []() {
83 return new CreatedType;
84 });
85}
87template <class FactoryType, typename CreatedType>
89 FactoryType::instance().deregisterConstructor(m_key);
90}
bsoncxx::types::value value
Definition DocumentManager.h:16
OpenTwin Logging system.
#define OT_LOG_E(___text)
Log a error message according to the service logger configuration.
Definition Logger.h:186
virtual ~FactoryRegistrarTemplate()
Destructor. When called the constructor will be deregistered from the factory.
Definition FactoryTemplate.hpp:88
FactoryRegistrarTemplate(const std::string &_key)
Constructor.
Definition FactoryTemplate.hpp:73
void deregisterConstructor(const std::string &_key)
Remove the constructor for the given key.
Definition FactoryTemplate.hpp:27
std::function< ValueType *()> ConstructorFunctionType
Constructor type definition.
Definition FactoryTemplate.h:27
ValueType * createFromJSON(const ConstJsonObject &_jsonObject, const char *_typeKey)
Creates an instance according to the key in the provided JSON object. If the key is empty the request...
Definition FactoryTemplate.hpp:44
void registerConstructor(const std::string &_key, ConstructorFunctionType _constructor)
Will register the prvided constructor under the given key. If a constructor for the given key already...
Definition FactoryTemplate.hpp:17
ValueType * createFromKey(const std::string &_key)
Call the constructor for the given key and return the created instance.
Definition FactoryTemplate.hpp:32
The Serializable class is the default interface of serializable objects.
Definition Serializable.h:17
virtual void setFromJsonObject(const ot::ConstJsonObject &_object)=0
Set the object contents from the provided JSON object.
rapidjson::GenericObject< true, rapidjson::GenericValue< rapidjson::UTF8<>, rapidjson::MemoryPoolAllocator< rapidjson::CrtAllocator > > > ConstJsonObject
Read only JSON Object.
Definition JSON.h:35