From 2637f23afd821034b23c63498ee9789a16c2e5b7 Mon Sep 17 00:00:00 2001 From: Celtic Minstrel Date: Mon, 7 Mar 2016 13:13:43 -0500 Subject: [PATCH] Formula engine: New function to reverse a string --- src/formula_function.cpp | 23 +++++++++++++++++++++++ src/variant.cpp | 14 ++++++++++++++ src/variant.hpp | 3 +++ 3 files changed, 40 insertions(+) diff --git a/src/formula_function.cpp b/src/formula_function.cpp index 2a195ef1f90..026c80510d8 100644 --- a/src/formula_function.cpp +++ b/src/formula_function.cpp @@ -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 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); diff --git a/src/variant.cpp b/src/variant.cpp index b60c194e633..1ce8b49fbd2 100644 --- a/src/variant.cpp +++ b/src/variant.cpp @@ -592,6 +592,20 @@ const std::string& variant::as_string() const return string_->str; } +const std::vector& variant::as_list() const +{ + must_be(TYPE_LIST); + assert(list_); + return list_->elements; +} + +const std::map& variant::as_map() const +{ + must_be(TYPE_MAP); + assert(map_); + return map_->elements; +} + variant variant::operator+(const variant& v) const { if(type_ == TYPE_LIST) { diff --git a/src/variant.hpp b/src/variant.hpp index 310df450bfe..e4f961add2f 100644 --- a/src/variant.hpp +++ b/src/variant.hpp @@ -89,6 +89,9 @@ public: bool as_bool() const; bool is_list() const { return type_ == TYPE_LIST; } + + const std::vector& as_list() const; + const std::map& as_map() const; const std::string& as_string() const;