00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020 #ifndef VALUE_TRANSLATOR_HPP_INCLUDED
00021 #define VALUE_TRANSLATOR_HPP_INCLUDED
00022
00023 #include "engine.hpp"
00024 #include "stage.hpp"
00025
00026 #include "../manager.hpp"
00027 #include "../../terrain_filter.hpp"
00028 #include "../../util.hpp"
00029 #include "../../serialization/string_utils.hpp"
00030 #include "../../resources.hpp"
00031
00032 namespace ai {
00033
00034 template<typename T>
00035 class config_value_translator {
00036 public:
00037
00038 static T cfg_to_value(const config &cfg)
00039 {
00040 return lexical_cast_default<T>(cfg["value"]);
00041 }
00042
00043 static void cfg_to_value(const config &cfg, T &value)
00044 {
00045 value = cfg_to_value(cfg);
00046 }
00047
00048 static void value_to_cfg(const T &value, config &cfg)
00049 {
00050 cfg["value"] = str_cast(value);
00051 }
00052
00053 static config value_to_cfg(const T &value)
00054 {
00055 config cfg;
00056 value_to_cfg(value,cfg);
00057 return cfg;
00058 }
00059 };
00060
00061
00062 template<>
00063 class config_value_translator<bool> {
00064 public:
00065
00066 static bool cfg_to_value(const config &cfg)
00067 {
00068 return cfg["value"].to_bool();
00069 }
00070
00071 static void cfg_to_value(const config &cfg, bool &value)
00072 {
00073 value = cfg_to_value(cfg);
00074 }
00075
00076 static void value_to_cfg(const bool &value, config &cfg)
00077 {
00078 cfg["value"] = value;
00079 }
00080
00081 static config value_to_cfg(const bool &value)
00082 {
00083 config cfg;
00084 value_to_cfg(value,cfg);
00085 return cfg;
00086 }
00087
00088 };
00089
00090 template<>
00091 class config_value_translator< std::vector<std::string> > {
00092 public:
00093
00094 static std::vector<std::string> cfg_to_value(const config &cfg)
00095 {
00096 return utils::split(cfg["value"]);
00097 }
00098
00099 static void cfg_to_value(const config &cfg, std::vector<std::string> &value)
00100 {
00101 value = cfg_to_value(cfg);
00102 }
00103
00104 static void value_to_cfg(const std::vector<std::string> &value, config &cfg)
00105 {
00106 cfg["value"] = utils::join(value);
00107 }
00108
00109 static config value_to_cfg(const std::vector<std::string> &value)
00110 {
00111 config cfg;
00112 value_to_cfg(value,cfg);
00113 return cfg;
00114 }
00115 };
00116
00117 template<>
00118 class config_value_translator<config> {
00119 public:
00120
00121 static void cfg_to_value(const config &cfg, config &value)
00122 {
00123 if (const config &v = cfg.child("value")) {
00124 value = v;
00125 } else {
00126 value.clear();
00127 }
00128 }
00129
00130 static void value_to_cfg(const config &value, config &cfg)
00131 {
00132 cfg.add_child("value",value);
00133 }
00134
00135 static config value_to_cfg(const config &value)
00136 {
00137 config cfg;
00138 value_to_cfg(value,cfg);
00139 return cfg;
00140 }
00141
00142 static config cfg_to_value(const config &cfg)
00143 {
00144 return cfg.child_or_empty("value");
00145 }
00146 };
00147
00148 template<>
00149 class config_value_translator<ministage> {
00150 public:
00151
00152 static ministage cfg_to_value(const config &cfg)
00153 {
00154 return ministage(cfg.child_or_empty("value"));
00155 }
00156
00157 static void cfg_to_value(const config &cfg, ministage &value)
00158 {
00159 value = cfg_to_value(cfg);
00160 }
00161
00162 static void value_to_cfg(const ministage &value, config &cfg)
00163 {
00164 cfg.add_child("value",value.to_config());
00165 }
00166
00167 static config value_to_cfg(const ministage &value)
00168 {
00169 config cfg;
00170 value_to_cfg(value,cfg);
00171 return cfg;
00172 }
00173 };
00174
00175 template<>
00176 class config_value_translator<terrain_filter> {
00177 public:
00178
00179 static terrain_filter cfg_to_value(const config &cfg)
00180 {
00181 if (const config &v = cfg.child("value")) {
00182 return terrain_filter(vconfig(v), *resources::units);
00183 }
00184 static config c("not");
00185 return terrain_filter(vconfig(c),*resources::units);
00186 }
00187
00188 static void cfg_to_value(const config &cfg, terrain_filter &value)
00189 {
00190 value = cfg_to_value(cfg);
00191 }
00192
00193 static void value_to_cfg(const terrain_filter &value, config &cfg)
00194 {
00195 cfg.add_child("value",value.to_config());
00196 }
00197
00198 static config value_to_cfg(const terrain_filter &value)
00199 {
00200 config cfg;
00201 value_to_cfg(value,cfg);
00202 return cfg;
00203 }
00204 };
00205
00206
00207
00208
00209 template<typename T>
00210 class variant_value_translator {
00211 public:
00212
00213 static void variant_to_value(const variant &, T &)
00214 {
00215 assert(false);
00216 }
00217
00218 static void value_to_variant(const T &, variant &)
00219 {
00220 assert(false);
00221 }
00222
00223 static variant value_to_variant(const T &value)
00224 {
00225 variant var;
00226 value_to_variant(value,var);
00227 return var;
00228 }
00229
00230 static T variant_to_value(const variant &var)
00231 {
00232 T value = T();
00233 variant_to_value(var,value);
00234 return value;
00235 }
00236 };
00237
00238 template<>
00239 class variant_value_translator<ministage> {
00240 public:
00241
00242 static void variant_to_value(const variant &, ministage &)
00243 {
00244 assert(false);
00245 }
00246
00247 static void value_to_variant(const ministage &, variant &)
00248 {
00249 assert(false);
00250 }
00251
00252 static variant value_to_variant(const ministage &)
00253 {
00254 assert(false);
00255 return variant();
00256 }
00257
00258 static ministage variant_to_value(const variant &)
00259 {
00260 assert(false);
00261 config cfg;
00262 return ministage(cfg);
00263 }
00264 };
00265
00266 template<>
00267 class variant_value_translator<int> {
00268 public:
00269
00270 static void variant_to_value(const variant &var, int &value)
00271 {
00272 value = var.as_int();
00273 }
00274
00275 static void value_to_variant(const int &value, variant &var)
00276 {
00277 var = variant(value);
00278 }
00279
00280 static variant value_to_variant(const int &value)
00281 {
00282 variant var;
00283 value_to_variant(value,var);
00284 return var;
00285 }
00286
00287 static int variant_to_value(const variant &var)
00288 {
00289 int value;
00290 variant_to_value(var,value);
00291 return value;
00292 }
00293 };
00294
00295
00296 template<>
00297 class variant_value_translator<bool> {
00298 public:
00299
00300 static void variant_to_value(const variant &var, bool &value)
00301 {
00302 value = var.as_bool();
00303 }
00304
00305 static void value_to_variant(const bool &value, variant &var)
00306 {
00307 var = variant(value);
00308 }
00309
00310 static variant value_to_variant(const bool &value)
00311 {
00312 variant var;
00313 value_to_variant(value,var);
00314 return var;
00315 }
00316
00317 static bool variant_to_value(const variant &var)
00318 {
00319 bool value;
00320 variant_to_value(var,value);
00321 return value;
00322 }
00323 };
00324
00325
00326
00327 template<>
00328 class variant_value_translator<std::string> {
00329 public:
00330
00331 static void variant_to_value(const variant &var, std::string &value)
00332 {
00333 value = var.as_string();
00334 }
00335
00336 static void value_to_variant(const std::string &value, variant &var)
00337 {
00338 var = variant(value);
00339 }
00340
00341 static variant value_to_variant(const std::string &value)
00342 {
00343 variant var;
00344 value_to_variant(value,var);
00345 return var;
00346 }
00347
00348 static std::string variant_to_value(const variant &var)
00349 {
00350 std::string value;
00351 variant_to_value(var,value);
00352 return value;
00353 }
00354 };
00355
00356
00357
00358 template<>
00359 class variant_value_translator<attacks_vector> {
00360 public:
00361
00362 static void variant_to_value(const variant &, attacks_vector &)
00363 {
00364 assert(false);
00365 }
00366
00367 static void value_to_variant(const attacks_vector &value, variant &var)
00368 {
00369 std::vector<variant> vars;
00370 for(attacks_vector::const_iterator i = value.begin(); i != value.end(); ++i) {
00371 vars.push_back(variant(new attack_analysis(*i)));
00372 }
00373 var = variant(&vars);
00374 }
00375
00376 static variant value_to_variant(const attacks_vector &value)
00377 {
00378 variant var;
00379 value_to_variant(value,var);
00380 return var;
00381 }
00382
00383 static attacks_vector variant_to_value(const variant &var)
00384 {
00385 attacks_vector value;
00386 variant_to_value(var,value);
00387 return value;
00388 }
00389 };
00390
00391
00392 template<>
00393 class variant_value_translator<terrain_filter> {
00394 public:
00395
00396 static void variant_to_value(const variant &, terrain_filter &)
00397 {
00398 assert(false);
00399 }
00400
00401 static void value_to_variant(const terrain_filter &, variant &)
00402 {
00403 assert(false);
00404 }
00405
00406 static variant value_to_variant(const terrain_filter &value)
00407 {
00408 variant var;
00409 value_to_variant(value,var);
00410 return var;
00411 }
00412
00413 static terrain_filter variant_to_value(const variant &var)
00414 {
00415 static config c("not");
00416 terrain_filter value(vconfig(c),*resources::units);
00417 variant_to_value(var,value);
00418 return value;
00419 }
00420 };
00421 }
00422
00423 #endif