ai/composite/value_translator.hpp

Go to the documentation of this file.
00001 /* $Id: value_translator.hpp 52533 2012-01-07 02:35:17Z shadowmaster $ */
00002 /*
00003    Copyright (C) 2009 - 2012 by Yurii Chernyi <terraninfo@terraninfo.net>
00004    Part of the Battle for Wesnoth Project http://www.wesnoth.org/
00005 
00006    This program is free software; you can redistribute it and/or modify
00007    it under the terms of the GNU General Public License as published by
00008    the Free Software Foundation; either version 2 of the License, or
00009    (at your option) any later version.
00010    This program is distributed in the hope that it will be useful,
00011    but WITHOUT ANY WARRANTY.
00012 
00013    See the COPYING file for more details.
00014 */
00015 
00016 /**
00017  * @file
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 // variant value translator
00208 
00209 template<typename T>
00210 class variant_value_translator {
00211 public:
00212 
00213     static void variant_to_value(const variant &/*var*/, T &/*value*/)
00214     {
00215             assert(false);//not implemented
00216     }
00217 
00218     static void value_to_variant(const T &/*value*/, variant &/*var*/)
00219     {
00220         assert(false);//not implemented
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 &/*var*/, ministage &/*value*/)
00243     {
00244             assert(false);//not implemented
00245     }
00246 
00247     static void value_to_variant(const ministage &/*value*/, variant &/*var*/)
00248     {
00249         assert(false);//not implemented
00250     }
00251 
00252     static variant value_to_variant(const ministage &/*value*/)
00253     {
00254         assert(false);
00255         return variant();
00256     }
00257 
00258     static ministage variant_to_value(const variant &/*var*/)
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 &/*var*/, attacks_vector &/*value*/)
00363     {
00364         assert(false);//not implemented
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 &/*var*/, terrain_filter &/*value*/)
00397     {
00398             assert(false);//not implemented
00399     }
00400 
00401     static void value_to_variant(const terrain_filter &/*value*/, variant &/*var*/)
00402     {
00403         assert(false);//not implemented
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 }  //end of namespace ai
00422 
00423 #endif
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Defines

Generated by doxygen 1.7.1 on Fri May 25 2012 01:02:43 for The Battle for Wesnoth
Gna! | Forum | Wiki | CIA | devdocs