Skip to content

Commit

Permalink
Refactor variant class
Browse files Browse the repository at this point in the history
This splits the handling of each applicable type into its own helper class to better encapsulate the functionality of each.
It also contains a lot of related cleanup and improvements to the class interface itself.
  • Loading branch information
Vultraz committed Apr 2, 2017
1 parent d8c6706 commit 99874f4
Show file tree
Hide file tree
Showing 22 changed files with 1,201 additions and 914 deletions.
2 changes: 2 additions & 0 deletions projectfiles/CodeBlocks/wesnoth.cbp
Expand Up @@ -380,6 +380,8 @@
<Unit filename="../../src/formula/tokenizer.hpp" />
<Unit filename="../../src/formula/variant.cpp" />
<Unit filename="../../src/formula/variant.hpp" />
<Unit filename="../../src/formula/variant_private.cpp" />
<Unit filename="../../src/formula/variant_private.hpp" />
<Unit filename="../../src/game_board.cpp" />
<Unit filename="../../src/game_board.hpp" />
<Unit filename="../../src/game_classification.cpp" />
Expand Down
1 change: 1 addition & 0 deletions source_lists/wesnoth
Expand Up @@ -112,6 +112,7 @@ formula/function.cpp
formula/string_utils.cpp
formula/tokenizer.cpp
formula/variant.cpp
formula/variant_private.cpp
game_board.cpp
game_classification.cpp
game_config_manager.cpp
Expand Down
2 changes: 1 addition & 1 deletion src/ai/composite/value_translator.hpp
Expand Up @@ -344,7 +344,7 @@ class variant_value_translator<attacks_vector> {
for(attacks_vector::const_iterator i = value.begin(); i != value.end(); ++i) {
vars.push_back(variant(new attack_analysis(*i)));
}
var = variant(&vars);
var = variant(vars);
}

static variant value_to_variant(const attacks_vector &value)
Expand Down
4 changes: 2 additions & 2 deletions src/ai/default/attack.cpp
Expand Up @@ -338,14 +338,14 @@ variant attack_analysis::get_value(const std::string& key) const
res.push_back(variant(item));
}

return variant(&res);
return variant(res);
} else if(key == "units") {
std::vector<variant> res;
for(size_t n = 0; n != movements.size(); ++n) {
res.push_back(variant(new location_callable(movements[n].first)));
}

return variant(&res);
return variant(res);
} else if(key == "target_value") {
return variant(static_cast<int>(target_value*1000));
} else if(key == "avg_losses") {
Expand Down
38 changes: 19 additions & 19 deletions src/ai/formula/ai.cpp
Expand Up @@ -549,7 +549,7 @@ variant formula_ai::execute_variant(const variant& var, ai_context &ai_, bool co
}
}

return variant(&made_moves);
return variant(made_moves);
}

void formula_ai::add_formula_function(const std::string& name, const_formula_ptr formula, const_formula_ptr precondition, const std::vector<std::string>& args)
Expand All @@ -570,7 +570,7 @@ variant villages_from_set(const Container& villages,
vars.push_back(variant(new location_callable(loc)));
}

return variant(&vars);
return variant(vars);
}
}

Expand Down Expand Up @@ -627,7 +627,7 @@ variant formula_ai::get_value(const std::string& key) const
for(const std::string &i : rp) {
vars.push_back(variant(i));
}
return variant(&vars);
return variant(vars);

} else if(key == "scout_village_targeting")
{
Expand Down Expand Up @@ -671,7 +671,7 @@ variant formula_ai::get_value(const std::string& key) const
for(std::vector<team>::const_iterator i = resources::gameboard->teams().begin(); i != resources::gameboard->teams().end(); ++i) {
vars.push_back(variant(new team_callable(*i)));
}
return variant(&vars);
return variant(vars);

} else if(key == "allies")
{
Expand All @@ -680,7 +680,7 @@ variant formula_ai::get_value(const std::string& key) const
if ( !current_team().is_enemy( i+1 ) )
vars.push_back(variant( i ));
}
return variant(&vars);
return variant(vars);

} else if(key == "enemies")
{
Expand All @@ -689,7 +689,7 @@ variant formula_ai::get_value(const std::string& key) const
if ( current_team().is_enemy( i+1 ) )
vars.push_back(variant( i ));
}
return variant(&vars);
return variant(vars);

} else if(key == "my_recruits")
{
Expand All @@ -699,7 +699,7 @@ variant formula_ai::get_value(const std::string& key) const

const std::set<std::string>& recruits = current_team().recruits();
if(recruits.empty()) {
return variant( &vars );
return variant(vars);
}
for(std::set<std::string>::const_iterator i = recruits.begin(); i != recruits.end(); ++i)
{
Expand All @@ -709,7 +709,7 @@ variant formula_ai::get_value(const std::string& key) const
vars.push_back(variant(new unit_type_callable(*ut)));
}
}
return variant( &vars );
return variant(vars);

} else if(key == "recruits_of_side")
{
Expand Down Expand Up @@ -738,16 +738,16 @@ variant formula_ai::get_value(const std::string& key) const
}

for( size_t i = 0; i<tmp.size(); ++i)
vars.push_back( variant( &tmp[i] ));
return variant(&vars);
vars.emplace_back(tmp[i]);
return variant(vars);

} else if(key == "units")
{
std::vector<variant> vars;
for(unit_map::const_iterator i = units.begin(); i != units.end(); ++i) {
vars.push_back(variant(new unit_callable(*i)));
}
return variant(&vars);
return variant(vars);

} else if(key == "units_of_side")
{
Expand All @@ -762,8 +762,8 @@ variant formula_ai::get_value(const std::string& key) const
tmp[u.side() - 1].push_back(variant(new unit_callable(u)));
}
for( size_t i = 0; i<tmp.size(); ++i)
vars.push_back( variant( &tmp[i] ));
return variant(&vars);
vars.emplace_back(tmp[i]);
return variant(vars);

} else if(key == "my_units")
{
Expand All @@ -773,7 +773,7 @@ variant formula_ai::get_value(const std::string& key) const
vars.push_back(variant(new unit_callable(*i)));
}
}
return variant(&vars);
return variant(vars);

} else if(key == "enemy_units")
{
Expand All @@ -785,7 +785,7 @@ variant formula_ai::get_value(const std::string& key) const
}
}
}
return variant(&vars);
return variant(vars);

} else if(key == "my_moves")
{
Expand Down Expand Up @@ -814,7 +814,7 @@ variant formula_ai::get_value(const std::string& key) const
tmp.push_back( variant( new unit_callable(**i) ) );
}

return variant( &tmp );
return variant(tmp);

} else if(key == "vars")
{
Expand All @@ -839,7 +839,7 @@ variant formula_ai::get_value(const std::string& key) const
{
vars[i] = villages_from_set(resources::gameboard->teams()[i].villages());
}
return variant(&vars);
return variant(vars);

} else if(key == "my_villages")
{
Expand Down Expand Up @@ -903,7 +903,7 @@ variant formula_ai::get_keeps() const
}
}
}
keeps_cache_ = variant(&vars);
keeps_cache_ = variant(vars);
}

return keeps_cache_;
Expand Down Expand Up @@ -1035,7 +1035,7 @@ config formula_ai::to_config() const
for(game_logic::map_formula_callable::const_iterator i = vars_.begin(); i != vars_.end(); ++i)
{
try {
i->second.serialize_to_string(str);
str = i->second.serialize_to_string();
} catch (type_error&) {
WRN_AI << "variable ["<< i->first <<"] is not serializable - it will not be persisted across savegames"<<std::endl;
continue;
Expand Down
12 changes: 6 additions & 6 deletions src/ai/formula/callable_objects.cpp
Expand Up @@ -17,7 +17,7 @@
#include "game_board.hpp"
#include "ai/formula/callable_objects.hpp"
#include "resources.hpp"

#include "map/map.hpp"

namespace game_logic {

Expand All @@ -33,7 +33,7 @@ variant move_map_callable::get_value(const std::string& key) const
}
}

return variant(&vars);
return variant(vars);
} else if(key == "has_moves") {
return variant(!srcdst_.empty());
} else {
Expand Down Expand Up @@ -94,11 +94,11 @@ void position_callable::get_inputs(formula_input_vector* inputs) const {

variant outcome_callable::get_value(const std::string& key) const {
if(key == "hitpoints_left") {
return variant(new std::vector<variant>(hitLeft_));
return variant(hitLeft_);
} else if(key == "probability") {
return variant(new std::vector<variant>(prob_));
return variant(prob_);
} else if(key == "possible_status") {
return variant(new std::vector<variant>(status_));
return variant(status_);
} else {
return variant();
}
Expand Down Expand Up @@ -183,7 +183,7 @@ variant attack_map_callable::get_value(const std::string& key) const {
collect_possible_attacks(vars, i->get_location(), i->get_location());
}
}
return variant(&vars);
return variant(vars);
} else {
return variant();
}
Expand Down
10 changes: 5 additions & 5 deletions src/ai/formula/candidates.cpp
Expand Up @@ -106,7 +106,7 @@ void move_candidate_action::evaluate(ai::formula_ai* ai, unit_map& units)
}
}

variant my_units(&unit_vector);
variant my_units(unit_vector);

variant filtered_units;
try {
Expand Down Expand Up @@ -170,8 +170,8 @@ void attack_candidate_action::evaluate(ai::formula_ai* ai, unit_map& units)
}
}
}
variant my_units(&my_res);
variant enemy_units(&enemy_res);
variant my_units(my_res);
variant enemy_units(enemy_res);

variant filtered_my_units, filtered_enemy_units;
try {
Expand Down Expand Up @@ -203,7 +203,7 @@ void attack_candidate_action::evaluate(ai::formula_ai* ai, unit_map& units)
std::vector< const unit_callable* > enemy_units_flt;

for(variant_iterator i = filtered_my_units.begin() ; i != filtered_my_units.end() ; ++i) {
const unit_callable* u_callable = dynamic_cast<const unit_callable*>( (*i).as_callable() );
const unit_callable* u_callable = dynamic_cast<const unit_callable*>( (*i).as_callable().get() );
if(u_callable == nullptr) {
ERR_AI << "ERROR in "<< get_name() << "Candidate Action: Filter formula returned table that does not contain units" << std::endl;
return;
Expand All @@ -212,7 +212,7 @@ void attack_candidate_action::evaluate(ai::formula_ai* ai, unit_map& units)
}

for(variant_iterator i = filtered_enemy_units.begin() ; i != filtered_enemy_units.end() ; ++i) {
const unit_callable* u_callable = dynamic_cast<const unit_callable*>( (*i).as_callable() );
const unit_callable* u_callable = dynamic_cast<const unit_callable*>( (*i).as_callable().get() );
if(u_callable == nullptr) {
ERR_AI << "ERROR in "<< get_name() << "Candidate Action: Filter formula returned table that does not contain units" << std::endl;
return;
Expand Down

0 comments on commit 99874f4

Please sign in to comment.