YARP
Yet Another Robot Platform
 
Loading...
Searching...
No Matches
generate_h_functions.cpp
Go to the documentation of this file.
1/*
2 * SPDX-FileCopyrightText: 2024-2024 Istituto Italiano di Tecnologia (IIT)
3 * SPDX-License-Identifier: BSD-3-Clause
4 */
5
6#include "generator.h"
7#include <sstream>
8#include <cctype>
9#include <algorithm>
10
12{
13 std::string md_banner= generateMdParams();
14
15 md_banner = doxygenize_string(md_banner);
16
17 std::ostringstream s;
18s << "/**\n\
19* This class is the parameters parser for class " << m_classname << ".\n";
20
21 if (!m_extra_comments.empty())
22 {
23 s << "*";
25 }
26
27s << "\
28*\n\
29* These are the used parameters:\n\
30";
31
32 s << "*" << md_banner << "";
33
34 if (1) // generate yardev command line:
36
37s << "\
38*/\n\
39\n";
40
41 return s.str();
42}
43
45{
46 std::ostringstream s;
47 s << license_banner;
48 s << version_banner;
49 s << current_time();
50 s << "\n";
51
52 std::string hguard = m_classname + "_ParamsParser_H";
53 std::transform(hguard.begin(), hguard.end(), hguard.begin(), ::toupper);
54
55 s << "#ifndef " << hguard << "\n";
56 s << "#define " << hguard << "\n";
57 s << "\n";
58 s << "\
59#include <yarp/os/Searchable.h>\n\
60#include <yarp/dev/IDeviceDriverParams.h>\n\
61#include <string>\n\
62#include <cmath>\n\
63\n\
64";
65
67
68 s << "\
69class " << m_classname << "_ParamsParser : public yarp::dev::IDeviceDriverParams\n\
70{\n\
71public:\n\
72 " << m_classname << "_ParamsParser();\n\
73 ~" << m_classname << "_ParamsParser() override = default;\n\
74\n\
75public:\n";
76
77 s << S_TAB1 << "const std::string m_device_classname = {\"" << m_classname << "\"};\n";
78 s << S_TAB1 << "const std::string m_device_name = {\"" << m_modulename << "\"};\n";
79 s << S_TAB1 << "bool m_parser_is_strict = false;\n";
80 s << S_TAB1 << "struct parser_version_type\n";
81 s << S_TAB1 << "{\n";
82 s << S_TAB1 << " int major = "<< std::to_string(MACRO_PARSER_VERSION_MAJOR) << ";\n";
83 s << S_TAB1 << " int minor = "<< std::to_string(MACRO_PARSER_VERSION_MINOR) << ";\n";
84 s << S_TAB1 << "};\n";
85 s << S_TAB1 << "const parser_version_type m_parser_version = {};\n";
86 s << "\n";
87 s << S_TAB1 << "std::string m_provided_configuration;\n";
88
89 s << "\n";
90 for (const auto& param : m_params)
91 {
92 s << S_TAB1 << "const std::string m_" << param.getFullParamVariable() << "_defaultValue = {\"" << escapeQuotes(param.defaultValue) << "\"};\n";
93 }
94 s << "\n";
95
96 for (const auto& param : m_params)
97 {
98 std::string rmv;
99 s << S_TAB1;
100 if (param.type == "bool") { s << "bool "; rmv = "false";}
101 else if (param.type == "string") { s << "std::string "; rmv = "";}
102 else if (param.type == "double") { s << "double "; rmv = "std::nan(\"1\")";}
103 else if (param.type == "int") { s << "int "; rmv = "0";}
104 else if (param.type == "size_t") { s << "size_t "; rmv = "0";}
105 else if (param.type == "float") { s << "float "; rmv = "std::nanf(\"1\")";}
106 else if (param.type == "char") { s << "char "; rmv = "0"; }
107 else if (param.type == "vector<int>") { s << "std::vector<int> "; rmv = ""; }
108 else if (param.type == "vector<string>") { s << "std::vector<std::string> "; rmv = ""; }
109 else if (param.type == "vector<double>") { s << "std::vector<double> "; rmv = ""; }
110 else {
111 s << "ERROR! Generation failed because of unknown data type.\n";
112 }
113
114 s << "m_" << param.getFullParamVariable();
115
116 //if the parameter has a default value...
117 if (param.defaultValue != "")
118 {
119 if (param.type == "vector<int>" ||
120 param.type == "vector<string>" ||
121 param.type == "vector<double>")
122 {
123 s << " = { }; //Default values for lists are managed in the class constructor. It is highly recommended to provide a suggested value also for optional string parameters.\n";
124 }
125 else if (param.type == "string")
126 {
127 s << " = {\"" << param.defaultValue << "\"};\n";
128 }
129 else
130 {
131 s << " = {" << param.defaultValue << "};\n";
132 }
133 }
134 //if the parameter has not a default value
135 else
136 {
137 //optional parameter must have a default value!!!
138 if (param.required == false)
139 {
140 if (param.type == "string")
141 {
142 s << " = {" << rmv << "}; //This default value of this string is an empty string. It is highly recommended to provide a suggested value also for optional string parameters.\n";
143 }
144 else if (param.type == "vector<int>" ||
145 param.type == "vector<string>" ||
146 param.type == "vector<double>")
147 {
148 s << " = {" << rmv << "}; //The default value of this list is an empty list. It is highly recommended to provide a suggested value also for optional string parameters.\n";
149 }
150 else
151 {
152 s << " = ERROR! Generation failed because this optional param MUST have a default value!\n";
153 }
154 }
155 //mandatory parameter might not have a default value
156 else
157 {
158 s << " = {" << rmv << "}; //This default value is autogenerated. It is highly recommended to provide a suggested value also for mandatory parameters.\n";
159 }
160 }
161 }
162
163 s << "\n\
164 bool parseParams(const yarp::os::Searchable & config) override;\n\
165 std::string getDeviceClassName() const override { return m_device_classname; }\n\
166 std::string getDeviceName() const override { return m_device_name; }\n\
167 std::string getDocumentationOfDeviceParams() const override;\n\
168 std::vector<std::string> getListOfParams() const override;\n\
169 bool getParamValue(const std::string& paramName, std::string& paramValue) const override;\n\
170 std::string getConfiguration() const override;\n\
171};\n\
172";
173
174 s << "\n";
175 s << "#endif\n";
176
177 return s.str();
178}
std::string m_modulename
Definition generator.h:39
std::string m_classname
Definition generator.h:38
std::string generateDoxygenForHeaderClass()
std::string m_extra_comments
Definition generator.h:48
std::string generateMdParams()
std::string generateYarpdevDoxyString()
std::deque< Parameter > m_params
Definition generator.h:34
std::string doxygenize_string(std::string s)
Definition utils.h:12
std::string current_time()
Definition utils.h:24
std::string escapeQuotes(const std::string &str)
Definition utils.h:56
#define MACRO_PARSER_VERSION_MINOR
Definition generator.h:27
const std::string license_banner
Definition generator.h:80
#define MACRO_PARSER_VERSION_MAJOR
Definition generator.h:26
#define S_TAB1
Definition generator.h:22
const std::string version_banner
Definition generator.h:88