Add utils::erase to complement erase_if
Both can be replaced with their standard library counterparts once we use C++20 by default.
This commit is contained in:
parent
cb4d8a8dff
commit
ebf825668d
13 changed files with 43 additions and 36 deletions
|
@ -933,7 +933,7 @@ bool get_villages_phase::remove_village(
|
|||
bool result = false;
|
||||
treachmap::iterator itor = reachmap.begin();
|
||||
while(itor != reachmap.end()) {
|
||||
itor->second.erase(std::remove(itor->second.begin(), itor->second.end(), village), itor->second.end());
|
||||
utils::erase(itor->second, village);
|
||||
if(itor->second.empty()) {
|
||||
result = true;
|
||||
itor = remove_unit(reachmap, moves, itor);
|
||||
|
|
|
@ -329,8 +329,7 @@ static void tidy_drawables()
|
|||
{
|
||||
// Remove all invalidated TLDs from the list.
|
||||
DBG_DM << "tidying " << top_level_drawables_.size() << " drawables";
|
||||
auto& vec = top_level_drawables_;
|
||||
vec.erase(std::remove(vec.begin(), vec.end(), nullptr), vec.end());
|
||||
utils::erase(top_level_drawables_, nullptr);
|
||||
DBG_DM << top_level_drawables_.size() << " after tidying";
|
||||
}
|
||||
|
||||
|
|
|
@ -226,7 +226,7 @@ pump_monitor::pump_monitor()
|
|||
|
||||
pump_monitor::~pump_monitor()
|
||||
{
|
||||
pump_monitors.erase(std::remove(pump_monitors.begin(), pump_monitors.end(), this), pump_monitors.end());
|
||||
utils::erase(pump_monitors, this);
|
||||
}
|
||||
|
||||
event_context::event_context()
|
||||
|
|
|
@ -19,6 +19,7 @@
|
|||
#include "log.hpp"
|
||||
#include "units/unit.hpp"
|
||||
#include "units/animation_component.hpp"
|
||||
#include "utils/general.hpp"
|
||||
|
||||
static lg::log_domain log_engine("engine");
|
||||
#define ERR_NG LOG_STREAM(err, log_engine)
|
||||
|
@ -44,12 +45,8 @@ int fake_unit_manager::remove_temporary_unit(internal_ptr_type u)
|
|||
int removed = 0;
|
||||
if (fake_units_.empty())
|
||||
return removed;
|
||||
std::deque<internal_ptr_type>::iterator it =
|
||||
std::remove(fake_units_.begin(), fake_units_.end(), u);
|
||||
if (it != fake_units_.end()) {
|
||||
removed = std::distance(it, fake_units_.end());
|
||||
//std::remove doesn't remove anything without using erase afterwards.
|
||||
fake_units_.erase(it, fake_units_.end());
|
||||
removed = utils::erase(fake_units_, u);
|
||||
if (removed > 0) {
|
||||
my_display_.invalidate(u->get_location());
|
||||
// Redraw with no location to get rid of haloes
|
||||
u->anim_comp().clear_haloes();
|
||||
|
|
|
@ -123,7 +123,7 @@ void editor_edit_pbl::pre_show()
|
|||
std::vector<config> addons_list;
|
||||
filesystem::get_files_in_dir(filesystem::get_addons_dir(), nullptr, &dirs_, filesystem::name_mode::FILE_NAME_ONLY);
|
||||
if(dirs_.size() > 0 && std::find(dirs_.begin(), dirs_.end(), current_addon_) != dirs_.end()) {
|
||||
dirs_.erase(std::remove(dirs_.begin(), dirs_.end(), current_addon_));
|
||||
utils::erase(dirs_, current_addon_);
|
||||
}
|
||||
|
||||
for(const std::string& dir : dirs_) {
|
||||
|
|
|
@ -24,6 +24,7 @@
|
|||
#include "log.hpp"
|
||||
#include "sdl/input.hpp" // for sdl::get_mods
|
||||
#include "serialization/unicode.hpp"
|
||||
#include "utils/general.hpp"
|
||||
|
||||
#include <boost/algorithm/string.hpp>
|
||||
|
||||
|
@ -327,7 +328,7 @@ bool hotkey_keyboard::bindings_equal_helper(hotkey_ptr other) const
|
|||
void del_hotkey(hotkey_ptr item)
|
||||
{
|
||||
if(!hotkeys_.empty()) {
|
||||
hotkeys_.erase(std::remove(hotkeys_.begin(), hotkeys_.end(), item));
|
||||
utils::erase(hotkeys_, item);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -28,6 +28,7 @@
|
|||
#include "serialization/string_utils.hpp"
|
||||
#include "terrain/terrain.hpp"
|
||||
#include "terrain/type_data.hpp"
|
||||
#include "utils/general.hpp"
|
||||
#include "wml_exception.hpp"
|
||||
|
||||
#include <algorithm>
|
||||
|
@ -411,7 +412,7 @@ void gamemap::set_terrain(const map_location& loc, const t_translation::terrain_
|
|||
const bool new_village = tdata_->is_village(new_terrain);
|
||||
|
||||
if(old_village && !new_village) {
|
||||
villages_.erase(std::remove(villages_.begin(),villages_.end(),loc),villages_.end());
|
||||
utils::erase(villages_, loc);
|
||||
} else if(!old_village && new_village) {
|
||||
villages_.push_back(loc);
|
||||
}
|
||||
|
|
|
@ -1217,7 +1217,7 @@ void prefs::add_recent_files_entry(const std::string& path)
|
|||
|
||||
// Enforce uniqueness. Normally shouldn't do a thing unless somebody
|
||||
// has been tampering with the preferences file.
|
||||
mru.erase(std::remove(mru.begin(), mru.end(), path), mru.end());
|
||||
utils::erase(mru, path);
|
||||
|
||||
mru.insert(mru.begin(), path);
|
||||
mru.resize(std::min(editor_mru_limit(), mru.size()));
|
||||
|
|
|
@ -547,7 +547,7 @@ void game::transfer_side_control(player_iterator player, const simple_wml::node&
|
|||
observers_.push_back(*old_player);
|
||||
|
||||
(*old_player)->info().set_status(player::OBSERVING);
|
||||
players_.erase(std::remove(players_.begin(), players_.end(), old_player), players_.end());
|
||||
utils::erase(players_, old_player);
|
||||
|
||||
// Tell others that the player becomes an observer.
|
||||
send_and_record_server_message(old_player_name + " becomes an observer.");
|
||||
|
@ -564,7 +564,7 @@ void game::transfer_side_control(player_iterator player, const simple_wml::node&
|
|||
if(is_observer(*newplayer)) {
|
||||
players_.push_back(*newplayer);
|
||||
(*newplayer)->info().set_status(player::PLAYING);
|
||||
observers_.erase(std::remove(observers_.begin(), observers_.end(), newplayer), observers_.end());
|
||||
utils::erase(observers_, newplayer);
|
||||
// Send everyone but the new player the observer_quit message.
|
||||
send_observerquit(*newplayer);
|
||||
}
|
||||
|
@ -759,7 +759,7 @@ void game::unmute_observer(const simple_wml::node& unmute, player_iterator unmut
|
|||
LOG_GAME << unmuter->client_ip() << "\t" << game::username(unmuter) << " unmuted: " << username << " ("
|
||||
<< (*user)->client_ip() << ")\tin game:\t\"" << name_ << "\" (" << id_ << ", " << db_id_ << ")";
|
||||
|
||||
muted_observers_.erase(std::remove(muted_observers_.begin(), muted_observers_.end(), user), muted_observers_.end());
|
||||
utils::erase(muted_observers_, user);
|
||||
send_and_record_server_message(username.to_string() + " has been unmuted.");
|
||||
}
|
||||
|
||||
|
@ -868,8 +868,8 @@ void game::unban_user(const simple_wml::node& unban, player_iterator unbanner)
|
|||
<< "\tunbanned: " << username << " (" << (*user)->client_ip() << ")\tfrom game:\t\"" << name_ << "\" ("
|
||||
<< id_ << ", " << db_id_ << ")";
|
||||
|
||||
bans_.erase(std::remove(bans_.begin(), bans_.end(), (*user)->client_ip()), bans_.end());
|
||||
name_bans_.erase(std::remove(name_bans_.begin(), name_bans_.end(), username.to_string()), name_bans_.end());
|
||||
utils::erase(bans_, (*user)->client_ip());
|
||||
utils::erase(name_bans_, username.to_string());
|
||||
send_and_record_server_message(username.to_string() + " has been unbanned.");
|
||||
}
|
||||
|
||||
|
@ -1447,8 +1447,8 @@ bool game::remove_player(player_iterator player, const bool disconnect, const bo
|
|||
const bool host = (player == owner_);
|
||||
const bool observer = is_observer(player);
|
||||
|
||||
players_.erase(std::remove(players_.begin(), players_.end(), player), players_.end());
|
||||
observers_.erase(std::remove(observers_.begin(), observers_.end(), player), observers_.end());
|
||||
utils::erase(players_, player);
|
||||
utils::erase(observers_, player);
|
||||
players_not_advanced_.erase(&*player);
|
||||
|
||||
const bool game_ended = players_.empty() || (host && !started_);
|
||||
|
@ -1515,7 +1515,7 @@ bool game::remove_player(player_iterator player, const bool disconnect, const bo
|
|||
if(!is_player(owner_)) {
|
||||
DBG_GAME << "making the owner a player...";
|
||||
owner_->info().set_status(player::PLAYING);
|
||||
observers_.erase(std::remove(observers_.begin(), observers_.end(), owner_), observers_.end());
|
||||
utils::erase(observers_, owner_);
|
||||
players_.push_back(owner_);
|
||||
send_observerquit(owner_);
|
||||
}
|
||||
|
|
|
@ -18,7 +18,7 @@
|
|||
#include "gettext.hpp"
|
||||
#include "log.hpp"
|
||||
#include "terrain/terrain.hpp"
|
||||
|
||||
#include "utils/general.hpp"
|
||||
|
||||
static lg::log_domain log_config("config");
|
||||
#define ERR_G LOG_STREAM(err, lg::general())
|
||||
|
@ -169,11 +169,8 @@ terrain_type::terrain_type(const config& cfg)
|
|||
union_type_.insert( union_type_.end(), vision_type_.begin(), vision_type_.end() );
|
||||
|
||||
// remove + and -
|
||||
union_type_.erase(std::remove(union_type_.begin(), union_type_.end(),
|
||||
t_translation::MINUS), union_type_.end());
|
||||
|
||||
union_type_.erase(std::remove(union_type_.begin(), union_type_.end(),
|
||||
t_translation::PLUS), union_type_.end());
|
||||
utils::erase(union_type_, t_translation::MINUS);
|
||||
utils::erase(union_type_, t_translation::PLUS);
|
||||
|
||||
// remove doubles
|
||||
std::sort(union_type_.begin(),union_type_.end());
|
||||
|
@ -266,11 +263,8 @@ terrain_type::terrain_type(const terrain_type& base, const terrain_type& overlay
|
|||
union_type_.insert( union_type_.end(), vision_type_.begin(), vision_type_.end() );
|
||||
|
||||
// remove + and -
|
||||
union_type_.erase(std::remove(union_type_.begin(), union_type_.end(),
|
||||
t_translation::MINUS), union_type_.end());
|
||||
|
||||
union_type_.erase(std::remove(union_type_.begin(), union_type_.end(),
|
||||
t_translation::PLUS), union_type_.end());
|
||||
utils::erase(union_type_, t_translation::MINUS);
|
||||
utils::erase(union_type_, t_translation::PLUS);
|
||||
|
||||
// remove doubles
|
||||
std::sort(union_type_.begin(),union_type_.end());
|
||||
|
|
|
@ -1709,7 +1709,7 @@ void unit::set_loyal(bool loyal)
|
|||
overlays_.push_back("misc/loyal-icon.png");
|
||||
} else {
|
||||
upkeep_ = upkeep_full{};
|
||||
overlays_.erase(std::remove(overlays_.begin(), overlays_.end(), "misc/loyal-icon.png"), overlays_.end());
|
||||
utils::erase(overlays_, "misc/loyal-icon.png");
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -2306,7 +2306,7 @@ void unit::apply_builtin_effect(std::string apply_to, const config& effect)
|
|||
}
|
||||
if(!remove.empty()) {
|
||||
for(const auto& to_remove : utils::parenthetical_split(remove, ',')) {
|
||||
overlays_.erase(std::remove(overlays_.begin(), overlays_.end(), to_remove), overlays_.end());
|
||||
utils::erase(overlays_, to_remove);
|
||||
}
|
||||
}
|
||||
if(add.empty() && remove.empty() && !replace.empty()) {
|
||||
|
|
|
@ -105,6 +105,20 @@ void erase_if(Container& container, const Predicate& predicate)
|
|||
container.erase(std::remove_if(container.begin(), container.end(), predicate), container.end());
|
||||
}
|
||||
|
||||
/**
|
||||
* Convenience wrapper for using std::remove on a container.
|
||||
*
|
||||
* @todo C++20: use std::erase
|
||||
*/
|
||||
template<typename Container, typename Value>
|
||||
std::size_t erase(Container& container, const Value& value)
|
||||
{
|
||||
auto iter = std::remove(container.begin(), container.end(), value);
|
||||
auto num_removed = container.end() - iter;
|
||||
container.erase(iter, container.end());
|
||||
return num_removed;
|
||||
}
|
||||
|
||||
/**
|
||||
* Convenience wrapper for using std::sort on a container.
|
||||
*
|
||||
|
|
|
@ -38,6 +38,7 @@
|
|||
#include "units/unit.hpp"
|
||||
#include "units/animation_component.hpp"
|
||||
#include "units/map.hpp"
|
||||
#include "utils/general.hpp"
|
||||
#include "utils/ranges.hpp"
|
||||
|
||||
namespace wb
|
||||
|
@ -225,7 +226,7 @@ void highlighter::find_secondary_highlights()
|
|||
std::deque<action_ptr> actions = find_actions_of(*owner_unit_);
|
||||
|
||||
// Remove main_highlight_ if present
|
||||
actions.erase(std::remove(actions.begin(), actions.end(), main_highlight_.lock()), actions.end());
|
||||
utils::erase(actions, main_highlight_.lock());
|
||||
|
||||
// Copy in secondary_highlights_
|
||||
std::copy(actions.begin(), actions.end(), std::back_inserter(secondary_highlights_));
|
||||
|
|
Loading…
Add table
Reference in a new issue