diff options
Diffstat (limited to 'src/buffer.hh')
| -rw-r--r-- | src/buffer.hh | 52 |
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; +}; } |
