1 #ifndef INCLUDE_INJA_FUNCTION_STORAGE_HPP_
2 #define INCLUDE_INJA_FUNCTION_STORAGE_HPP_
9 using Arguments = std::vector<const json*>;
10 using CallbackFunction = std::function<json(Arguments& args)>;
11 using VoidCallbackFunction = std::function<void(Arguments& args)>;
18 enum class Operation {
69 explicit FunctionData(
const Operation& op,
const CallbackFunction& cb = CallbackFunction {}): operation(op), callback(cb) {}
70 const Operation operation;
71 const CallbackFunction callback;
75 const int VARIADIC {-1};
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}},
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});
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});
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()) {
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()) {
131 return FunctionData {Operation::None};
Class for builtin functions and user-defined callbacks.
Definition: function_storage.hpp:16
Definition: function_storage.hpp:68