Formula engine: New function to reverse a string

This commit is contained in:
Celtic Minstrel 2016-03-07 13:13:43 -05:00
parent 59dd9cc6af
commit 2637f23afd
3 changed files with 40 additions and 0 deletions

View File

@ -654,6 +654,28 @@ private:
}
};
class reverse_function : public function_expression {
public:
explicit reverse_function(const args_list& args)
: function_expression("reverse", args, 1, 1)
{}
private:
variant execute(const formula_callable& variables, formula_debugger *fdb) const {
const variant& arg = args()[0]->evaluate(variables,fdb);
if(arg.is_string()) {
std::string str = args()[0]->evaluate(variables,fdb).as_string();
std::reverse(str.begin(), str.end());
return variant(str);
} else if(arg.is_list()) {
std::vector<variant> list = args()[0]->evaluate(variables,fdb).as_list();
std::reverse(list.begin(), list.end());
return variant(&list);
}
return variant();
}
};
class contains_string_function : public function_expression {
public:
explicit contains_string_function(const args_list& args)
@ -1216,6 +1238,7 @@ functions_map& get_functions_map() {
FUNCTION(wave);
FUNCTION(sort);
FUNCTION(contains_string);
FUNCTION(reverse);
FUNCTION(filter);
FUNCTION(find);
FUNCTION(map);

View File

@ -592,6 +592,20 @@ const std::string& variant::as_string() const
return string_->str;
}
const std::vector<variant>& variant::as_list() const
{
must_be(TYPE_LIST);
assert(list_);
return list_->elements;
}
const std::map<variant,variant>& variant::as_map() const
{
must_be(TYPE_MAP);
assert(map_);
return map_->elements;
}
variant variant::operator+(const variant& v) const
{
if(type_ == TYPE_LIST) {

View File

@ -89,6 +89,9 @@ public:
bool as_bool() const;
bool is_list() const { return type_ == TYPE_LIST; }
const std::vector<variant>& as_list() const;
const std::map<variant,variant>& as_map() const;
const std::string& as_string() const;