28#include <boost/format.hpp>
29#include <boost/regex.hpp>
31#include <SimoxUtility/algorithm/string/string_tools.h>
47std::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());
64std::tuple<CppClassPtr, CppClassPtr>
65XmlContextBaseClassGenerator::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);
264XmlContextBaseClassGenerator::magicNameSplit(std::string name)
266 if (simox::alg::ends_with(name,
"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);
279XmlContextBaseClassGenerator::fmt(
const std::string& fmt,
const std::string& arg1)
281 return str(boost::format(fmt) % arg1);
285XmlContextBaseClassGenerator::fmt(
const std::string& fmt,
286 const std::string& arg1,
287 const std::string& arg2)
289 return str(boost::format(fmt) % arg1 % arg2);
293XmlContextBaseClassGenerator::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);
std::shared_ptr< LibEntry > LibEntryPtr
std::shared_ptr< ProxyEntry > ProxyEntryPtr
static std::tuple< std::string, std::string > GenerateCpp(std::vector< std::string > namespaces, std::vector< std::string > proxies, std::string groupName, VariantInfoPtr variantInfo, const std::set< std::string > &usedVariantTypes)
XmlContextBaseClassGenerator()
#define ARMARX_CHECK_EXPRESSION(expression)
This macro evaluates the expression and if it turns out to be false it will throw an ExpressionExcept...
This file offers overloads of toIce() and fromIce() functions for STL container types.
std::shared_ptr< CppClass > CppClassPtr
std::shared_ptr< CppWriter > CppWriterPtr
std::shared_ptr< VariantInfo > VariantInfoPtr
std::shared_ptr< CppCtor > CppCtorPtr
std::shared_ptr< CppMethod > CppMethodPtr
std::shared_ptr< CppField > CppFieldPtr