21 #include "Factories.h" 23 #include "Atlas/Objects/Anonymous.h" 24 #include "Atlas/Objects/Generic.h" 30 using Atlas::Message::ListType;
31 using Atlas::Message::MapType;
33 SmartPtr<RootData> generic_factory(
const std::string& name,
int no) {
34 Operation::Generic obj;
35 obj->setType(name, no);
39 SmartPtr<RootData> anonymous_factory(
const std::string& name,
int no) {
40 Entity::Anonymous obj;
41 obj->setType(name, no);
45 Factories::Factories() {
46 installStandardTypes();
49 Factories::~Factories() =
default;
51 bool Factories::hasFactory(
const std::string& name)
const {
52 auto I = m_factories.find(name);
53 return I != m_factories.end();
56 Root Factories::createObject(
const std::string& name)
const {
57 auto I = m_factories.find(name);
58 if (I == m_factories.end()) {
61 return (*I).second.factory_method(name, (*I).second.classno);
65 Root Factories::createObject(
const MapType& msg_map)
const {
66 Root obj = instantiateObject(msg_map);
68 for (
auto& entry : msg_map) {
69 obj->setAttr(entry.first, entry.second,
this);
74 Root Factories::createObject(Atlas::Message::MapType&& msg_map)
const {
75 Root obj = instantiateObject(msg_map);
77 for (
auto& entry : msg_map) {
78 obj->setAttr(entry.first, std::move(entry.second),
this);
84 Root Factories::instantiateObject(
const Atlas::Message::MapType& msg_map)
const {
86 auto I = msg_map.find(Atlas::Objects::OBJTYPE_ATTR);
87 auto Iend = msg_map.end();
88 if (I != Iend && I->second.isString()) {
89 auto& objtype = I->second.String();
90 if (objtype ==
"op" || objtype ==
"obj" || objtype ==
"object") {
92 I = msg_map.find(Atlas::Objects::PARENT_ATTR);
93 if (I != Iend && I->second.isString()) {
94 auto& parent = I->second.String();
96 auto J = m_factories.find(parent);
97 if (J != m_factories.end()) {
98 return J->second.factory_method(parent, J->second.classno);
100 if (objtype ==
"op") {
115 Root Factories::getDefaultInstance(
const std::string& name)
const {
116 auto I = m_factories.find(name);
117 if (I == m_factories.end()) {
119 return Root(
nullptr);
121 return (*I).second.default_instance_method(name, (*I).second.classno);
125 std::list<std::string> Factories::getKeys()
const {
126 std::list<std::string> keys;
127 for (
const auto& factory : m_factories) {
128 keys.push_back(factory.first);
133 void Factories::addFactory(
const std::string& name, FactoryMethod method, DefaultInstanceMethod defaultInstanceMethod,
int classno) {
136 factory.default_instance_method = defaultInstanceMethod;
137 factory.factory_method = method;
138 m_factories[name] = factory;
141 int Factories::addFactory(
const std::string& name, FactoryMethod method, DefaultInstanceMethod defaultInstanceMethod) {
142 int classno = ++enumMax;
145 factory.default_instance_method = defaultInstanceMethod;
146 factory.factory_method = method;
147 m_factories[name] = factory;
152 std::vector<Root> objects;
153 objects.reserve(val.size());
154 for (
const auto& entry : val) {
156 objects.emplace_back(createObject(entry.Map()));
163 std::vector<Root> objects;
164 objects.reserve(val.size());
165 for (
auto& entry : val) {
167 objects.emplace_back(createObject(entry.moveMap()));
std::vector< Root > parseListOfObjects(const Atlas::Message::ListType &val) const