summaryrefslogtreecommitdiff
path: root/src/buffer.hh
diff options
context:
space:
mode:
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;
+};
}