add count variables to template
diff --git a/include/inja/template.hpp b/include/inja/template.hpp
index 2db52d4..bc63be2 100644
--- a/include/inja/template.hpp
+++ b/include/inja/template.hpp
@@ -17,6 +17,17 @@
struct Template {
std::vector<Node> nodes;
std::string content;
+
+ /// Return number of variables (total number, not distinct ones) in the template
+ int count_variables() {
+ int result {0};
+ for (auto& n : nodes) {
+ if (n.flags == Node::Flag::ValueLookupDot || n.flags == Node::Flag::ValueLookupPointer) {
+ result += 1;
+ }
+ }
+ return result;
+ }
};
using TemplateStorage = std::map<std::string, Template>;
diff --git a/single_include/inja/inja.hpp b/single_include/inja/inja.hpp
index cd8f473..40551d8 100644
--- a/single_include/inja/inja.hpp
+++ b/single_include/inja/inja.hpp
@@ -2280,6 +2280,17 @@
struct Template {
std::vector<Node> nodes;
std::string content;
+
+ /// Return number of variables (total number, not distinct ones) in the template
+ int count_variables() {
+ int result {0};
+ for (auto& n : nodes) {
+ if (n.flags == Node::Flag::ValueLookupDot || n.flags == Node::Flag::ValueLookupPointer) {
+ result += 1;
+ }
+ }
+ return result;
+ }
};
using TemplateStorage = std::map<std::string, Template>;
diff --git a/test/unit-renderer.cpp b/test/unit-renderer.cpp
index 82682ca..fb2dc08 100644
--- a/test/unit-renderer.cpp
+++ b/test/unit-renderer.cpp
@@ -417,6 +417,17 @@
CHECK(env.render("{% for city in cities %}{% include \"city.tpl\" %}{% endfor %}", loop_data) ==
"0:Munich;1:New York;");
}
+
+ SUBCASE("count variables") {
+ inja::Environment env;
+ inja::Template t1 = env.parse("Hello {{ name }}");
+ inja::Template t2 = env.parse("{% if is_happy %}{{ name }}{% else %}{{ city }}{% endif %}");
+ inja::Template t3 = env.parse("{% if at(name, test) %}{{ name }}{% else %}{{ city }}{{ upper(city) }}{% endif %}");
+
+ CHECK(t1.count_variables() == 1);
+ CHECK(t2.count_variables() == 3);
+ CHECK(t3.count_variables() == 5);
+ }
}
TEST_CASE("other-syntax") {