Author: dragonking
Date: Fri Jul 4 23:29:19 2008
New Revision: 27728
URL: http://svn.gna.org/viewcvs/wesnoth?rev=27728&view=rev
Log:
* new formula function: tomap()
* improved the sum() formula function
Modified:
trunk/src/formula_function.cpp
Modified: trunk/src/formula_function.cpp
URL:
http://svn.gna.org/viewcvs/wesnoth/trunk/src/formula_function.cpp?rev=27728&r1=27727&r2=27728&view=diff
==============================================================================
--- trunk/src/formula_function.cpp (original)
+++ trunk/src/formula_function.cpp Fri Jul 4 23:29:19 2008
@@ -307,6 +307,40 @@
}
};
+class tomap_function : public function_expression {
+public:
+ explicit tomap_function(const args_list& args)
+ : function_expression("values", args, 1, 2)
+ {}
+
+private:
+ variant execute(const formula_callable& variables) const {
+ const variant var_1 = args()[0]->evaluate(variables);
+
+ std::map<variant, variant> tmp;
+
+ if (args().size() == 2)
+ {
+ const variant var_2 = args()[1]->evaluate(variables);
+ if ( var_1.num_elements() != var_2.num_elements() )
+ return variant();
+ for(size_t i = 0; i < var_1.num_elements(); i++ )
+ tmp[ var_1[i] ] = var_2[i];
+ } else
+ {
+ variant_iterator it = var_1.get_iterator();
+ for(it = var_1.begin(); it != var_1.end(); ++it) {
+ std::map<variant, variant>::iterator map_it =
tmp.find( *it );
+ if (map_it == tmp.end())
+ tmp[ *it ] = variant( 1 );
+ else
+ map_it->second =
variant(map_it->second.as_int() + 1);
+ }
+ }
+
+ return variant( &tmp );
+ }
+};
class choose_function : public function_expression {
@@ -549,9 +583,34 @@
variant execute(const formula_callable& variables) const {
variant res(0);
const variant items = args()[0]->evaluate(variables);
- if(args().size() >= 2) {
- res = args()[1]->evaluate(variables);
- }
+ if (items.num_elements() > 0)
+ {
+ if (items[0].is_list() )
+ {
+ std::vector<variant> tmp;
+ res = variant(&tmp);
+ if(args().size() >= 2) {
+ res = args()[1]->evaluate(variables);
+ if(!res.is_list())
+ return variant();
+ }
+ } else if( items[0].is_map() )
+ {
+ std::map<variant,variant> tmp;
+ res = variant(&tmp);
+ if(args().size() >= 2) {
+ res = args()[1]->evaluate(variables);
+ if(!res.is_map())
+ return variant();
+ }
+ } else
+ {
+ if(args().size() >= 2) {
+ res = args()[1]->evaluate(variables);
+ }
+ }
+ }
+
for(size_t n = 0; n != items.num_elements(); ++n) {
res = res + items[n];
}
@@ -762,6 +821,7 @@
FUNCTION(keys);
FUNCTION(values);
FUNCTION(tolist);
+ FUNCTION(tomap);
#undef FUNCTION
}
_______________________________________________
Wesnoth-commits mailing list
[email protected]
https://mail.gna.org/listinfo/wesnoth-commits