Main Jinja2C++ statements
Table of contents
Condition statement
TODO:
Iteration statement
TODO:
‘set’ statement
But what if enum Animals
will be in the namespace?
namespace world
{
enum Animals
{
Dog,
Cat,
Monkey,
Elephant
};
}
In this case you need to prefix both enum name and it’s items with namespace prefix in the generated code. Like this:
std::string enum2StringConvertor = R"(
inline const char* {{enum.enumName}}ToString({{enum.nsScope}}::{{enum.enumName}} e)
{
switch (e)
{
{% for item in enum.items %}
case {{enum.nsScope}}::{{item}}:
return "{{item}}";
{% endfor %}
}
return "Unknown Item";
})";
This template will produce ‘world::’ prefix for our new scoped enum (and enum itmes). And ‘::’ for the ones in global scope. But you may want to eliminate the unnecessary global scope prefix. And you can do it this way:
{% set prefix = enum.nsScope + '::' if enum.nsScope else '' %}
std::string enum2StringConvertor = R"(inline const char* {{enum.enumName}}ToString({{prefix}}::{{enum.enumName}} e)
{
switch (e)
{
{% for item in enum.items %}
case {{prefix}}::{{item}}:
return "{{item}}";
{% endfor %}
}
return "Unknown Item";
})";
This template uses two significant jinja2 template features:
- The ‘set’ statement. You can declare new variables in your template. And you can access them by the name.
- if-expression. It works like a ternary ‘?:’ operator in C/C++. In C++ the code from the sample could be written in this way:
std::string prefix = !descr.nsScope.empty() ? descr.nsScope + "::" : "";
I.e. left part of this expression (before ‘if’) is a true-branch of the statement. Right part (after ‘else’) - false-branch, which can be omitted. As a condition you can use any expression convertible to bool.
‘with’ statement
TODO: