boost::ptr_vector -> std::vector<unique_ptr>

boost::ptr_vector has some nice features, but vector<unique_ptr> is still
easier to use for most people basicially becasue people know it better.
Also boost::ptr_vector does not support move ctors and also does not
use std::unique_ptr, probably because it tries to stay compatible with
c++03 so one has to use 'ptr_vector::auto_type' with it instead which
has a different interface than std::unique_ptr
This commit is contained in:
gfgtdf 2018-08-11 22:54:12 +02:00
parent f03e3e8d6d
commit 7e2dc296ba
2 changed files with 18 additions and 16 deletions

View file

@ -295,7 +295,7 @@ void undo_list::read(const config & cfg)
try {
undo_action_base * action = create_action(child);
if ( action ) {
undos_.push_back(action);
undos_.emplace_back(action);
}
} catch (const bad_lexical_cast &) {
ERR_NG << "Error when parsing undo list from config: bad lexical cast." << std::endl;
@ -311,7 +311,7 @@ void undo_list::read(const config & cfg)
// Build the redo stack.
for (const config & child : cfg.child_range("redo")) {
try {
redos_.push_back(new config(child));
redos_.emplace_back(new config(child));
} catch (const bad_lexical_cast &) {
ERR_NG << "Error when parsing redo list from config: bad lexical cast." << std::endl;
ERR_NG << "config was: " << child.debug() << std::endl;
@ -333,11 +333,11 @@ void undo_list::write(config & cfg) const
cfg["side"] = side_;
cfg["committed"] = committed_actions_;
for ( action_list::const_iterator it = undos_.begin(); it != undos_.end(); ++it )
it->write(cfg.add_child("undo"));
for ( const auto& action_ptr : undos_)
action_ptr->write(cfg.add_child("undo"));
for ( redos_list::const_iterator it = redos_.begin(); it != redos_.end(); ++it )
cfg.add_child("redo") = *it;
for ( const auto& cfg_ptr : redos_)
cfg.add_child("redo") = *cfg_ptr;
}
@ -353,8 +353,9 @@ void undo_list::undo()
// Get the action to undo. (This will be placed on the redo stack, but
// only if the undo is successful.)
action_list::auto_type action = undos_.pop_back();
if (undo_action* undoable_action = dynamic_cast<undo_action*>(action.ptr()))
auto action = std::move(undos_.back());
undos_.pop_back();
if (undo_action* undoable_action = dynamic_cast<undo_action*>(action.get()))
{
int last_unit_id = resources::gameboard->unit_id_manager().get_save_id();
if ( !undoable_action->undo(side_) ) {
@ -366,8 +367,8 @@ void undo_list::undo()
resources::gameboard->unit_id_manager().set_save_id(last_unit_id - undoable_action->unit_id_diff);
// Bookkeeping.
redos_.push_back(new config());
resources::recorder->undo_cut(redos_.back());
redos_.emplace_back(new config());
resources::recorder->undo_cut(*redos_.back());
resources::whiteboard->on_gamestate_change();
}
@ -378,7 +379,7 @@ void undo_list::undo()
resources::recorder->undo_cut(replay_data);
undo();
resources::recorder->redo(replay_data);
undos_.push_back(action.release());
undos_.emplace_back(std::move(action));
}
}
@ -396,7 +397,8 @@ void undo_list::redo()
// Get the action to redo. (This will be placed on the undo stack, but
// only if the redo is successful.)
redos_list::auto_type action = redos_.pop_back();
auto action = std::move(redos_.back());
redos_.pop_back();
const config& command_wml = action->child("command");
std::string commandname = command_wml.all_children_range().front().key;
@ -436,7 +438,7 @@ bool undo_list::apply_shroud_changes() const
// Loop through the list of undo_actions.
for( std::size_t i = 0; i != list_size; ++i ) {
if (const shroud_clearing_action* action = dynamic_cast<const shroud_clearing_action*>(&undos_[i])) {
if (const shroud_clearing_action* action = dynamic_cast<const shroud_clearing_action*>(undos_[i].get())) {
LOG_NG << "Turning an undo...\n";
// Clear the hexes this unit can see from each hex occupied during

View file

@ -34,8 +34,8 @@ namespace actions {
/// Class to store the actions that a player can undo and redo.
class undo_list {
typedef boost::ptr_vector<undo_action_base> action_list;
typedef boost::ptr_vector<config> redos_list;
typedef std::vector<std::unique_ptr<undo_action_base>> action_list;
typedef std::vector<std::unique_ptr<config>> redos_list;
public:
undo_list(const undo_list&) = delete;
@ -100,7 +100,7 @@ public:
private: // functions
/// Adds an action to the undo stack.
void add(undo_action_base * action)
{ undos_.push_back(action); redos_.clear(); }
{ undos_.emplace_back(action); redos_.clear(); }
/// Applies the pending fog/shroud changes from the undo stack.
bool apply_shroud_changes() const;