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