From 4c6b263c2f8e32f45292392e7c6d14c3e70bb521 Mon Sep 17 00:00:00 2001 From: pantor Date: Sat, 18 Oct 2025 06:42:10 -0700 Subject: [PATCH] fix some clang-tidy warnings --- include/inja/environment.hpp | 2 +- include/inja/node.hpp | 34 +++++------ include/inja/parser.hpp | 10 ++-- include/inja/renderer.hpp | 34 +++++------ include/inja/statistics.hpp | 32 +++++----- single_include/inja/inja.hpp | 112 +++++++++++++++++------------------ 6 files changed, 112 insertions(+), 112 deletions(-) diff --git a/include/inja/environment.hpp b/include/inja/environment.hpp index d514b3a..64e3f6b 100644 --- a/include/inja/environment.hpp +++ b/include/inja/environment.hpp @@ -164,7 +164,7 @@ public: } std::string load_file(const std::string& filename) { - Parser parser(parser_config, lexer_config, template_storage, function_storage); + const Parser parser(parser_config, lexer_config, template_storage, function_storage); return Parser::load_file(input_path / filename); } diff --git a/include/inja/node.hpp b/include/inja/node.hpp index 409045a..21456ca 100644 --- a/include/inja/node.hpp +++ b/include/inja/node.hpp @@ -63,7 +63,7 @@ public: size_t pos; - AstNode(size_t pos): pos(pos) {} + explicit AstNode(size_t pos): pos(pos) {} virtual ~AstNode() {} }; @@ -73,7 +73,7 @@ public: explicit BlockNode(): AstNode(0) {} - void accept(NodeVisitor& v) const { + void accept(NodeVisitor& v) const override { v.visit(*this); } }; @@ -84,7 +84,7 @@ public: explicit TextNode(size_t pos, size_t length): AstNode(pos), length(length) {} - void accept(NodeVisitor& v) const { + void accept(NodeVisitor& v) const override { v.visit(*this); } }; @@ -93,7 +93,7 @@ class ExpressionNode : public AstNode { public: explicit ExpressionNode(size_t pos): AstNode(pos) {} - void accept(NodeVisitor& v) const { + void accept(NodeVisitor& v) const override { v.visit(*this); } }; @@ -104,7 +104,7 @@ public: explicit LiteralNode(std::string_view data_text, size_t pos): ExpressionNode(pos), value(json::parse(data_text)) {} - void accept(NodeVisitor& v) const { + void accept(NodeVisitor& v) const override { v.visit(*this); } }; @@ -127,7 +127,7 @@ public: explicit DataNode(std::string_view ptr_name, size_t pos): ExpressionNode(pos), name(ptr_name), ptr(json::json_pointer(convert_dot_to_ptr(ptr_name))) {} - void accept(NodeVisitor& v) const { + void accept(NodeVisitor& v) const override { v.visit(*this); } }; @@ -247,7 +247,7 @@ public: } } - void accept(NodeVisitor& v) const { + void accept(NodeVisitor& v) const override { v.visit(*this); } }; @@ -259,14 +259,14 @@ public: explicit ExpressionListNode(): AstNode(0) {} explicit ExpressionListNode(size_t pos): AstNode(pos) {} - void accept(NodeVisitor& v) const { + void accept(NodeVisitor& v) const override { v.visit(*this); } }; class StatementNode : public AstNode { public: - StatementNode(size_t pos): AstNode(pos) {} + explicit StatementNode(size_t pos): AstNode(pos) {} virtual void accept(NodeVisitor& v) const = 0; }; @@ -277,7 +277,7 @@ public: BlockNode body; BlockNode* const parent; - ForStatementNode(BlockNode* const parent, size_t pos): StatementNode(pos), parent(parent) {} + explicit ForStatementNode(BlockNode* const parent, size_t pos): StatementNode(pos), parent(parent) {} virtual void accept(NodeVisitor& v) const = 0; }; @@ -288,7 +288,7 @@ public: explicit ForArrayStatementNode(const std::string& value, BlockNode* const parent, size_t pos): ForStatementNode(parent, pos), value(value) {} - void accept(NodeVisitor& v) const { + void accept(NodeVisitor& v) const override { v.visit(*this); } }; @@ -301,7 +301,7 @@ public: explicit ForObjectStatementNode(const std::string& key, const std::string& value, BlockNode* const parent, size_t pos) : ForStatementNode(parent, pos), key(key), value(value) {} - void accept(NodeVisitor& v) const { + void accept(NodeVisitor& v) const override { v.visit(*this); } }; @@ -319,7 +319,7 @@ public: explicit IfStatementNode(BlockNode* const parent, size_t pos): StatementNode(pos), parent(parent), is_nested(false) {} explicit IfStatementNode(bool is_nested, BlockNode* const parent, size_t pos): StatementNode(pos), parent(parent), is_nested(is_nested) {} - void accept(NodeVisitor& v) const { + void accept(NodeVisitor& v) const override { v.visit(*this); } }; @@ -330,7 +330,7 @@ public: explicit IncludeStatementNode(const std::string& file, size_t pos): StatementNode(pos), file(file) {} - void accept(NodeVisitor& v) const { + void accept(NodeVisitor& v) const override { v.visit(*this); } }; @@ -341,7 +341,7 @@ public: explicit ExtendsStatementNode(const std::string& file, size_t pos): StatementNode(pos), file(file) {} - void accept(NodeVisitor& v) const { + void accept(NodeVisitor& v) const override { v.visit(*this); } }; @@ -354,7 +354,7 @@ public: explicit BlockStatementNode(BlockNode* const parent, const std::string& name, size_t pos): StatementNode(pos), name(name), parent(parent) {} - void accept(NodeVisitor& v) const { + void accept(NodeVisitor& v) const override { v.visit(*this); } }; @@ -366,7 +366,7 @@ public: explicit SetStatementNode(const std::string& key, size_t pos): StatementNode(pos), key(key) {} - void accept(NodeVisitor& v) const { + void accept(NodeVisitor& v) const override { v.visit(*this); } }; diff --git a/include/inja/parser.hpp b/include/inja/parser.hpp index 4b9d225..53098df 100644 --- a/include/inja/parser.hpp +++ b/include/inja/parser.hpp @@ -48,11 +48,11 @@ class Parser { std::stack for_statement_stack; std::stack block_statement_stack; - inline void throw_parser_error(const std::string& message) const { + void throw_parser_error(const std::string& message) const { INJA_THROW(ParserError(message, lexer.current_position())); } - inline void get_next_token() { + void get_next_token() { if (have_peek_tok) { tok = peek_tok; have_peek_tok = false; @@ -61,19 +61,19 @@ class Parser { } } - inline void get_peek_token() { + void get_peek_token() { if (!have_peek_tok) { peek_tok = lexer.scan(); have_peek_tok = true; } } - inline void add_literal(Arguments &arguments, const char* content_ptr) { + void add_literal(Arguments &arguments, const char* content_ptr) { const std::string_view data_text(literal_start.data(), tok.text.data() - literal_start.data() + tok.text.size()); arguments.emplace_back(std::make_shared(data_text, data_text.data() - content_ptr)); } - inline void add_operator(Arguments &arguments, OperatorStack &operator_stack) { + void add_operator(Arguments &arguments, OperatorStack &operator_stack) { auto function = operator_stack.top(); operator_stack.pop(); diff --git a/include/inja/renderer.hpp b/include/inja/renderer.hpp index 654f51f..dbefa4a 100644 --- a/include/inja/renderer.hpp +++ b/include/inja/renderer.hpp @@ -196,7 +196,7 @@ class Renderer : public NodeVisitor { return result; } - void visit(const BlockNode& node) { + void visit(const BlockNode& node) override { for (const auto& n : node.nodes) { n->accept(*this); @@ -206,17 +206,17 @@ class Renderer : public NodeVisitor { } } - void visit(const TextNode& node) { + void visit(const TextNode& node) override { output_stream->write(current_template->content.c_str() + node.pos, node.length); } - void visit(const ExpressionNode&) {} + void visit(const ExpressionNode&) override {} - void visit(const LiteralNode& node) { + void visit(const LiteralNode& node) override { data_eval_stack.push(&node.value); } - void visit(const DataNode& node) { + void visit(const DataNode& node) override { if (additional_data.contains(node.ptr)) { data_eval_stack.push(&(additional_data[node.ptr])); } else if (data_input->contains(node.ptr)) { @@ -236,7 +236,7 @@ class Renderer : public NodeVisitor { } } - void visit(const FunctionNode& node) { + void visit(const FunctionNode& node) override { switch (node.operation) { case Op::Not: { const auto args = get_arguments<1>(node); @@ -516,15 +516,15 @@ class Renderer : public NodeVisitor { } } - void visit(const ExpressionListNode& node) { + void visit(const ExpressionListNode& node) override { print_data(eval_expression_list(node)); } - void visit(const StatementNode&) {} + void visit(const StatementNode&) override {} - void visit(const ForStatementNode&) {} + void visit(const ForStatementNode&) override {} - void visit(const ForArrayStatementNode& node) { + void visit(const ForArrayStatementNode& node) override { const auto result = eval_expression_list(node.condition); if (!result->is_array()) { throw_renderer_error("object must be an array", node); @@ -563,7 +563,7 @@ class Renderer : public NodeVisitor { } } - void visit(const ForObjectStatementNode& node) { + void visit(const ForObjectStatementNode& node) override { const auto result = eval_expression_list(node.condition); if (!result->is_object()) { throw_renderer_error("object must be an object", node); @@ -602,7 +602,7 @@ class Renderer : public NodeVisitor { } } - void visit(const IfStatementNode& node) { + void visit(const IfStatementNode& node) override { const auto result = eval_expression_list(node.condition); if (truthy(result.get())) { node.true_statement.accept(*this); @@ -611,7 +611,7 @@ class Renderer : public NodeVisitor { } } - void visit(const IncludeStatementNode& node) { + void visit(const IncludeStatementNode& node) override { auto sub_renderer = Renderer(config, template_storage, function_storage); const auto included_template_it = template_storage.find(node.file); if (included_template_it != template_storage.end()) { @@ -621,7 +621,7 @@ class Renderer : public NodeVisitor { } } - void visit(const ExtendsStatementNode& node) { + void visit(const ExtendsStatementNode& node) override { const auto included_template_it = template_storage.find(node.file); if (included_template_it != template_storage.end()) { const Template* parent_template = &included_template_it->second; @@ -632,7 +632,7 @@ class Renderer : public NodeVisitor { } } - void visit(const BlockStatementNode& node) { + void visit(const BlockStatementNode& node) override { const size_t old_level = current_level; current_level = 0; current_template = template_stack.front(); @@ -646,7 +646,7 @@ class Renderer : public NodeVisitor { current_template = template_stack.back(); } - void visit(const SetStatementNode& node) { + void visit(const SetStatementNode& node) override { std::string ptr = node.key; replace_substring(ptr, ".", "/"); ptr = "/" + ptr; @@ -654,7 +654,7 @@ class Renderer : public NodeVisitor { } public: - Renderer(const RenderConfig& config, const TemplateStorage& template_storage, const FunctionStorage& function_storage) + explicit Renderer(const RenderConfig& config, const TemplateStorage& template_storage, const FunctionStorage& function_storage) : config(config), template_storage(template_storage), function_storage(function_storage) {} void render_to(std::ostream& os, const Template& tmpl, const json& data, json* loop_data = nullptr) { diff --git a/include/inja/statistics.hpp b/include/inja/statistics.hpp index 3a7294c..3405080 100644 --- a/include/inja/statistics.hpp +++ b/include/inja/statistics.hpp @@ -9,58 +9,58 @@ namespace inja { * \brief A class for counting statistics on a Template. */ class StatisticsVisitor : public NodeVisitor { - void visit(const BlockNode& node) { + void visit(const BlockNode& node) override { for (const auto& n : node.nodes) { n->accept(*this); } } - void visit(const TextNode&) {} - void visit(const ExpressionNode&) {} - void visit(const LiteralNode&) {} + void visit(const TextNode&) override {} + void visit(const ExpressionNode&) override {} + void visit(const LiteralNode&) override {} - void visit(const DataNode&) { + void visit(const DataNode&) override { variable_counter += 1; } - void visit(const FunctionNode& node) { + void visit(const FunctionNode& node) override { for (const auto& n : node.arguments) { n->accept(*this); } } - void visit(const ExpressionListNode& node) { + void visit(const ExpressionListNode& node) override { node.root->accept(*this); } - void visit(const StatementNode&) {} - void visit(const ForStatementNode&) {} + void visit(const StatementNode&) override {} + void visit(const ForStatementNode&) override {} - void visit(const ForArrayStatementNode& node) { + void visit(const ForArrayStatementNode& node) override { node.condition.accept(*this); node.body.accept(*this); } - void visit(const ForObjectStatementNode& node) { + void visit(const ForObjectStatementNode& node) override { node.condition.accept(*this); node.body.accept(*this); } - void visit(const IfStatementNode& node) { + void visit(const IfStatementNode& node) override { node.condition.accept(*this); node.true_statement.accept(*this); node.false_statement.accept(*this); } - void visit(const IncludeStatementNode&) {} + void visit(const IncludeStatementNode&) override {} - void visit(const ExtendsStatementNode&) {} + void visit(const ExtendsStatementNode&) override {} - void visit(const BlockStatementNode& node) { + void visit(const BlockStatementNode& node) override { node.block.accept(*this); } - void visit(const SetStatementNode&) {} + void visit(const SetStatementNode&) override {} public: size_t variable_counter; diff --git a/single_include/inja/inja.hpp b/single_include/inja/inja.hpp index 8d08465..9bfaf98 100644 --- a/single_include/inja/inja.hpp +++ b/single_include/inja/inja.hpp @@ -428,7 +428,7 @@ public: size_t pos; - AstNode(size_t pos): pos(pos) {} + explicit AstNode(size_t pos): pos(pos) {} virtual ~AstNode() {} }; @@ -438,7 +438,7 @@ public: explicit BlockNode(): AstNode(0) {} - void accept(NodeVisitor& v) const { + void accept(NodeVisitor& v) const override { v.visit(*this); } }; @@ -449,7 +449,7 @@ public: explicit TextNode(size_t pos, size_t length): AstNode(pos), length(length) {} - void accept(NodeVisitor& v) const { + void accept(NodeVisitor& v) const override { v.visit(*this); } }; @@ -458,7 +458,7 @@ class ExpressionNode : public AstNode { public: explicit ExpressionNode(size_t pos): AstNode(pos) {} - void accept(NodeVisitor& v) const { + void accept(NodeVisitor& v) const override { v.visit(*this); } }; @@ -469,7 +469,7 @@ public: explicit LiteralNode(std::string_view data_text, size_t pos): ExpressionNode(pos), value(json::parse(data_text)) {} - void accept(NodeVisitor& v) const { + void accept(NodeVisitor& v) const override { v.visit(*this); } }; @@ -492,7 +492,7 @@ public: explicit DataNode(std::string_view ptr_name, size_t pos): ExpressionNode(pos), name(ptr_name), ptr(json::json_pointer(convert_dot_to_ptr(ptr_name))) {} - void accept(NodeVisitor& v) const { + void accept(NodeVisitor& v) const override { v.visit(*this); } }; @@ -612,7 +612,7 @@ public: } } - void accept(NodeVisitor& v) const { + void accept(NodeVisitor& v) const override { v.visit(*this); } }; @@ -624,14 +624,14 @@ public: explicit ExpressionListNode(): AstNode(0) {} explicit ExpressionListNode(size_t pos): AstNode(pos) {} - void accept(NodeVisitor& v) const { + void accept(NodeVisitor& v) const override { v.visit(*this); } }; class StatementNode : public AstNode { public: - StatementNode(size_t pos): AstNode(pos) {} + explicit StatementNode(size_t pos): AstNode(pos) {} virtual void accept(NodeVisitor& v) const = 0; }; @@ -642,7 +642,7 @@ public: BlockNode body; BlockNode* const parent; - ForStatementNode(BlockNode* const parent, size_t pos): StatementNode(pos), parent(parent) {} + explicit ForStatementNode(BlockNode* const parent, size_t pos): StatementNode(pos), parent(parent) {} virtual void accept(NodeVisitor& v) const = 0; }; @@ -653,7 +653,7 @@ public: explicit ForArrayStatementNode(const std::string& value, BlockNode* const parent, size_t pos): ForStatementNode(parent, pos), value(value) {} - void accept(NodeVisitor& v) const { + void accept(NodeVisitor& v) const override { v.visit(*this); } }; @@ -666,7 +666,7 @@ public: explicit ForObjectStatementNode(const std::string& key, const std::string& value, BlockNode* const parent, size_t pos) : ForStatementNode(parent, pos), key(key), value(value) {} - void accept(NodeVisitor& v) const { + void accept(NodeVisitor& v) const override { v.visit(*this); } }; @@ -684,7 +684,7 @@ public: explicit IfStatementNode(BlockNode* const parent, size_t pos): StatementNode(pos), parent(parent), is_nested(false) {} explicit IfStatementNode(bool is_nested, BlockNode* const parent, size_t pos): StatementNode(pos), parent(parent), is_nested(is_nested) {} - void accept(NodeVisitor& v) const { + void accept(NodeVisitor& v) const override { v.visit(*this); } }; @@ -695,7 +695,7 @@ public: explicit IncludeStatementNode(const std::string& file, size_t pos): StatementNode(pos), file(file) {} - void accept(NodeVisitor& v) const { + void accept(NodeVisitor& v) const override { v.visit(*this); } }; @@ -706,7 +706,7 @@ public: explicit ExtendsStatementNode(const std::string& file, size_t pos): StatementNode(pos), file(file) {} - void accept(NodeVisitor& v) const { + void accept(NodeVisitor& v) const override { v.visit(*this); } }; @@ -719,7 +719,7 @@ public: explicit BlockStatementNode(BlockNode* const parent, const std::string& name, size_t pos): StatementNode(pos), name(name), parent(parent) {} - void accept(NodeVisitor& v) const { + void accept(NodeVisitor& v) const override { v.visit(*this); } }; @@ -731,7 +731,7 @@ public: explicit SetStatementNode(const std::string& key, size_t pos): StatementNode(pos), key(key) {} - void accept(NodeVisitor& v) const { + void accept(NodeVisitor& v) const override { v.visit(*this); } }; @@ -753,58 +753,58 @@ namespace inja { * \brief A class for counting statistics on a Template. */ class StatisticsVisitor : public NodeVisitor { - void visit(const BlockNode& node) { + void visit(const BlockNode& node) override { for (const auto& n : node.nodes) { n->accept(*this); } } - void visit(const TextNode&) {} - void visit(const ExpressionNode&) {} - void visit(const LiteralNode&) {} + void visit(const TextNode&) override {} + void visit(const ExpressionNode&) override {} + void visit(const LiteralNode&) override {} - void visit(const DataNode&) { + void visit(const DataNode&) override { variable_counter += 1; } - void visit(const FunctionNode& node) { + void visit(const FunctionNode& node) override { for (const auto& n : node.arguments) { n->accept(*this); } } - void visit(const ExpressionListNode& node) { + void visit(const ExpressionListNode& node) override { node.root->accept(*this); } - void visit(const StatementNode&) {} - void visit(const ForStatementNode&) {} + void visit(const StatementNode&) override {} + void visit(const ForStatementNode&) override {} - void visit(const ForArrayStatementNode& node) { + void visit(const ForArrayStatementNode& node) override { node.condition.accept(*this); node.body.accept(*this); } - void visit(const ForObjectStatementNode& node) { + void visit(const ForObjectStatementNode& node) override { node.condition.accept(*this); node.body.accept(*this); } - void visit(const IfStatementNode& node) { + void visit(const IfStatementNode& node) override { node.condition.accept(*this); node.true_statement.accept(*this); node.false_statement.accept(*this); } - void visit(const IncludeStatementNode&) {} + void visit(const IncludeStatementNode&) override {} - void visit(const ExtendsStatementNode&) {} + void visit(const ExtendsStatementNode&) override {} - void visit(const BlockStatementNode& node) { + void visit(const BlockStatementNode& node) override { node.block.accept(*this); } - void visit(const SetStatementNode&) {} + void visit(const SetStatementNode&) override {} public: size_t variable_counter; @@ -1498,11 +1498,11 @@ class Parser { std::stack for_statement_stack; std::stack block_statement_stack; - inline void throw_parser_error(const std::string& message) const { + void throw_parser_error(const std::string& message) const { INJA_THROW(ParserError(message, lexer.current_position())); } - inline void get_next_token() { + void get_next_token() { if (have_peek_tok) { tok = peek_tok; have_peek_tok = false; @@ -1511,19 +1511,19 @@ class Parser { } } - inline void get_peek_token() { + void get_peek_token() { if (!have_peek_tok) { peek_tok = lexer.scan(); have_peek_tok = true; } } - inline void add_literal(Arguments &arguments, const char* content_ptr) { + void add_literal(Arguments &arguments, const char* content_ptr) { const std::string_view data_text(literal_start.data(), tok.text.data() - literal_start.data() + tok.text.size()); arguments.emplace_back(std::make_shared(data_text, data_text.data() - content_ptr)); } - inline void add_operator(Arguments &arguments, OperatorStack &operator_stack) { + void add_operator(Arguments &arguments, OperatorStack &operator_stack) { auto function = operator_stack.top(); operator_stack.pop(); @@ -2349,7 +2349,7 @@ class Renderer : public NodeVisitor { return result; } - void visit(const BlockNode& node) { + void visit(const BlockNode& node) override { for (const auto& n : node.nodes) { n->accept(*this); @@ -2359,17 +2359,17 @@ class Renderer : public NodeVisitor { } } - void visit(const TextNode& node) { + void visit(const TextNode& node) override { output_stream->write(current_template->content.c_str() + node.pos, node.length); } - void visit(const ExpressionNode&) {} + void visit(const ExpressionNode&) override {} - void visit(const LiteralNode& node) { + void visit(const LiteralNode& node) override { data_eval_stack.push(&node.value); } - void visit(const DataNode& node) { + void visit(const DataNode& node) override { if (additional_data.contains(node.ptr)) { data_eval_stack.push(&(additional_data[node.ptr])); } else if (data_input->contains(node.ptr)) { @@ -2389,7 +2389,7 @@ class Renderer : public NodeVisitor { } } - void visit(const FunctionNode& node) { + void visit(const FunctionNode& node) override { switch (node.operation) { case Op::Not: { const auto args = get_arguments<1>(node); @@ -2669,15 +2669,15 @@ class Renderer : public NodeVisitor { } } - void visit(const ExpressionListNode& node) { + void visit(const ExpressionListNode& node) override { print_data(eval_expression_list(node)); } - void visit(const StatementNode&) {} + void visit(const StatementNode&) override {} - void visit(const ForStatementNode&) {} + void visit(const ForStatementNode&) override {} - void visit(const ForArrayStatementNode& node) { + void visit(const ForArrayStatementNode& node) override { const auto result = eval_expression_list(node.condition); if (!result->is_array()) { throw_renderer_error("object must be an array", node); @@ -2716,7 +2716,7 @@ class Renderer : public NodeVisitor { } } - void visit(const ForObjectStatementNode& node) { + void visit(const ForObjectStatementNode& node) override { const auto result = eval_expression_list(node.condition); if (!result->is_object()) { throw_renderer_error("object must be an object", node); @@ -2755,7 +2755,7 @@ class Renderer : public NodeVisitor { } } - void visit(const IfStatementNode& node) { + void visit(const IfStatementNode& node) override { const auto result = eval_expression_list(node.condition); if (truthy(result.get())) { node.true_statement.accept(*this); @@ -2764,7 +2764,7 @@ class Renderer : public NodeVisitor { } } - void visit(const IncludeStatementNode& node) { + void visit(const IncludeStatementNode& node) override { auto sub_renderer = Renderer(config, template_storage, function_storage); const auto included_template_it = template_storage.find(node.file); if (included_template_it != template_storage.end()) { @@ -2774,7 +2774,7 @@ class Renderer : public NodeVisitor { } } - void visit(const ExtendsStatementNode& node) { + void visit(const ExtendsStatementNode& node) override { const auto included_template_it = template_storage.find(node.file); if (included_template_it != template_storage.end()) { const Template* parent_template = &included_template_it->second; @@ -2785,7 +2785,7 @@ class Renderer : public NodeVisitor { } } - void visit(const BlockStatementNode& node) { + void visit(const BlockStatementNode& node) override { const size_t old_level = current_level; current_level = 0; current_template = template_stack.front(); @@ -2799,7 +2799,7 @@ class Renderer : public NodeVisitor { current_template = template_stack.back(); } - void visit(const SetStatementNode& node) { + void visit(const SetStatementNode& node) override { std::string ptr = node.key; replace_substring(ptr, ".", "/"); ptr = "/" + ptr; @@ -2807,7 +2807,7 @@ class Renderer : public NodeVisitor { } public: - Renderer(const RenderConfig& config, const TemplateStorage& template_storage, const FunctionStorage& function_storage) + explicit Renderer(const RenderConfig& config, const TemplateStorage& template_storage, const FunctionStorage& function_storage) : config(config), template_storage(template_storage), function_storage(function_storage) {} void render_to(std::ostream& os, const Template& tmpl, const json& data, json* loop_data = nullptr) { @@ -2983,7 +2983,7 @@ public: } std::string load_file(const std::string& filename) { - Parser parser(parser_config, lexer_config, template_storage, function_storage); + const Parser parser(parser_config, lexer_config, template_storage, function_storage); return Parser::load_file(input_path / filename); }