aboutsummaryrefslogtreecommitdiffhomepage
path: root/src
diff options
context:
space:
mode:
authorRobin Haberkorn <robin.haberkorn@googlemail.com>2013-02-14 04:38:18 +0100
committerRobin Haberkorn <robin.haberkorn@googlemail.com>2013-02-14 05:22:07 +0100
commitdd4947d015548dc4c1c299a50dda4f86d6d31bdc (patch)
tree713ac6e065c1ac996981c8773eb7f5452a8a197d /src
parent0f5c2c89f20dc07c1e0f8e8a619850629825c9c3 (diff)
downloadsciteco-dd4947d015548dc4c1c299a50dda4f86d6d31bdc.tar.gz
undo q-register table initializations (insertions) on rubout
Diffstat (limited to 'src')
-rw-r--r--src/qregisters.cpp1
-rw-r--r--src/qregisters.h24
2 files changed, 24 insertions, 1 deletions
diff --git a/src/qregisters.cpp b/src/qregisters.cpp
index 5d526a7..b5e3080 100644
--- a/src/qregisters.cpp
+++ b/src/qregisters.cpp
@@ -430,6 +430,7 @@ done:
if (!initialize)
throw State::InvalidQRegError(name, is_local);
reg = table.insert(new QRegister(name));
+ table.undo_remove(reg);
}
return reg;
diff --git a/src/qregisters.h b/src/qregisters.h
index c5740f6..15acd86 100644
--- a/src/qregisters.h
+++ b/src/qregisters.h
@@ -153,11 +153,33 @@ public:
};
class QRegisterTable : public RBTree {
+ class UndoTokenRemove : public UndoToken {
+ QRegisterTable *table;
+ QRegister *reg;
+
+ public:
+ UndoTokenRemove(QRegisterTable *_table, QRegister *_reg)
+ : table(_table), reg(_reg) {}
+
+ void
+ run(void)
+ {
+ delete table->remove(reg);
+ }
+ };
+
bool must_undo;
public:
QRegisterTable(bool _undo = true);
+ inline void
+ undo_remove(QRegister *reg)
+ {
+ if (must_undo)
+ undo.push(new UndoTokenRemove(this, reg));
+ }
+
inline QRegister *
insert(QRegister *reg)
{
@@ -189,7 +211,7 @@ public:
inline QRegister *
operator [](gchar chr)
{
- return operator []((gchar []){chr, '\0'});
+ return operator [](CHR2STR(chr));
}
void edit(QRegister *reg);