4 snapshots.push(blocks);
8 auto head = snapshots.top();
11 for (
size_t i = 0; i < n - 1; i++)
14 auto source = snapshots.top();
16 DBMemento::Overwrite(head, source);
21 if (n > snapshots.size() - 1) {
22 LOG_ERROR(
"LogicError",
"Please specify an existing snapshot (only", snapshots.size(),
"stored, asked", n);
25 std::stack<std::shared_ptr<BlockAccessor>> temp;
26 for (
size_t i = 0; i < n; i++) {
27 temp.push(snapshots.top());
33 for (
size_t i = 0; i < n; i++) {
34 snapshots.push(temp.top());
40 return snapshots.size();
43void DBMemento::Overwrite(std::shared_ptr<BlockAccessor> &reciever, std::shared_ptr<BlockAccessor> source) {
44 for (
const auto& block_name : reciever->get_block_names()) {
45 if (!source->contains(block_name)) {
46 reciever->erase_block(block_name);
49 for (
const auto&
id : reciever->at(block_name)->getAllIDs()) {
50 if (!source->has_param(block_name,
id)) {
51 reciever->remove_item(block_name,
id);
53 reciever->remove_item(block_name,
id);
54 reciever->setParameter(block_name,
id, source->getParameter(block_name,
id));
Concrete memento for BlockAccessor snapshots.
#define LOG_ERROR(type,...)
Macro for logging error messages and terminating the application.
#define LOG_INFO(...)
Macro for logging informational messages.
size_t stack_size()
Returns the number of snapshots currently stored.
void print_snapshot_content(size_t n=0)
Prints the content of a stored snapshot.
void takeSnapshot(std::shared_ptr< BlockAccessor > blocks)
Takes a snapshot of the given BlockAccessor.
void restore(size_t n_steps=1)
Restores the state n_steps snapshots back.