From fa804db4ab0871a402805c6316b644ac18a73ad8 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Andr=C3=A9=20P=C3=B6nitz?= Date: Wed, 16 Apr 2008 22:02:26 +0000 Subject: [PATCH] fix leak in the undo stack git-svn-id: svn://svn.lyx.org/lyx/lyx-devel/trunk@24308 a592a061-630c-0410-9148-cb99ea01b6c8 --- src/Undo.cpp | 62 ++++++++++++++++++++++++++++------- src/frontends/qt4/GuiView.cpp | 2 +- 2 files changed, 52 insertions(+), 12 deletions(-) diff --git a/src/Undo.cpp b/src/Undo.cpp index 8f3e67c8e2..b32eb67db8 100644 --- a/src/Undo.cpp +++ b/src/Undo.cpp @@ -30,12 +30,11 @@ #include "insets/Inset.h" -#include "support/debug.h" -#include "support/limited_stack.h" - #include "support/assert.h" +#include "support/debug.h" #include +#include #include using namespace std; @@ -89,6 +88,48 @@ struct UndoElement }; +class UndoElementStack +{ +public: + /// limit is the maximum size of the stack + UndoElementStack(size_t limit = 100) { limit_ = limit; } + /// limit is the maximum size of the stack + ~UndoElementStack() { clear(); } + + /// Return the top element. + UndoElement & top() { return c_.front(); } + + /// Pop and throw away the top element. + void pop() { c_.pop_front(); } + + /// Return true if the stack is empty. + bool empty() const { return c_.empty(); } + + /// Clear all elements, deleting them. + void clear() { + for (size_t i = 0; i != c_.size(); ++i) { + delete c_[i].array; + delete c_[i].pars; + } + c_.clear(); + } + + /// Push an item on to the stack, deleting the + /// bottom item on overflow. + void push(UndoElement const & v) { + c_.push_front(v); + if (c_.size() > limit_) + c_.pop_back(); + } + +private: + /// Internal contents. + std::deque c_; + /// The maximum number elements stored. + size_t limit_; +}; + + struct Undo::Private { Private(Buffer & buffer) : buffer_(buffer), undo_finished_(true) {} @@ -113,9 +154,9 @@ struct Undo::Private /// Buffer & buffer_; /// Undo stack. - limited_stack undostack_; + UndoElementStack undostack_; /// Redo stack. - limited_stack redostack_; + UndoElementStack redostack_; /// The flag used by Undo::finishUndo(). bool undo_finished_; @@ -152,12 +193,14 @@ bool Undo::hasRedoStack() const } +#if 0 static ostream & operator<<(ostream & os, UndoElement const & undo) { return os << " from: " << undo.from << " end: " << undo.end << " cell:\n" << undo.cell << " cursor:\n" << undo.cursor; } +#endif static bool samePar(StableDocIterator const & i1, StableDocIterator const & i2) @@ -198,8 +241,7 @@ void Undo::Private::doRecordUndo(UndoKind kind, undo.from = first_pit; undo.end = cell.lastpit() - last_pit; - limited_stack & stack = isUndoOperation ? - undostack_ : redostack_; + UndoElementStack & stack = isUndoOperation ? undostack_ : redostack_; // Undo::ATOMIC are always recorded (no overlapping there). // As nobody wants all removed character appear one by one when undoing, @@ -261,15 +303,13 @@ bool Undo::Private::textUndoOrRedo(DocIterator & cur, bool isUndoOperation) { undo_finished_ = true; - limited_stack & stack = isUndoOperation ? - undostack_ : redostack_; + UndoElementStack & stack = isUndoOperation ? undostack_ : redostack_; if (stack.empty()) // Nothing to do. return false; - limited_stack & otherstack = isUndoOperation ? - redostack_ : undostack_; + UndoElementStack & otherstack = isUndoOperation ? redostack_ : undostack_; // Adjust undo stack and get hold of current undo data. UndoElement undo = stack.top(); diff --git a/src/frontends/qt4/GuiView.cpp b/src/frontends/qt4/GuiView.cpp index 2e45eb20f3..3201ffa127 100644 --- a/src/frontends/qt4/GuiView.cpp +++ b/src/frontends/qt4/GuiView.cpp @@ -53,6 +53,7 @@ #include "ToolbarBackend.h" #include "version.h" +#include "support/assert.h" #include "support/debug.h" #include "support/FileFilterList.h" #include "support/FileName.h" @@ -88,7 +89,6 @@ #include #include -#include "support/assert.h" #include #ifdef HAVE_SYS_TIME_H -- 2.39.5