23#include "Atlas/Objects/Anonymous.h"
24#include "Atlas/Objects/Generic.h"
30using Atlas::Message::ListType;
31using Atlas::Message::MapType;
33SmartPtr<RootData> generic_factory(
const std::string& name,
int no) {
34 Operation::Generic obj;
35 obj->setType(name, no);
39SmartPtr<RootData> anonymous_factory(
const std::string& name,
int no) {
40 Entity::Anonymous obj;
41 obj->setType(name, no);
45Factories::Factories() {
46 installStandardTypes();
49Factories::~Factories() =
default;
51bool Factories::hasFactory(
const std::string& name)
const {
52 auto I = m_factories.find(name);
53 return I != m_factories.end();
56Root 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);
65Root 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);
74Root 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);
84Root 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") {
115Root 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);
125std::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);
133void Factories::addFactory(
const std::string& name, FactoryMethod method, DefaultInstanceMethod defaultInstanceMethod,
int classno) {
135 factory.classno = classno;
136 factory.default_instance_method = defaultInstanceMethod;
137 factory.factory_method = method;
138 m_factories[name] = factory;
141int Factories::addFactory(
const std::string& name, FactoryMethod method, DefaultInstanceMethod defaultInstanceMethod) {
142 int classno = ++enumMax;
144 factory.classno = classno;
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