aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/undo.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/undo.h')
-rw-r--r--src/undo.h44
1 files changed, 28 insertions, 16 deletions
diff --git a/src/undo.h b/src/undo.h
index 35991ff..93f68e5 100644
--- a/src/undo.h
+++ b/src/undo.h
@@ -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.