Inja  3.4.0
A Template Engine for Modern C++
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 
7 namespace inja {
8 
9 using Arguments = std::vector<const json*>;
10 using CallbackFunction = std::function<json(Arguments& args)>;
11 using VoidCallbackFunction = std::function<void(Arguments& args)>;
12 
17 public:
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 
74 private:
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 
109 public:
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