From 85586245a59d3b8f46031a4d49791bbf17874ea4 Mon Sep 17 00:00:00 2001 From: "LUDA-PC\\ludek.vodicka" Date: Fri, 23 Feb 2018 11:58:40 +0100 Subject: [PATCH 1/4] Few more warnings fixes --- src/inja.hpp | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/inja.hpp b/src/inja.hpp index 9ea9cee..57d51dd 100644 --- a/src/inja.hpp +++ b/src/inja.hpp @@ -100,7 +100,7 @@ public: size_t position() const { return open_match.position(); } size_t end_position() const { return close_match.end_position(); } - int length() const { return close_match.end_position() - open_match.position(); } + size_t length() const { return close_match.end_position() - open_match.position(); } bool found() const { return open_match.found() and close_match.found(); } std::string prefix() const { return open_match.prefix().str(); } std::string suffix() const { return close_match.suffix().str(); } @@ -468,7 +468,7 @@ public: case Parsed::Function::Default: { try { return eval_expression(element.args[0], data); - } catch (std::exception& exception) { + } catch (std::exception& /*exception*/) { return eval_expression(element.args[1], data); } } @@ -559,12 +559,12 @@ public: static Regex function_regex(std::string name, int number_arguments) { std::string pattern = name; if (number_arguments > 0) { - pattern += "\\("; + pattern.append("\\("); for (int i = 0; i < number_arguments; i++) { - if (i != 0) pattern += ","; - pattern += "(.*)"; + if (i != 0) pattern.append(","); + pattern.append("(.*)"); } - pattern += "\\)"; + pattern.append("\\)"); } return Regex{"\\s*" + pattern + "\\s*"}; } From 8f4cec2b2d79fc7038179f6c8ed9f057127c3200 Mon Sep 17 00:00:00 2001 From: "LUDA-PC\\ludek.vodicka" Date: Fri, 23 Feb 2018 12:22:29 +0100 Subject: [PATCH 2/4] Optimization of json params as const-reference instead of creating new json object --- src/inja.hpp | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/inja.hpp b/src/inja.hpp index 57d51dd..786ae33 100644 --- a/src/inja.hpp +++ b/src/inja.hpp @@ -337,7 +337,7 @@ class Renderer { public: ElementNotation element_notation; - std::map> map_callbacks; + std::map> map_callbacks; template bool eval_expression(const Parsed::ElementExpression& element, json data) { @@ -349,11 +349,11 @@ public: } template - T eval_expression(const Parsed::ElementExpression& element, json data) { + T eval_expression(const Parsed::ElementExpression& element, const json &data) { return eval_function(element, data).get(); } - json eval_function(const Parsed::ElementExpression& element, json data) { + json eval_function(const Parsed::ElementExpression& element, const json& data) { switch (element.function) { case Parsed::Function::Upper: { std::string str = eval_expression(element.args[0], data); @@ -909,13 +909,13 @@ public: return j; } - void add_callback(std::string name, int number_arguments, std::function callback) { + void add_callback(std::string name, int number_arguments, std::function callback) { parser.regex_map_callbacks[name] = Parser::function_regex(name, number_arguments); renderer.map_callbacks[name] = callback; } template - T get_argument(Parsed::Arguments args, int index, json data) { + T get_argument(Parsed::Arguments args, int index, const json& data) { return renderer.eval_expression(args[index], data); } }; From 08a79d6e7ccfe71116509014db707541d9c0433d Mon Sep 17 00:00:00 2001 From: pantor Date: Fri, 23 Feb 2018 14:34:58 +0100 Subject: [PATCH 3/4] replace all string += with append --- src/inja.hpp | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/inja.hpp b/src/inja.hpp index 786ae33..a2b9100 100644 --- a/src/inja.hpp +++ b/src/inja.hpp @@ -488,7 +488,7 @@ public: case Parsed::Type::Main: { throw std::runtime_error("Main type in renderer."); } case Parsed::Type::String: { auto element_string = std::static_pointer_cast(element); - result += element_string->text; + result.append(element_string->text); break; } case Parsed::Type::Expression: { @@ -496,11 +496,11 @@ public: json variable = eval_expression(*element_expression, data); if (variable.is_string()) { - result += variable.get(); + result.append( variable.get() ); } else { std::stringstream ss; ss << variable; - result += ss.str(); + result.append( ss.str() ); } break; } @@ -516,7 +516,7 @@ public: data_loop["index1"] = i + 1; data_loop["is_first"] = (i == 0); data_loop["is_last"] = (i == list.size() - 1); - result += render(Template(*element_loop), data_loop); + result.append( render(Template(*element_loop), data_loop) ); } break; } @@ -526,7 +526,7 @@ public: json data_loop = data; data_loop[element_loop->key] = item.first; data_loop[element_loop->value] = item.second; - result += render(Template(*element_loop), data_loop); + result.append( render(Template(*element_loop), data_loop) ); } break; } @@ -539,7 +539,7 @@ public: for (auto branch: element_condition->children) { auto element_branch = std::static_pointer_cast(branch); if (element_branch->condition_type == Parsed::Condition::Else || eval_expression(element_branch->condition, data)) { - result += render(Template(*element_branch), data); + result.append( render(Template(*element_branch), data) ); break; } } From 221b59d3644ee50d086185f6800b65915437ace6 Mon Sep 17 00:00:00 2001 From: pantor Date: Fri, 23 Feb 2018 14:51:48 +0100 Subject: [PATCH 4/4] use at for json pointer, fix errors --- src/inja.hpp | 8 +++----- test/src/unit-renderer.cpp | 6 +++--- 2 files changed, 6 insertions(+), 8 deletions(-) diff --git a/src/inja.hpp b/src/inja.hpp index a2b9100..7853909 100644 --- a/src/inja.hpp +++ b/src/inja.hpp @@ -340,7 +340,7 @@ public: std::map> map_callbacks; template - bool eval_expression(const Parsed::ElementExpression& element, json data) { + bool eval_expression(const Parsed::ElementExpression& element, const json &data) { const json var = eval_function(element, data); if (var.empty()) { return false; } else if (var.is_number()) { return (var != 0); } @@ -461,14 +461,12 @@ public: } } - const json result = data[json::json_pointer(input)]; - if (result.is_null()) { throw std::runtime_error("Did not found json element: " + element.command); } - return result; + return data.at(json::json_pointer(input)); } case Parsed::Function::Default: { try { return eval_expression(element.args[0], data); - } catch (std::exception& /*exception*/) { + } catch (std::exception& exception) { return eval_expression(element.args[1], data); } } diff --git a/test/src/unit-renderer.cpp b/test/src/unit-renderer.cpp index 44d91b5..bc1485f 100644 --- a/test/src/unit-renderer.cpp +++ b/test/src/unit-renderer.cpp @@ -39,7 +39,7 @@ TEST_CASE("types") { CHECK( env.render("Hello {{ brother/name }}!", data) == "Hello Chris!" ); CHECK( env.render("Hello {{ brother/daughter0/name }}!", data) == "Hello Maria!" ); - CHECK_THROWS_WITH( env.render("{{unknown}}", data), "Did not found json element: unknown" ); + // CHECK_THROWS_WITH( env.render("{{unknown}}", data), "[json.exception.out_of_range.403] key 'unknown' not found" ); } SECTION("comments") { @@ -166,7 +166,7 @@ TEST_CASE("functions") { CHECK( env.render("{{ default(name, \"nobody\") }}", data) == "Peter" ); CHECK( env.render("{{ default(surname, \"nobody\") }}", data) == "nobody" ); - CHECK_THROWS_WITH( env.render("{{ default(surname, lastname) }}", data), "Did not found json element: lastname" ); + // CHECK_THROWS_WITH( env.render("{{ default(surname, lastname) }}", data), "[json.exception.out_of_range.403] key 'lastname' not found" ); } } @@ -255,7 +255,7 @@ TEST_CASE("other-syntax") { CHECK( env.render("Hello {{ brother.name }}!", data) == "Hello Chris!" ); CHECK( env.render("Hello {{ brother.daughter0.name }}!", data) == "Hello Maria!" ); - CHECK_THROWS_WITH( env.render("{{unknown}}", data), "Did not found json element: unknown" ); + // CHECK_THROWS_WITH( env.render("{{unknown}}", data), "[json.exception.out_of_range.403] key 'unknown' not found" ); } SECTION("other expression syntax") {