Author: dhains
Date: Tue Jun 17 07:26:55 2008
New Revision: 27250

URL: http://svn.gna.org/viewcvs/wesnoth?rev=27250&view=rev
Log:
Makes ai function symbol table a member of formula ai object instead of being 
created each turn

Modified:
    trunk/src/formula_ai.cpp
    trunk/src/formula_ai.hpp

Modified: trunk/src/formula_ai.cpp
URL: 
http://svn.gna.org/viewcvs/wesnoth/trunk/src/formula_ai.cpp?rev=27250&r1=27249&r2=27250&view=diff
==============================================================================
--- trunk/src/formula_ai.cpp (original)
+++ trunk/src/formula_ai.cpp Tue Jun 17 07:26:55 2008
@@ -861,82 +861,75 @@
 
        const formula_ai& ai_;
 };
-
-class ai_function_symbol_table : public function_symbol_table {
-       formula_ai& ai_;
-       std::set<std::string> move_functions;
-       candidate_move_map candidate_move_evals;
-
-       expression_ptr create_function(const std::string& fn,
-                                      const std::vector<expression_ptr>& args) 
const {
-               if(fn == "outcomes") {
-                       return expression_ptr(new outcomes_function(args, ai_));
-               } else if(fn == "evaluate_for_position") {
-                       return expression_ptr(new 
evaluate_for_position_function(args, ai_));
-               } else if(fn == "evaluate_village_possession") {
-                       return expression_ptr(new 
evaluate_village_possession_function(args, ai_));
-               } else if(fn == "move") {
-                       return expression_ptr(new move_function(args));
-               } else if(fn == "attack") {
-                       return expression_ptr(new attack_function(args, ai_));
-               } else if(fn == "recruit") {
-                       return expression_ptr(new recruit_function(args));
-               } else if(fn == "unit_chooser") {
-                       return expression_ptr(new unit_chooser_function(args, 
ai_));
-               } else if(fn == "is_village") {
-                       return expression_ptr(new is_village_function(args));
-               } else if(fn == "unit_at") {
-                       return expression_ptr(new unit_at_function(args, ai_));
-               } else if(fn == "unit_moves") {
-                       return expression_ptr(new unit_moves_function(args, 
ai_));
-               } else if(fn == "set_var") {
-                       return expression_ptr(new set_var_function(args));
-               } else if(fn == "fallback") {
-                       return expression_ptr(new fallback_function(args));
-               } else if(fn == "units_can_reach") {
-                       return expression_ptr(new 
units_can_reach_function(args, ai_));
-               } else if(fn == "defense_on") {
-                       return expression_ptr(new defense_on_function(args, 
ai_));
-               } else if(fn == "chance_to_hit") {
-                       return expression_ptr(new chance_to_hit_function(args, 
ai_));
-               } else if(fn == "max_possible_damage") {
-                       return expression_ptr(new 
max_possible_damage_function(args, ai_));
-               } else if(fn == "distance_to_nearest_unowned_village") {
-                       return expression_ptr(new 
distance_to_nearest_unowned_village_function(args, ai_));
-               } else if(fn == "nearest_keep") {
-                       return expression_ptr(new nearest_keep_function(args, 
ai_));
-               } else if(fn == "nearest_loc") {
-                       return expression_ptr(new nearest_loc_function(args, 
ai_));
-               } else if(fn == "close_enemies") {
-                       return expression_ptr(new close_enemies_function(args, 
ai_));
-               } else if(fn == "calculate_outcome") {
-                       return expression_ptr(new 
calculate_outcome_function(args, ai_));
-               } else if(fn == "distance_between") {
-                       return expression_ptr(new 
distance_between_function(args));
-               } else {
-                       return function_symbol_table::create_function(fn, args);
-               }
-       }
-       
-public:
-
-       void register_candidate_move(const std::string name, 
-                       const_formula_ptr formula, const_formula_ptr eval, 
-                       const_formula_ptr precondition, const 
std::vector<std::string>& args)
-       {
-               candidate_move_evals.insert(std::pair<const std::string, 
-                                                        
game_logic::const_formula_ptr>
-                                                                        (name, 
eval));
-               function_symbol_table::add_formula_function(name, formula, 
-                                                                   
precondition, args);
-       }
-
-       explicit ai_function_symbol_table(formula_ai& ai) : ai_(ai)
-       {}
-};
-}
-
-formula_ai::formula_ai(info& i) : ai(i), move_maps_valid_(false)
+} 
+
+namespace game_logic { 
+expression_ptr ai_function_symbol_table::create_function(const std::string &fn,
+                               const std::vector<expression_ptr>& args) const {
+       if(fn == "outcomes") {
+               return expression_ptr(new outcomes_function(args, ai_));
+       } else if(fn == "evaluate_for_position") {
+               return expression_ptr(new evaluate_for_position_function(args, 
ai_));
+       } else if(fn == "evaluate_village_possession") {
+               return expression_ptr(new 
evaluate_village_possession_function(args, ai_));
+       } else if(fn == "move") {
+               return expression_ptr(new move_function(args));
+       } else if(fn == "attack") {
+               return expression_ptr(new attack_function(args, ai_));
+       } else if(fn == "recruit") {
+               return expression_ptr(new recruit_function(args));
+       } else if(fn == "unit_chooser") {
+               return expression_ptr(new unit_chooser_function(args, ai_));
+       } else if(fn == "is_village") {
+               return expression_ptr(new is_village_function(args));
+       } else if(fn == "unit_at") {
+               return expression_ptr(new unit_at_function(args, ai_));
+       } else if(fn == "unit_moves") {
+               return expression_ptr(new unit_moves_function(args, ai_));
+       } else if(fn == "set_var") {
+               return expression_ptr(new set_var_function(args));
+       } else if(fn == "fallback") {
+               return expression_ptr(new fallback_function(args));
+       } else if(fn == "units_can_reach") {
+               return expression_ptr(new units_can_reach_function(args, ai_));
+       } else if(fn == "defense_on") {
+               return expression_ptr(new defense_on_function(args, ai_));
+       } else if(fn == "chance_to_hit") {
+               return expression_ptr(new chance_to_hit_function(args, ai_));
+       } else if(fn == "max_possible_damage") {
+               return expression_ptr(new max_possible_damage_function(args, 
ai_));
+       } else if(fn == "distance_to_nearest_unowned_village") {
+               return expression_ptr(new 
distance_to_nearest_unowned_village_function(args, ai_));
+       } else if(fn == "nearest_keep") {
+               return expression_ptr(new nearest_keep_function(args, ai_));
+       } else if(fn == "nearest_loc") {
+               return expression_ptr(new nearest_loc_function(args, ai_));
+       } else if(fn == "close_enemies") {
+               return expression_ptr(new close_enemies_function(args, ai_));
+       } else if(fn == "calculate_outcome") {
+               return expression_ptr(new calculate_outcome_function(args, 
ai_));
+       } else if(fn == "distance_between") {
+               return expression_ptr(new distance_between_function(args));
+       } else {
+               return function_symbol_table::create_function(fn, args);
+       }
+}
+
+void ai_function_symbol_table::register_candidate_move(const std::string name, 
+               const_formula_ptr formula, const_formula_ptr eval, 
+               const_formula_ptr precondition, const std::vector<std::string>& 
args)
+{
+       candidate_move_evals.insert(std::pair<const std::string, 
+                       game_logic::const_formula_ptr>
+                       (name, eval));
+       function_symbol_table::add_formula_function(name, formula, 
+                       precondition, args);
+}
+
+
+}
+
+formula_ai::formula_ai(info& i) : ai(i), move_maps_valid_(false), 
function_table(*this)
 {
        //make sure we don't run out of refcount
        add_ref();
@@ -951,7 +944,6 @@
 }
 void formula_ai::play_turn()
 {
-       ai_function_symbol_table function_table(*this);
        const config& ai_param = current_team().ai_parameters();
 
        // Register candidate moves in function symbol table

Modified: trunk/src/formula_ai.hpp
URL: 
http://svn.gna.org/viewcvs/wesnoth/trunk/src/formula_ai.hpp?rev=27250&r1=27249&r2=27250&view=diff
==============================================================================
--- trunk/src/formula_ai.hpp (original)
+++ trunk/src/formula_ai.hpp Tue Jun 17 07:26:55 2008
@@ -19,9 +19,31 @@
 #include "ai_interface.hpp"
 #include "formula_fwd.hpp"
 #include "formula_callable.hpp"
+#include "formula_function.hpp"
+
+// Forward declaration needed for ai function symbol table
+class formula_ai;
 
 namespace game_logic {
-       typedef std::map<const std::string, const_formula_ptr> 
candidate_move_map;
+
+typedef        std::map<const std::string, const_formula_ptr> 
candidate_move_map;
+
+class ai_function_symbol_table : public function_symbol_table {
+
+public:
+       explicit ai_function_symbol_table(formula_ai& ai) : ai_(ai) {};
+       void register_candidate_move(const std::string name, 
+                       const_formula_ptr formula, const_formula_ptr eval, 
+                       const_formula_ptr precondition, const 
std::vector<std::string>& args);
+
+private:
+       formula_ai& ai_;
+       std::set<std::string> move_functions;
+       candidate_move_map candidate_move_evals;
+       expression_ptr create_function(const std::string& fn,
+                                      const std::vector<expression_ptr>& args) 
const; 
+};
+
 }
 
 class formula_ai : public ai {
@@ -69,6 +91,8 @@
        mutable variant keeps_cache_;
 
        game_logic::map_formula_callable vars_;
+       game_logic::ai_function_symbol_table function_table;
 };
 
 #endif
+


_______________________________________________
Wesnoth-commits mailing list
[email protected]
https://mail.gna.org/listinfo/wesnoth-commits

Reply via email to