diff options
Diffstat (limited to 'src/undo.h')
-rw-r--r-- | src/undo.h | 44 |
1 files changed, 28 insertions, 16 deletions
@@ -33,22 +33,18 @@ namespace SciTECO { +/** + * Undo tokens are generated to revert any + * changes to the editor state, ie. they + * define an action to take upon rubout. + * + * Undo tokens are organized into an undo + * stack. + */ class UndoToken : public Object { public: SLIST_ENTRY(UndoToken) tokens; - /** - * Command-line character position (program counter) - * corresponding to this token. - * - * @todo This wastes memory in macro calls and loops - * because all undo tokens will have the same - * value. It may be better to redesign the undo - * stack data structure - as a list/array pointing - * to undo stacks per character. - */ - gint pc; - virtual ~UndoToken() {} virtual void run(void) = 0; @@ -123,18 +119,34 @@ public: }; extern class UndoStack : public Object { - SLIST_HEAD(Head, UndoToken) head; + /** + * Stack of UndoToken lists. + * + * Each stack element represents + * a command line character (the UndoTokens + * generated by that character), so it's OK + * to use a data structure that may need + * reallocation but is space efficient. + * This data structure allows us to omit the + * command line program counter from the UndoTokens + * but wastes a few bytes for input characters + * that produce no UndoToken (e.g. NOPs like space). + */ + GPtrArray *heads; void push(UndoToken *token); public: bool enabled; - UndoStack(bool _enabled = false) : enabled(_enabled) + UndoStack(bool _enabled = false) + : heads(g_ptr_array_new()), enabled(_enabled) {} + ~UndoStack() { - SLIST_INIT(&head); + clear(); + g_ptr_array_free(heads, TRUE); } - ~UndoStack(); + /** * Allocate and push undo token. |