Inja 3.4.0
A Template Engine for Modern C++
Loading...
Searching...
No Matches
function_storage.hpp
1#ifndef INCLUDE_INJA_FUNCTION_STORAGE_HPP_
2#define INCLUDE_INJA_FUNCTION_STORAGE_HPP_
3
4#include <string_view>
5#include <vector>
6
7namespace inja {
8
9using Arguments = std::vector<const json*>;
10using CallbackFunction = std::function<json(Arguments& args)>;
11using VoidCallbackFunction = std::function<void(Arguments& args)>;
12
17public:
18 enum class Operation {
19 Not,
20 And,
21 Or,
22 In,
23 Equal,
24 NotEqual,
25 Greater,
26 GreaterEqual,
27 Less,
28 LessEqual,
29 Add,
30 Subtract,
31 Multiplication,
32 Division,
33 Power,
34 Modulo,
35 AtId,
36 At,
37 Default,
38 DivisibleBy,
39 Even,
40 Exists,
41 ExistsInObject,
42 First,
43 Float,
44 Int,
45 IsArray,
46 IsBoolean,
47 IsFloat,
48 IsInteger,
49 IsNumber,
50 IsObject,
51 IsString,
52 Last,
53 Length,
54 Lower,
55 Max,
56 Min,
57 Odd,
58 Range,
59 Round,
60 Sort,
61 Upper,
62 Super,
63 Join,
64 Callback,
65 None,
66 };
67
68 struct FunctionData {
69 explicit FunctionData(const Operation& op, const CallbackFunction& cb = CallbackFunction {}): operation(op), callback(cb) {}
70 const Operation operation;
71 const CallbackFunction callback;
72 };
73
74private:
75 const int VARIADIC {-1};
76
77 std::map<std::pair<std::string, int>, FunctionData> function_storage = {
78 {std::make_pair("at", 2), FunctionData {Operation::At}},
79 {std::make_pair("default", 2), FunctionData {Operation::Default}},
80 {std::make_pair("divisibleBy", 2), FunctionData {Operation::DivisibleBy}},
81 {std::make_pair("even", 1), FunctionData {Operation::Even}},
82 {std::make_pair("exists", 1), FunctionData {Operation::Exists}},
83 {std::make_pair("existsIn", 2), FunctionData {Operation::ExistsInObject}},
84 {std::make_pair("first", 1), FunctionData {Operation::First}},
85 {std::make_pair("float", 1), FunctionData {Operation::Float}},
86 {std::make_pair("int", 1), FunctionData {Operation::Int}},
87 {std::make_pair("isArray", 1), FunctionData {Operation::IsArray}},
88 {std::make_pair("isBoolean", 1), FunctionData {Operation::IsBoolean}},
89 {std::make_pair("isFloat", 1), FunctionData {Operation::IsFloat}},
90 {std::make_pair("isInteger", 1), FunctionData {Operation::IsInteger}},
91 {std::make_pair("isNumber", 1), FunctionData {Operation::IsNumber}},
92 {std::make_pair("isObject", 1), FunctionData {Operation::IsObject}},
93 {std::make_pair("isString", 1), FunctionData {Operation::IsString}},
94 {std::make_pair("last", 1), FunctionData {Operation::Last}},
95 {std::make_pair("length", 1), FunctionData {Operation::Length}},
96 {std::make_pair("lower", 1), FunctionData {Operation::Lower}},
97 {std::make_pair("max", 1), FunctionData {Operation::Max}},
98 {std::make_pair("min", 1), FunctionData {Operation::Min}},
99 {std::make_pair("odd", 1), FunctionData {Operation::Odd}},
100 {std::make_pair("range", 1), FunctionData {Operation::Range}},
101 {std::make_pair("round", 2), FunctionData {Operation::Round}},
102 {std::make_pair("sort", 1), FunctionData {Operation::Sort}},
103 {std::make_pair("upper", 1), FunctionData {Operation::Upper}},
104 {std::make_pair("super", 0), FunctionData {Operation::Super}},
105 {std::make_pair("super", 1), FunctionData {Operation::Super}},
106 {std::make_pair("join", 2), FunctionData {Operation::Join}},
107 };
108
109public:
110 void add_builtin(std::string_view name, int num_args, Operation op) {
111 function_storage.emplace(std::make_pair(static_cast<std::string>(name), num_args), FunctionData {op});
112 }
113
114 void add_callback(std::string_view name, int num_args, const CallbackFunction& callback) {
115 function_storage.emplace(std::make_pair(static_cast<std::string>(name), num_args), FunctionData {Operation::Callback, callback});
116 }
117
118 FunctionData find_function(std::string_view name, int num_args) const {
119 auto it = function_storage.find(std::make_pair(static_cast<std::string>(name), num_args));
120 if (it != function_storage.end()) {
121 return it->second;
122
123 // Find variadic function
124 } else if (num_args > 0) {
125 it = function_storage.find(std::make_pair(static_cast<std::string>(name), VARIADIC));
126 if (it != function_storage.end()) {
127 return it->second;
128 }
129 }
130
131 return FunctionData {Operation::None};
132 }
133};
134
135} // namespace inja
136
137#endif // INCLUDE_INJA_FUNCTION_STORAGE_HPP_
Class for builtin functions and user-defined callbacks.
Definition: function_storage.hpp:16
Definition: function_storage.hpp:68