From efcca8f6a21dfe1ad96ebcf5b60c853fcf0c0e80 Mon Sep 17 00:00:00 2001 From: Charles Dang Date: Mon, 25 Jul 2016 01:47:00 +1100 Subject: [PATCH] Refactored formula's use of boost::intrusive_ptr --- src/actions/undo.cpp | 1 - src/ai/contexts.cpp | 1 - src/ai/formula/ai.cpp | 6 --- src/ai/formula/candidates.cpp | 3 -- src/ai/formula/stage_side_formulas.cpp | 1 - src/ai/formula/stage_unit_formulas.cpp | 3 -- src/formula/callable.hpp | 14 ++---- src/formula/callable_fwd.hpp | 6 +-- src/formula/function.cpp | 6 --- src/formula/variant.cpp | 66 +++++++------------------- src/formula/variant.hpp | 1 - 11 files changed, 22 insertions(+), 86 deletions(-) diff --git a/src/actions/undo.cpp b/src/actions/undo.cpp index e9add6f5d2f14..8d2f717153bcc 100644 --- a/src/actions/undo.cpp +++ b/src/actions/undo.cpp @@ -54,7 +54,6 @@ #include "undo_update_shroud_action.hpp" #include // for reverse -#include // for intrusive_ptr #include // for assert #include // for operator<<, basic_ostream, etc #include // for set diff --git a/src/ai/contexts.cpp b/src/ai/contexts.cpp index ac1013c7251ac..3756cf91cd3aa 100644 --- a/src/ai/contexts.cpp +++ b/src/ai/contexts.cpp @@ -58,7 +58,6 @@ #include "formula/variant.hpp" // for variant #include // for find, count, max, fill_n -#include // for intrusive_ptr #include // for sqrt #include // for abs #include // for time diff --git a/src/ai/formula/ai.cpp b/src/ai/formula/ai.cpp index f7a2d44553359..6b7711073c4af 100644 --- a/src/ai/formula/ai.cpp +++ b/src/ai/formula/ai.cpp @@ -54,7 +54,6 @@ #include "ai/game_info.hpp" // for move_result_ptr, move_map, etc #include "candidates.hpp" // for base_candidate_action, etc -#include // for intrusive_ptr #include // for assert #include // for time #include // for multimap<>::const_iterator, etc @@ -112,7 +111,6 @@ formula_ai::formula_ai(readonly_context &context, const config &cfg) vars_(), function_table_(*this) { - add_ref(); init_readonly_context_proxy(context); LOG_AI << "creating new formula ai"<< std::endl; } @@ -167,7 +165,6 @@ std::string formula_ai::evaluate(const std::string& formula_str) game_logic::formula f(formula_str, &function_table_); game_logic::map_formula_callable callable(this); - callable.add_ref(); //formula_debugger fdb; const variant v = f.evaluate(callable,nullptr); @@ -531,7 +528,6 @@ variant formula_ai::execute_variant(const variant& var, ai_context &ai_, bool co */ game_logic::map_formula_callable callable(this); - callable.add_ref(); if(error != variant()) callable.add("error", error); @@ -934,7 +930,6 @@ bool formula_ai::can_reach_unit(map_location unit_A, map_location unit_B) const void formula_ai::on_create(){ //make sure we don't run out of refcount - vars_.add_ref(); for(const config &func : cfg_.child_range("function")) { @@ -978,7 +973,6 @@ void formula_ai::evaluate_candidate_action(ca_ptr fai_ca) bool formula_ai::execute_candidate_action(ca_ptr fai_ca) { game_logic::map_formula_callable callable(this); - callable.add_ref(); fai_ca->update_callable_map( callable ); const_formula_ptr move_formula(fai_ca->get_action()); return !make_action(move_formula, callable).is_empty(); diff --git a/src/ai/formula/candidates.cpp b/src/ai/formula/candidates.cpp index dce69dd9e9cc1..1e91a528f31da 100644 --- a/src/ai/formula/candidates.cpp +++ b/src/ai/formula/candidates.cpp @@ -77,7 +77,6 @@ candidate_action_with_filters::candidate_action_with_filters( variant candidate_action_with_filters::do_filtering(ai::formula_ai* ai, variant& input, game_logic::const_formula_ptr formula) { game_logic::map_formula_callable callable(static_cast(ai)); - callable.add_ref(); callable.add("input", input); return formula::evaluate(formula, callable); @@ -123,7 +122,6 @@ void move_candidate_action::evaluate(ai::formula_ai* ai, unit_map& units) for(variant_iterator i = filtered_units.begin() ; i != filtered_units.end() ; ++i) { game_logic::map_formula_callable callable(static_cast(ai)); - callable.add_ref(); callable.add("me", *i); int res = execute_formula(eval_, callable, ai); @@ -227,7 +225,6 @@ void attack_candidate_action::evaluate(ai::formula_ai* ai, unit_map& units) if( ai->can_reach_unit( my_unit_callalbe->get_location(), enemy_units_flt[enemy_unit]->get_location() )) { game_logic::map_formula_callable callable(static_cast(ai)); - callable.add_ref(); callable.add("me", filtered_my_units[my_unit]); callable.add("target", filtered_enemy_units[enemy_unit]); diff --git a/src/ai/formula/stage_side_formulas.cpp b/src/ai/formula/stage_side_formulas.cpp index 73a2188aabbaf..fe6fc0860f476 100644 --- a/src/ai/formula/stage_side_formulas.cpp +++ b/src/ai/formula/stage_side_formulas.cpp @@ -46,7 +46,6 @@ stage_side_formulas::~stage_side_formulas() bool stage_side_formulas::do_play_stage() { game_logic::map_formula_callable callable(&fai_); - callable.add_ref(); try { if (move_formula_) { while( !fai_.make_action(move_formula_,callable).is_empty() ) { } diff --git a/src/ai/formula/stage_unit_formulas.cpp b/src/ai/formula/stage_unit_formulas.cpp index ea1bd6c2e06b2..30a06864104f6 100644 --- a/src/ai/formula/stage_unit_formulas.cpp +++ b/src/ai/formula/stage_unit_formulas.cpp @@ -66,7 +66,6 @@ bool stage_unit_formulas::do_play_stage() game_logic::const_formula_ptr priority_formula(fai_.create_optional_formula(i->formula_manager().get_priority_formula())); if (priority_formula) { game_logic::map_formula_callable callable(&fai_); - callable.add_ref(); callable.add("me", variant(new unit_callable(*i))); priority = (game_logic::formula::evaluate(priority_formula, callable)).as_int(); } else { @@ -100,7 +99,6 @@ bool stage_unit_formulas::do_play_stage() game_logic::const_formula_ptr formula(fai_.create_optional_formula(i->formula_manager().get_formula())); if (formula) { game_logic::map_formula_callable callable(&fai_); - callable.add_ref(); callable.add("me", variant(new unit_callable(*i))); fai_.make_action(formula, callable); } else { @@ -123,7 +121,6 @@ bool stage_unit_formulas::do_play_stage() game_logic::const_formula_ptr loop_formula(fai_.create_optional_formula(i->formula_manager().get_loop_formula())); if (loop_formula) { game_logic::map_formula_callable callable(&fai_); - callable.add_ref(); callable.add("me", variant(new unit_callable(*i))); while ( !fai_.make_action(loop_formula, callable).is_empty() && i.valid() ) { diff --git a/src/formula/callable.hpp b/src/formula/callable.hpp index 314f3776e84f1..f2c80fa0ea321 100644 --- a/src/formula/callable.hpp +++ b/src/formula/callable.hpp @@ -33,7 +33,7 @@ struct formula_input { }; //interface for objects that can have formulae run on them -class formula_callable : public reference_counted_object { +class formula_callable { public: explicit formula_callable(bool has_self=true) : type_(FORMULA_C), has_self_(has_self) {} @@ -104,14 +104,6 @@ class formula_callable : public reference_counted_object { bool has_self_; }; -class formula_callable_no_ref_count : public formula_callable { -public: - formula_callable_no_ref_count() { - turn_reference_counting_off(); - } - virtual ~formula_callable_no_ref_count() {} -}; - class formula_callable_with_backup : public formula_callable { const formula_callable& main_; const formula_callable& backup_; @@ -175,8 +167,8 @@ class map_formula_callable : public formula_callable { const formula_callable* fallback_; }; -typedef boost::intrusive_ptr map_formula_callable_ptr; -typedef boost::intrusive_ptr const_map_formula_callable_ptr; +typedef std::shared_ptr map_formula_callable_ptr; +typedef std::shared_ptr const_map_formula_callable_ptr; } diff --git a/src/formula/callable_fwd.hpp b/src/formula/callable_fwd.hpp index 61e658bab0f46..a1ac74f323479 100644 --- a/src/formula/callable_fwd.hpp +++ b/src/formula/callable_fwd.hpp @@ -15,14 +15,12 @@ #ifndef FORMULA_CALLABLE_FWD_HPP_INCLUDED #define FORMULA_CALLABLE_FWD_HPP_INCLUDED -#include - namespace game_logic { class formula_callable; class formula_debugger; -typedef boost::intrusive_ptr formula_callable_ptr; -typedef boost::intrusive_ptr const_formula_callable_ptr; +typedef std::shared_ptr formula_callable_ptr; +typedef std::shared_ptr const_formula_callable_ptr; } diff --git a/src/formula/function.cpp b/src/formula/function.cpp index 2ff04e5ff08fc..46d49d1594525 100644 --- a/src/formula/function.cpp +++ b/src/formula/function.cpp @@ -98,7 +98,6 @@ class dir_function : public function_expression { variant execute(const formula_callable& variables, formula_debugger *fdb) const { variant var = args()[0]->evaluate(variables, fdb); const formula_callable* callable = var.as_callable(); - callable->add_ref(); std::vector inputs = callable->inputs(); std::vector res; for(size_t i=0; ievaluate(variables,fdb).as_string(); for(variant_iterator it = items.begin(); it != items.end(); ++it) { self_callable.add(self, *it); @@ -937,7 +935,6 @@ class filter_function : public function_expression { } } else { map_formula_callable self_callable; - self_callable.add_ref(); const std::string self = args()[1]->evaluate(variables,fdb).as_string(); for(variant_iterator it = items.begin(); it != items.end(); ++it) { self_callable.add(self, *it); @@ -975,7 +972,6 @@ class find_function : public function_expression { } } else { map_formula_callable self_callable; - self_callable.add_ref(); const std::string self = args()[1]->evaluate(variables,fdb).as_string(); for(variant_iterator it = items.begin(); it != items.end(); ++it){ self_callable.add(self, *it); @@ -1011,7 +1007,6 @@ class map_function : public function_expression { } } else { map_formula_callable self_callable; - self_callable.add_ref(); const std::string self = args()[1]->evaluate(variables,fdb).as_string(); for(variant_iterator it = items.begin(); it != items.end(); ++it) { self_callable.add(self, *it); @@ -1117,7 +1112,6 @@ class reduce_function : public function_expression { ++it; } map_formula_callable self_callable; - self_callable.add_ref(); for(; it != items.end(); ++it) { self_callable.add("a", res); self_callable.add("b", *it); diff --git a/src/formula/variant.cpp b/src/formula/variant.cpp index 4fdb80b55933e..b32f4550f5c37 100644 --- a/src/formula/variant.cpp +++ b/src/formula/variant.cpp @@ -280,30 +280,6 @@ struct variant_map { int refcount; }; -void variant::increment_refcount() -{ - switch(type_) { - case TYPE_LIST: - ++list_->refcount; - break; - case TYPE_STRING: - ++string_->refcount; - break; - case TYPE_MAP: - ++map_->refcount; - break; - case TYPE_CALLABLE: - intrusive_ptr_add_ref(callable_); - break; - - // These are not used here, add them to silence a compiler warning. - case TYPE_NULL: - case TYPE_DECIMAL: - case TYPE_INT : - break; - } -} - void variant::release() { switch(type_) { @@ -322,11 +298,8 @@ void variant::release() delete map_; } break; - case TYPE_CALLABLE: - intrusive_ptr_release(callable_); - break; - // These are not used here, add them to silence a compiler warning. + case TYPE_CALLABLE: case TYPE_NULL: case TYPE_DECIMAL: case TYPE_INT : @@ -350,9 +323,9 @@ variant::variant(int n, variant::DECIMAL_VARIANT_TYPE /*type*/) : type_(TYPE_DEC variant::variant(double n, variant::DECIMAL_VARIANT_TYPE /*type*/) : type_(TYPE_DECIMAL) { n *= 1000; decimal_value_ = static_cast(n); - + n -= decimal_value_; - + if(n > 0.5) decimal_value_++; else if(n < -0.5) @@ -363,7 +336,6 @@ variant::variant(const game_logic::formula_callable* callable) : type_(TYPE_CALLABLE), callable_(callable) { assert(callable_); - increment_refcount(); } variant::variant(std::vector* array) @@ -372,7 +344,6 @@ variant::variant(std::vector* array) assert(array); list_ = new variant_list; list_->elements.swap(*array); - increment_refcount(); } variant::variant(const std::string& str) @@ -380,7 +351,6 @@ variant::variant(const std::string& str) { string_ = new variant_string; string_->str = str; - increment_refcount(); } variant::variant(std::map* map) @@ -389,14 +359,12 @@ variant::variant(std::map* map) assert(map); map_ = new variant_map; map_->elements.swap(*map); - increment_refcount(); } variant::variant(const variant& v) : type_(v.type_) { memcpy(this, &v, sizeof(v)); - increment_refcount(); } variant::~variant() @@ -409,7 +377,6 @@ variant& variant::operator=(const variant& v) if(&v != this) { release(); memcpy(this, &v, sizeof(v)); - increment_refcount(); } return *this; } @@ -447,7 +414,7 @@ variant variant::operator[](const variant& v) const } else if(type_ == TYPE_LIST) { if(v.is_list()) { std::vector slice; - + for(size_t i = 0; i < v.num_elements(); ++i) { slice.push_back( (*this)[v[i]] ); } @@ -729,7 +696,7 @@ variant variant::operator%(const variant& v) const if(denominator == 0) { throw type_error((formatter() << "divide by zero error").str()); } - + return variant(numerator%denominator, DECIMAL_VARIANT); } else { const int numerator = as_int(); @@ -748,7 +715,7 @@ variant variant::operator^(const variant& v) const if( type_ == TYPE_DECIMAL || v.type_ == TYPE_DECIMAL ) { double res = pow( as_decimal()/1000.0 , v.as_decimal()/1000.0 ); - + if(res != res) return variant(); return variant(res, DECIMAL_VARIANT); @@ -970,18 +937,18 @@ variant variant::concatenate(const variant& v) const { if(type_ == TYPE_LIST) { v.must_be(TYPE_LIST); - + std::vector< variant > res; res.reserve(num_elements() + v.num_elements()); - + for(size_t i = 0; i < num_elements(); ++i) { res.push_back( (*this)[i] ); } - + for(size_t i = 0; i < v.num_elements(); ++i) { res.push_back( v[i] ); } - + return variant( &res ); } else if(type_ == TYPE_STRING) { v.must_be(TYPE_STRING); @@ -999,17 +966,17 @@ variant variant::concatenate(const variant& v) const variant variant::build_range(const variant& v) const { must_be(TYPE_INT); v.must_be(TYPE_INT); - + int lhs = as_int(), rhs = v.as_int(); int len = abs(rhs - lhs) + 1; - + std::vector< variant > res; res.reserve(len); - + for(size_t i = lhs; res.size() != res.capacity(); lhs < rhs ? ++i : --i) { res.push_back( variant(i) ); } - + return variant( &res ); } @@ -1021,7 +988,7 @@ bool variant::contains(const variant& v) const { << variant_type_to_string(type_) << " (" << to_debug_string() << ")").str()); } - + if(type_ == TYPE_LIST) { variant_iterator iter = std::find(begin(), end(), v); return iter != end(); @@ -1153,7 +1120,8 @@ int variant::refcount() const return map_->refcount; break; case TYPE_CALLABLE: - return callable_->refcount(); + return 0; + //return callable_->refcount(); break; default: return -1; diff --git a/src/formula/variant.hpp b/src/formula/variant.hpp index b030d2049a812..09a37a55db5ed 100644 --- a/src/formula/variant.hpp +++ b/src/formula/variant.hpp @@ -172,7 +172,6 @@ class variant { variant_map* map_; }; - void increment_refcount(); void release(); };