1 #ifndef VARIANT_UTILS_HPP_INCLUDED
2 #define VARIANT_UTILS_HPP_INCLUDED
3 
4 #include <boost/function.hpp>
5 
6 #include <map>
7 
8 #include "foreach.hpp"
9 #include "formula_callable.hpp"
10 #include "variant.hpp"
11 
12 game_logic::formula_callable_ptr map_into_callable(variant v);
13 
14 //Function which will try to append list of variations. Behaviors:
15 //anya, nullb -> anya
16 //nulla, anyb -> anyb
17 //lista, listb -> lista + listb
18 //anya, listb -> [anya] + listb
19 //lista, anyb -> lista + [anyb]
20 //obja, objb -> [obja, objb]
21 //scalara, scalarb -> scalarb
22 //lista, scalarb -> lista + [scalarb]
23 variant append_variants(variant a, variant b);
24 
25 //parse a variant that may be a list of strings or a csv string. If null
26 //it will return an empty list.
27 std::vector<std::string> parse_variant_list_or_csv_string(variant v);
28 
29 void merge_variant_over(variant* aptr, variant b);
30 
31 void visit_variants(variant v, boost::function<void (variant)> fn);
32 
33 variant deep_copy_variant(variant v);
34 
35 template<typename Seq>
vector_to_variant(const Seq & seq)36 variant vector_to_variant(const Seq& seq) {
37 	std::vector<variant> v;
38 	foreach(const typename Seq::value_type& value, seq) {
39 		v.push_back(variant(value));
40 	}
41 
42 	return variant(&v);
43 }
44 
45 class variant_builder {
46 public:
47 
48 	template<typename T>
add(const std::string & name,const T & val)49 	variant_builder& add(const std::string& name, const T& val) {
50 		return add_value(name, variant(val));
51 	}
52 	template<typename T>
add(const std::string & name,T & val)53 	variant_builder& add(const std::string& name, T& val) {
54 		return add_value(name, variant(val));
55 	}
56 	variant_builder& add_value(const std::string& name, const variant& val);
57 
58 	template<typename T>
set(const std::string & name,const T & val)59 	variant_builder& set(const std::string& name, const T& val) {
60 		return set_value(name, variant(val));
61 	}
62 	template<typename T>
set(const std::string & name,T & val)63 	variant_builder& set(const std::string& name, T& val) {
64 		return set_value(name, variant(val));
65 	}
66 	variant_builder& set_value(const std::string& name, const variant& val);
67 
68 	void merge_object(variant obj);
69 
70 	variant build();
71 private:
72 	std::map<variant, std::vector<variant> > attr_;
73 };
74 #endif
75