28 #include <boost/format.hpp>
29 #include <boost/regex.hpp>
31 #include <SimoxUtility/algorithm/string/string_tools.h>
39 #include "../GroupXmlReader.h"
47 std::tuple<std::string, std::string>
49 std::vector<std::string> proxies,
50 std::string groupName,
52 const std::set<std::string>& usedVariantTypes)
55 std::tie(cppClass, cppClassBase) =
56 BuildClass(namespaces, proxies, groupName, variantInfo, usedVariantTypes);
58 cppClass->writeCpp(writer);
60 cppClassBase->writeCpp(writerBase);
61 return std::make_tuple(writer->getString(), writerBase->getString());
64 std::tuple<CppClassPtr, CppClassPtr>
65 XmlContextBaseClassGenerator::BuildClass(std::vector<std::string> namespaces,
66 std::vector<std::string> proxies,
67 std::string groupName,
69 const std::set<std::string>& usedVariantTypes)
71 std::string className = groupName +
"StatechartContext";
73 for (std::string& ns : namespaces)
75 ns = simox::alg::replace_all(ns,
"-",
"_");
81 cppImplClass->addInherit(
"virtual public XMLStatechartContext");
82 cppImplClass->addInherit(
"public " + cppBaseClass->getName());
84 cppImplClass->addInclude(
"<ArmarXCore/core/Component.h>");
85 cppImplClass->addInclude(
"<ArmarXCore/core/system/ImportExportComponent.h>");
86 cppImplClass->addInclude(
"<ArmarXCore/statechart/StatechartContext.h>");
87 cppImplClass->addInclude(
"\"" + className +
"Base.generated.h\"");
88 cppBaseClass->addInclude(
"<ArmarXCore/core/system/ImportExportComponent.h>");
90 std::vector<VariantInfo::ProxyEntryPtr> proxyEntries;
92 for (std::string proxyId : proxies)
98 proxyEntries.push_back(p);
102 CppClassPtr propertiesClass = cppImplClass->addInnerClass(
"PropertyDefinitions");
103 propertiesClass->addInherit(
"public StatechartContextPropertyDefinitions");
105 CppCtorPtr propertiesCtor = propertiesClass->addCtor(
"std::string prefix");
106 propertiesCtor->addInitListEntry(
"StatechartContextPropertyDefinitions",
"prefix");
109 cppImplClass->addPublicMethod(
"std::string getDefaultName() const override");
110 CppMethodPtr onInit = cppImplClass->addPublicMethod(
"void onInitStatechartContext() override");
112 cppImplClass->addPublicMethod(
"void onConnectStatechartContext() override");
114 getDefaultName->addLine(fmt(
"return \"%s\";", className));
118 std::string description = fmt(
"Name of the %s that should be used",
119 simox::alg::to_lower(magicNameSplit(p->getPropertyName())));
121 if (p->getPropertyIsOptional())
123 propertiesCtor->addLine(
124 fmt(
"defineOptionalProperty<std::string>(\"%s\", \"%s\", \"%s\");",
125 p->getPropertyName(),
126 p->getPropertyDefaultValue(),
131 propertiesCtor->addLine(fmt(
"defineRequiredProperty<std::string>(\"%s\", \"%s\");",
132 p->getPropertyName(),
139 onInit->addLine(fmt(
"usingProxy(getProperty<std::string>(\"%s\").getValue());",
140 p->getPropertyName()));
142 fmt(
"%s = getProxy<%s>(getProperty<std::string>(\"%s\").getValue());",
145 p->getPropertyName()));
149 onInit->addLine(fmt(
"offeringTopic(getProperty<std::string>(\"%s\").getValue());",
150 p->getPropertyName()));
152 fmt(
"%s = getTopic<%s>(getProperty<std::string>(\"%s\").getValue());",
155 p->getPropertyName()));
159 throw LocalException(
"Not supported ProxyType");
163 cppImplClass->addPrivateField(f);
164 std::string proxyFuncVirtual =
165 fmt(
"virtual const %s& %s() const = 0;", p->getTypeName(), p->getGetterName());
166 std::string proxyFuncOverride =
167 fmt(
"const %s& %s() const override", p->getTypeName(), p->getGetterName());
168 CppMethodPtr virtualGetProxy = cppBaseClass->addPublicMethod(proxyFuncVirtual);
169 CppMethodPtr getProxy = cppImplClass->addPublicMethod(proxyFuncOverride);
170 getProxy->addLine(fmt(
"return %s;", p->getMemberName()));
171 getProxy->setCompact(
true);
172 getProxy->setEnforceBlockGeneration(
true);
173 cppBaseClass->addInclude(fmt(
"<%s>", p->getIncludePath()));
179 for (std::string member : p->getMembers())
183 cppImplClass->addPrivateField(f);
186 for (std::string include : p->getIncludes())
188 cppBaseClass->addInclude(fmt(
"<%s>", include));
191 for (std::string oni : p->getOnInit())
193 onInit->addLine(oni);
196 for (std::string onc : p->getOnConnect())
198 onConnect->addLine(onc);
201 for (std::pair<std::string, std::string> method : p->getMethods())
203 cppImplClass->addPublicMethod(method.first +
" override")->addLine(method.second);
204 cppBaseClass->addPublicMethod(
"virtual " + method.first +
" = 0;");
208 const std::string baseVirtualDtor = fmt(
"virtual ~%sBase() = default;", className);
209 cppBaseClass->addPublicMethod(baseVirtualDtor);
212 CppMethodPtr createPropertyDefinitions = cppImplClass->addPublicMethod(
213 "PropertyDefinitionsPtr createPropertyDefinitions() override");
214 createPropertyDefinitions->addLine(
215 fmt(
"return PropertyDefinitionsPtr(new %s::PropertyDefinitions(getConfigIdentifier()));",
218 if (usedVariantTypes.size() > 0)
222 new CppMethod(
"void __attribute__((used)) __forceLibLoading()"));
223 forceLibLoading->addLine(
"// Do not call this method.");
224 forceLibLoading->addLine(
"// The sole purpose of this method is to force the "
225 "compiler/linker to include all libraries.");
228 std::set<std::string> includes;
229 for (std::string innerNonBasicVariantDataType : usedVariantTypes)
232 variantInfo->findLibByVariant(innerNonBasicVariantDataType);
235 for (
auto& include : lib->getFactoryIncludes())
237 includes.insert(include);
239 for (
auto& include : lib->getVariantIncludes(innerNonBasicVariantDataType))
241 includes.insert(include);
243 std::string implementationType =
244 variantInfo->getDataTypeName(innerNonBasicVariantDataType);
245 forceLibLoading->addLine(
246 fmt(
"armarx::GenericFactory< %s, %s> ().create(%s::ice_staticId());",
249 implementationType));
252 for (
auto& include : includes)
254 cppImplClass->addInclude(
"<" + include +
">");
257 cppImplClass->addPublicMethod(forceLibLoading);
260 return std::make_tuple(cppImplClass, cppBaseClass);
264 XmlContextBaseClassGenerator::magicNameSplit(std::string name)
268 name = name.substr(0, name.size() - 4);
271 boost::regex re(
"([A-Z][a-z])");
272 name = boost::regex_replace(name, re,
" \\1");
273 name = simox::alg::to_lower(name);
274 simox::alg::trim(name);
279 XmlContextBaseClassGenerator::fmt(
const std::string& fmt,
const std::string& arg1)
281 return str(boost::format(fmt) % arg1);
285 XmlContextBaseClassGenerator::fmt(
const std::string& fmt,
286 const std::string& arg1,
287 const std::string& arg2)
289 return str(boost::format(fmt) % arg1 % arg2);
293 XmlContextBaseClassGenerator::fmt(
const std::string& fmt,
294 const std::string& arg1,
295 const std::string& arg2,
296 const std::string& arg3)
298 return str(boost::format(fmt) % arg1 % arg2 % arg3);