From 19bbfedb32c853edcabd1ebc17538fbaee5fe3c7 Mon Sep 17 00:00:00 2001 From: Charles Dang Date: Mon, 4 Sep 2017 03:18:21 +1100 Subject: [PATCH] Deployed unique_ptrs in a bunch more places The changes from stack::push to stack::emplace in ai::handler are since the unique_ptrs make the copy ctor malformed. --- src/addon/client.cpp | 10 ++-------- src/addon/client.hpp | 6 ++---- src/ai/default/attack.cpp | 9 +++------ src/ai/manager.cpp | 28 ++++++++++------------------ src/ai/manager.hpp | 10 +++++----- src/scripting/lua_gui2.cpp | 5 ++--- src/terrain/filter.cpp | 9 ++------- src/terrain/filter.hpp | 6 ++---- 8 files changed, 28 insertions(+), 55 deletions(-) diff --git a/src/addon/client.cpp b/src/addon/client.cpp index 592fbc0751c..0cc46179e23 100644 --- a/src/addon/client.cpp +++ b/src/addon/client.cpp @@ -65,7 +65,7 @@ void addons_client::connect() utils::string_map i18n_symbols; i18n_symbols["server_address"] = addr_; - conn_ = new network_asio::connection(host_, port_); + conn_.reset(new network_asio::connection(host_, port_)); this->wait_for_transfer_done( vgettext("Connecting to $server_address|...", i18n_symbols)); @@ -499,7 +499,7 @@ void addons_client::wait_for_transfer_done(const std::string& status_message, bo else cd.reset(new read_addon_connection_data{ *conn_ }); if(!stat_) { - stat_ = new network_transmission(*cd, _("Add-ons Manager"), status_message); + stat_.reset(new network_transmission(*cd, _("Add-ons Manager"), status_message)); } else { stat_->set_subtitle(status_message); stat_->set_connection_data(*cd); @@ -510,9 +510,3 @@ void addons_client::wait_for_transfer_done(const std::string& status_message, bo throw user_exit(); } } - -addons_client::~addons_client() -{ - delete stat_; // stat_ depends on conn_, so it must be destroyed first! - delete conn_; -} diff --git a/src/addon/client.hpp b/src/addon/client.hpp index 238a3c55539..31429503c8a 100644 --- a/src/addon/client.hpp +++ b/src/addon/client.hpp @@ -52,8 +52,6 @@ public: */ addons_client(CVideo& v, const std::string& address); - ~addons_client(); - /** * Try to establish a connection to the add-ons server. */ @@ -122,8 +120,8 @@ private: std::string addr_; std::string host_; std::string port_; - network_asio::connection* conn_; - gui2::dialogs::network_transmission* stat_; + std::unique_ptr conn_; + std::unique_ptr stat_; std::string last_error_; /** diff --git a/src/ai/default/attack.cpp b/src/ai/default/attack.cpp index 98759ef5826..81dd34c9dda 100644 --- a/src/ai/default/attack.cpp +++ b/src/ai/default/attack.cpp @@ -116,7 +116,7 @@ void attack_analysis::analyze(const gamemap& map, unit_map& units, } bool from_cache = false; - battle_context *bc; + std::unique_ptr bc; // This cache is only about 99% correct, but speeds up evaluation by about 1000 times. // We recalculate when we actually attack. @@ -128,15 +128,13 @@ void attack_analysis::analyze(const gamemap& map, unit_map& units, static_cast(up->attacks().size())) { from_cache = true; - bc = new battle_context(usc->second.first, usc->second.second); + bc.reset(new battle_context(usc->second.first, usc->second.second)); } else { - bc = new battle_context(units, m->second, target, -1, -1, m_aggression, prev_def); + bc.reset(new battle_context(units, m->second, target, -1, -1, m_aggression, prev_def)); } const combatant &att = bc->get_attacker_combatant(prev_def); const combatant &def = bc->get_defender_combatant(prev_def); - delete prev_bc; - prev_bc = bc; prev_def = &bc->get_defender_combatant(prev_def); if ( !from_cache ) { @@ -245,7 +243,6 @@ void attack_analysis::analyze(const gamemap& map, unit_map& units, avg_damage_inflicted += defend_it->hitpoints() - prev_def->average_hp(map.gives_healing(defend_it->get_location())); } - delete prev_bc; terrain_quality /= resources_used; // Restore the units to their original positions. diff --git a/src/ai/manager.cpp b/src/ai/manager.cpp index 244e0bc476e..7b1bc2143c0 100644 --- a/src/ai/manager.cpp +++ b/src/ai/manager.cpp @@ -82,19 +82,19 @@ holder::holder( side_number side, const config &cfg ) void holder::init( side_number side ) { if (side_context_ == nullptr) { - side_context_ = new side_context_impl(side,cfg_); + side_context_.reset(new side_context_impl(side,cfg_)); } else { side_context_->set_side(side); } if (readonly_context_ == nullptr){ - readonly_context_ = new readonly_context_impl(*side_context_,cfg_); + readonly_context_.reset(new readonly_context_impl(*side_context_,cfg_)); readonly_context_->on_readonly_context_create(); } if (readwrite_context_ == nullptr){ - readwrite_context_ = new readwrite_context_impl(*readonly_context_,cfg_); + readwrite_context_.reset(new readwrite_context_impl(*readonly_context_,cfg_)); } if (default_ai_context_ == nullptr){ - default_ai_context_ = new default_ai_context_impl(*readwrite_context_,cfg_); + default_ai_context_.reset(new default_ai_context_impl(*readwrite_context_,cfg_)); } if (!this->ai_){ ai_ = std::shared_ptr(new ai_composite(*default_ai_context_,cfg_)); @@ -129,10 +129,6 @@ holder::~holder() LOG_AI_MANAGER << describe_ai() << "Managed AI will be deleted" << std::endl; } } catch (...) {} - delete this->default_ai_context_; - delete this->readwrite_context_; - delete this->readonly_context_; - delete this->side_context_; } @@ -308,7 +304,7 @@ component* holder::get_component(component *root, const std::string &path) { manager::AI_map_of_stacks manager::ai_map_; -game_info *manager::ai_info_; +std::unique_ptr manager::ai_info_; events::generic_event manager::user_interact_("ai_user_interact"); events::generic_event manager::sync_network_("ai_sync_network"); events::generic_event manager::tod_changed_("ai_tod_changed"); @@ -325,14 +321,13 @@ void manager::set_ai_info(const game_info& i) if (ai_info_!=nullptr){ clear_ai_info(); } - ai_info_ = new game_info(i); + ai_info_.reset(new game_info(i)); registry::init(); } void manager::clear_ai_info(){ - delete ai_info_; - ai_info_ = nullptr; + ai_info_.reset(nullptr); } @@ -640,9 +635,8 @@ bool manager::add_ai_for_side_from_config( side_number side, const config& cfg, remove_ai_for_side(side); } - holder new_holder(side,parsed_cfg); std::stack& ai_stack_for_specific_side = get_or_create_ai_stack_for_side(side); - ai_stack_for_specific_side.push(new_holder); + ai_stack_for_specific_side.emplace(side, parsed_cfg); return true; } @@ -655,9 +649,8 @@ bool manager::add_ai_for_side( side_number side, const std::string& ai_algorithm } config cfg; cfg["ai_algorithm"] = ai_algorithm_type; - holder new_holder(side,cfg); std::stack& ai_stack_for_specific_side = get_or_create_ai_stack_for_side(side); - ai_stack_for_specific_side.push(new_holder); + ai_stack_for_specific_side.emplace(side, cfg); return true; } @@ -806,8 +799,7 @@ holder& manager::get_active_ai_holder_for_side( side_number side ) return ai_stack_for_specific_side.top(); } else { config cfg = configuration::get_default_ai_parameters(); - holder new_holder(side, cfg); - ai_stack_for_specific_side.push(new_holder); + ai_stack_for_specific_side.emplace(side, cfg); return ai_stack_for_specific_side.top(); } } diff --git a/src/ai/manager.hpp b/src/ai/manager.hpp index 62207f055c1..e5d3c7197be 100644 --- a/src/ai/manager.hpp +++ b/src/ai/manager.hpp @@ -82,10 +82,10 @@ private: composite_ai_ptr ai_; - side_context *side_context_; - readonly_context *readonly_context_; - readwrite_context *readwrite_context_; - default_ai_context *default_ai_context_; + std::unique_ptr side_context_; + std::unique_ptr readonly_context_; + std::unique_ptr readwrite_context_; + std::unique_ptr default_ai_context_; side_number side_; config cfg_; }; @@ -464,7 +464,7 @@ private: static AI_map_of_stacks ai_map_; static std::deque< command_history_item > history_; static long history_item_counter_; - static game_info *ai_info_; + static std::unique_ptr ai_info_; static events::generic_event map_changed_; static events::generic_event recruit_list_changed_; diff --git a/src/scripting/lua_gui2.cpp b/src/scripting/lua_gui2.cpp index 45bdf7d0a75..f43ff5029d8 100644 --- a/src/scripting/lua_gui2.cpp +++ b/src/scripting/lua_gui2.cpp @@ -81,7 +81,7 @@ namespace { lua_State* L; scoped_dialog* prev; static scoped_dialog* current; - gui2::window* window; + std::unique_ptr window; typedef std::map callback_map; callback_map callbacks; @@ -107,7 +107,6 @@ namespace { scoped_dialog::~scoped_dialog() { - delete window; current = prev; lua_pushstring(L, dlgclbkKey); lua_pushvalue(L, -1); @@ -131,7 +130,7 @@ static gui2::widget* find_widget(lua_State* L, int i, bool readonly) return nullptr; } - gui2::widget* w = scoped_dialog::current->window; + gui2::widget* w = scoped_dialog::current->window.get(); for(; !lua_isnoneornil(L, i); ++i) { #ifdef GUI2_EXPERIMENTAL_LISTBOX diff --git a/src/terrain/filter.cpp b/src/terrain/filter.cpp index 7524b2bfa62..8d4ea873fdf 100644 --- a/src/terrain/filter.cpp +++ b/src/terrain/filter.cpp @@ -117,7 +117,7 @@ bool terrain_filter::match_internal(const map_location& loc, const unit* ref_uni if(cfg_.has_attribute("terrain")) { if(cache_.parsed_terrain == nullptr) { - cache_.parsed_terrain = new t_translation::ter_match(cfg_["terrain"]); + cache_.parsed_terrain.reset(new t_translation::ter_match(cfg_["terrain"])); } if(!cache_.parsed_terrain->is_empty) { const t_translation::terrain_code letter = fc_->get_disp_context().map().get_terrain_info(loc).number(); @@ -563,7 +563,7 @@ void terrain_filter::get_locs_impl(std::set& locs, const unit* ref //handle location filter if(cfg_.has_child("filter_adjacent_location")) { if(cache_.adjacent_matches == nullptr) { - cache_.adjacent_matches = new std::vector >(); + cache_.adjacent_matches.reset(new std::vector>()); } const vconfig::child_list& adj_cfgs = cfg_.get_children("filter_adjacent_location"); for (unsigned i = 0; i < adj_cfgs.size(); ++i) { @@ -664,8 +664,3 @@ config terrain_filter::to_config() const { return cfg_.get_config(); } - -terrain_filter::terrain_filter_cache::~terrain_filter_cache() { - delete parsed_terrain; - delete adjacent_matches; -} diff --git a/src/terrain/filter.hpp b/src/terrain/filter.hpp index 5371a8ef911..7b0ceaa46d2 100644 --- a/src/terrain/filter.hpp +++ b/src/terrain/filter.hpp @@ -84,13 +84,11 @@ private: struct terrain_filter_cache { terrain_filter_cache(); - ~terrain_filter_cache(); - //parsed_terrain: optimizes handling of terrain="..." - t_translation::ter_match *parsed_terrain; + std::unique_ptr parsed_terrain; //adjacent_matches: optimize handling of [filter_adjacent_location] for get_locations() - std::vector< std::set > *adjacent_matches; + std::unique_ptr>> adjacent_matches; //adjacent_match_cache: optimize handling of [filter_adjacent_location] for match() std::vector< std::pair > > adjacent_match_cache;