Pyrogenesis  13997
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
SerializeTemplates.h
Go to the documentation of this file.
1 /* Copyright (C) 2011 Wildfire Games.
2  * This file is part of 0 A.D.
3  *
4  * 0 A.D. is free software: you can redistribute it and/or modify
5  * it under the terms of the GNU General Public License as published by
6  * the Free Software Foundation, either version 2 of the License, or
7  * (at your option) any later version.
8  *
9  * 0 A.D. is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12  * GNU General Public License for more details.
13  *
14  * You should have received a copy of the GNU General Public License
15  * along with 0 A.D. If not, see <http://www.gnu.org/licenses/>.
16  */
17 
18 #ifndef INCLUDED_SERIALIZETEMPLATES
19 #define INCLUDED_SERIALIZETEMPLATES
20 
21 /**
22  * @file
23  * Helper templates for serializing/deserializing common objects.
24  */
25 
27 
28 template<typename ELEM>
30 {
31  template<typename T>
32  void operator()(ISerializer& serialize, const char* name, std::vector<T>& value)
33  {
34  size_t len = value.size();
35  serialize.NumberU32_Unbounded("length", (u32)len);
36  for (size_t i = 0; i < len; ++i)
37  ELEM()(serialize, name, value[i]);
38  }
39 
40  template<typename T>
41  void operator()(IDeserializer& deserialize, const char* name, std::vector<T>& value)
42  {
43  value.clear();
44  u32 len;
45  deserialize.NumberU32_Unbounded("length", len);
46  value.reserve(len); // TODO: watch out for out-of-memory
47  for (size_t i = 0; i < len; ++i)
48  {
49  T el;
50  ELEM()(deserialize, name, el);
51  value.push_back(el);
52  }
53  }
54 };
55 
56 template<typename KS, typename VS>
58 {
59  template<typename K, typename V>
60  void operator()(ISerializer& serialize, const char* UNUSED(name), std::map<K, V>& value)
61  {
62  size_t len = value.size();
63  serialize.NumberU32_Unbounded("length", (u32)len);
64  for (typename std::map<K, V>::iterator it = value.begin(); it != value.end(); ++it)
65  {
66  KS()(serialize, "key", it->first);
67  VS()(serialize, "value", it->second);
68  }
69  }
70 
71  template<typename K, typename V, typename C>
72  void operator()(ISerializer& serialize, const char* UNUSED(name), std::map<K, V>& value, C& context)
73  {
74  size_t len = value.size();
75  serialize.NumberU32_Unbounded("length", (u32)len);
76  for (typename std::map<K, V>::iterator it = value.begin(); it != value.end(); ++it)
77  {
78  KS()(serialize, "key", it->first);
79  VS()(serialize, "value", it->second, context);
80  }
81  }
82 
83  template<typename M>
84  void operator()(IDeserializer& deserialize, const char* UNUSED(name), M& value)
85  {
86  typedef typename M::key_type K;
87  typedef typename M::value_type::second_type V; // M::data_type gives errors with gcc
88  value.clear();
89  u32 len;
90  deserialize.NumberU32_Unbounded("length", len);
91  for (size_t i = 0; i < len; ++i)
92  {
93  K k;
94  V v;
95  KS()(deserialize, "key", k);
96  VS()(deserialize, "value", v);
97  value.insert(std::make_pair(k, v));
98  }
99  }
100 
101  template<typename M, typename C>
102  void operator()(IDeserializer& deserialize, const char* UNUSED(name), M& value, C& context)
103  {
104  typedef typename M::key_type K;
105  typedef typename M::value_type::second_type V; // M::data_type gives errors with gcc
106  value.clear();
107  u32 len;
108  deserialize.NumberU32_Unbounded("length", len);
109  for (size_t i = 0; i < len; ++i)
110  {
111  K k;
112  V v;
113  KS()(deserialize, "key", k);
114  VS()(deserialize, "value", v, context);
115  value.insert(std::make_pair(k, v));
116  }
117  }
118 };
119 
120 // We have to order the map before serializing to make things consistent
121 template<typename KS, typename VS>
123 {
124  template<typename K, typename V>
125  void operator()(ISerializer& serialize, const char* name, boost::unordered_map<K, V>& value)
126  {
127  std::map<K, V> ordered_value(value.begin(), value.end());
128  SerializeMap<KS, VS>()(serialize, name, ordered_value);
129  }
130 
131  template<typename K, typename V>
132  void operator()(IDeserializer& deserialize, const char* name, boost::unordered_map<K, V>& value)
133  {
134  SerializeMap<KS, VS>()(deserialize, name, value);
135  }
136 };
137 
138 template<typename T, T max>
140 {
141  void operator()(ISerializer& serialize, const char* name, T value)
142  {
143  serialize.NumberU8(name, value, 0, max);
144  }
145 
146  void operator()(IDeserializer& deserialize, const char* name, T& value)
147  {
148  u8 val;
149  deserialize.NumberU8(name, val, 0, max);
150  value = (T)val;
151  }
152 };
153 
155 {
156  void operator()(ISerializer& serialize, const char* name, u32 value)
157  {
158  serialize.NumberU32_Unbounded(name, value);
159  }
160 
161  void operator()(IDeserializer& deserialize, const char* name, u32& value)
162  {
163  deserialize.NumberU32_Unbounded(name, value);
164  }
165 };
166 
168 {
169  void operator()(ISerializer& serialize, const char* name, i32 value)
170  {
171  serialize.NumberI32_Unbounded(name, value);
172  }
173 
174  void operator()(IDeserializer& deserialize, const char* name, i32& value)
175  {
176  deserialize.NumberI32_Unbounded(name, value);
177  }
178 };
179 
181 {
182  void operator()(ISerializer& serialize, const char* name, bool value)
183  {
184  serialize.Bool(name, value);
185  }
186 
187  void operator()(IDeserializer& deserialize, const char* name, bool& value)
188  {
189  deserialize.Bool(name, value);
190  }
191 };
192 
194 {
195  void operator()(ISerializer& serialize, const char* name, CScriptValRooted value)
196  {
197  serialize.ScriptVal(name, value);
198  }
199 
200  void operator()(IDeserializer& deserialize, const char* name, CScriptValRooted& value)
201  {
202  deserialize.ScriptVal(name, value);
203  }
204 };
205 
207 {
208  void operator()(ISerializer& serialize, const char* UNUSED(name), const ICmpPathfinder::Waypoint& value)
209  {
210  serialize.NumberFixed_Unbounded("waypoint x", value.x);
211  serialize.NumberFixed_Unbounded("waypoint z", value.z);
212  }
213 
214  void operator()(IDeserializer& deserialize, const char* UNUSED(name), ICmpPathfinder::Waypoint& value)
215  {
216  deserialize.NumberFixed_Unbounded("waypoint x", value.x);
217  deserialize.NumberFixed_Unbounded("waypoint z", value.z);
218  }
219 };
220 
222 {
223  template<typename S>
224  void operator()(S& serialize, const char* UNUSED(name), ICmpPathfinder::Goal& value)
225  {
227  serialize.NumberFixed_Unbounded("goal x", value.x);
228  serialize.NumberFixed_Unbounded("goal z", value.z);
229  serialize.NumberFixed_Unbounded("goal u x", value.u.X);
230  serialize.NumberFixed_Unbounded("goal u z", value.u.Y);
231  serialize.NumberFixed_Unbounded("goal v x", value.v.X);
232  serialize.NumberFixed_Unbounded("goal v z", value.v.Y);
233  serialize.NumberFixed_Unbounded("goal hw", value.hw);
234  serialize.NumberFixed_Unbounded("goal hh", value.hh);
235  }
236 };
237 
238 #endif // INCLUDED_SERIALIZETEMPLATES
void operator()(IDeserializer &deserialize, const char *name, std::vector< T > &value)
#define u8
Definition: types.h:39
void NumberFixed_Unbounded(const char *name, fixed value)
Serialize a number.
Definition: ISerializer.h:191
virtual void Bool(const char *name, bool &out)
#define UNUSED(param)
mark a function parameter as unused and avoid the corresponding compiler warning. ...
void operator()(ISerializer &serialize, const char *name, boost::unordered_map< K, V > &value)
CFixedVector2D v
void operator()(IDeserializer &deserialize, const char *name, CScriptValRooted &value)
#define i32
Definition: types.h:36
Serialization interface; see serialization overview.
Definition: ISerializer.h:120
virtual void NumberU32_Unbounded(const char *name, uint32_t &out)
void ScriptVal(const char *name, jsval value)
Serialize a jsval.
Definition: ISerializer.cpp:95
virtual void NumberFixed_Unbounded(const char *name, fixed &out)
void operator()(ISerializer &serialize, const char *name, const ICmpPathfinder::Waypoint &value)
void operator()(IDeserializer &deserialize, const char *name, M &value, C &context)
void operator()(ISerializer &serialize, const char *name, CScriptValRooted value)
void operator()(IDeserializer &deserialize, const char *name, ICmpPathfinder::Waypoint &value)
void operator()(IDeserializer &deserialize, const char *name, bool &value)
CFixedVector2D u
void Bool(const char *name, bool value)
Serialize a boolean.
Definition: ISerializer.h:199
#define T(string_literal)
Definition: secure_crt.cpp:70
void NumberU32_Unbounded(const char *name, uint32_t value)
Serialize a number.
Definition: ISerializer.h:171
void operator()(ISerializer &serialize, const char *name, u32 value)
void operator()(IDeserializer &deserialize, const char *name, i32 &value)
void operator()(IDeserializer &deserialize, const char *name, M &value)
enum ICmpPathfinder::Goal::Type type
void operator()(ISerializer &serialize, const char *name, std::map< K, V > &value)
virtual void NumberU8(const char *name, uint8_t &out, uint8_t lower, uint8_t upper)
#define u32
Definition: types.h:41
virtual void ScriptVal(const char *name, jsval &out)=0
Deserialize a jsval, replacing &#39;out&#39;.
void operator()(ISerializer &serialize, const char *name, i32 value)
void operator()(ISerializer &serialize, const char *name, T value)
void operator()(S &serialize, const char *name, ICmpPathfinder::Goal &value)
void operator()(IDeserializer &deserialize, const char *name, T &value)
void operator()(ISerializer &serialize, const char *name, bool value)
void NumberI32_Unbounded(const char *name, int32_t value)
Serialize a number.
Definition: ISerializer.h:176
void operator()(IDeserializer &deserialize, const char *name, boost::unordered_map< K, V > &value)
void operator()(ISerializer &serialize, const char *name, std::map< K, V > &value, C &context)
void operator()(IDeserializer &deserialize, const char *name, u32 &value)
void operator()(ISerializer &serialize, const char *name, std::vector< T > &value)
void NumberU8(const char *name, uint8_t value, uint8_t lower, uint8_t upper)
Serialize a number, which must be lower &lt;= value &lt;= upper.
Definition: ISerializer.cpp:28
Deserialization interface; see serialization overview.
Definition: IDeserializer.h:34
virtual void NumberI32_Unbounded(const char *name, int32_t &out)