summaryrefslogtreecommitdiff
path: root/src/buffer.hh
diff options
context:
space:
mode:
authorMaxime Coste <frrrwww@gmail.com>2013-03-31 13:49:56 +0200
committerMaxime Coste <frrrwww@gmail.com>2013-03-31 14:53:32 +0200
commit22c34b79f6e41fbb755c5b8cf8ae16b85c0b13bc (patch)
treee57a892f9782cb6e517a625beb1ef07e677a1771 /src/buffer.hh
parentdbbe455eb1ccc9985c3c4965d0f96859242d9d88 (diff)
Move change listener registration to BufferChangeListener_AutoRegister
DynamicSelectionList now just inherit from this class, so that the registration logic can be shared.
Diffstat (limited to 'src/buffer.hh')
-rw-r--r--src/buffer.hh52
1 files changed, 52 insertions, 0 deletions
diff --git a/src/buffer.hh b/src/buffer.hh
index f3c80afc..260c00a0 100644
--- a/src/buffer.hh
+++ b/src/buffer.hh
@@ -244,6 +244,58 @@ constexpr Buffer::Flags operator~(Buffer::Flags lhs)
return (Buffer::Flags)(~(int)lhs);
}
+class BufferChangeListener_AutoRegister : public BufferChangeListener
+{
+public:
+ BufferChangeListener_AutoRegister(const Buffer& buffer)
+ : m_buffer(&buffer)
+ {
+ m_buffer->change_listeners().insert(this);
+ }
+
+ BufferChangeListener_AutoRegister(const BufferChangeListener_AutoRegister& other)
+ : m_buffer(other.m_buffer)
+ {
+ m_buffer->change_listeners().insert(this);
+ }
+
+ BufferChangeListener_AutoRegister(BufferChangeListener_AutoRegister&& other)
+ : m_buffer(other.m_buffer)
+ {
+ m_buffer->change_listeners().insert(this);
+ }
+
+ ~BufferChangeListener_AutoRegister()
+ {
+ m_buffer->change_listeners().erase(this);
+ }
+
+ BufferChangeListener_AutoRegister& operator=(const BufferChangeListener_AutoRegister& other)
+ {
+ if (m_buffer != other.m_buffer)
+ {
+ m_buffer->change_listeners().erase(this);
+ m_buffer = other.m_buffer;
+ m_buffer->change_listeners().insert(this);
+ }
+ return *this;
+ }
+
+ BufferChangeListener_AutoRegister& operator=(BufferChangeListener_AutoRegister&& other)
+ {
+ if (m_buffer != other.m_buffer)
+ {
+ m_buffer->change_listeners().erase(this);
+ m_buffer = other.m_buffer;
+ m_buffer->change_listeners().insert(this);
+ }
+ return *this;
+ }
+
+ const Buffer& buffer() const { return *m_buffer; }
+private:
+ const Buffer* m_buffer;
+};
}