33 template <
class TElem,
size_t UNDOMAX>
class UndoRedo {
34 std::vector<TElem*> undo_;
35 std::vector<TElem*> redo_;
43 size_t undoSize()
const {
return undo_.size(); }
44 size_t redoSize()
const {
return redo_.size(); }
53 undo_.push_back(current->clone());
54 if (undo_.size() > UNDOMAX) {
56 undo_.erase(undo_.begin());
67 TElem*
undo(TElem* current) {
return doUndoRedo(undo_, redo_, current); }
76 TElem*
redo(TElem* current) {
return doUndoRedo(redo_, undo_, current); }
80 template <
typename TCont>
81 TElem* doUndoRedo(TCont& cont1, TCont& cont2, TElem* current) {
85 if (cont2.empty() || cont2.back() != current)
86 cont2.push_back(current);
88 auto res = cont1.back();
93 template <
typename TCont>
void clear(TCont& cont) {
109 std::vector<T*> chunks_;
112 static constexpr
size_t low_mask = ((1ULL << CHUNKSHIFT) - 1);
119 for (
auto& chunk : chunks_)
125 return chunks_[idx >> CHUNKSHIFT][idx & low_mask];
129 return chunks_[idx >> CHUNKSHIFT][idx & low_mask];
132 size_t capacity()
const {
return chunks_.size() << CHUNKSHIFT; }
140 return 1 + (~pos & low_mask);
151 size_t newSize = (count > 0) ? 1 + (count >> CHUNKSHIFT) : 0;
152 size_t chunksSz = chunks_.size();
153 if (newSize == chunksSz)
156 if (newSize > chunksSz) {
157 chunks_.resize(newSize);
158 for (
auto i = chunksSz; i < newSize; ++i) {
159 chunks_[i] =
new T[1ULL << CHUNKSHIFT];
162 for (
auto i = newSize; i < chunksSz; ++i) {
165 chunks_.resize(newSize);
169 size_t size()
const {
return size_; }
void resize(size_t count)
void store(TElem *current)
Stores a copy of an element into the undo queue.
TElem * redo(TElem *current)
Retrieve the last element from the redo queue.
TElem * undo(TElem *current)
Retrieve the last element from the undo queue.
size_t contiguous(size_t pos) const
T & operator[](size_t idx)
void push_back(const T &e)
const T & operator[](size_t idx) const
A container useful for implementing a undo-redo behavior.