diff options
| author | Maxime Coste <frrrwww@gmail.com> | 2013-03-31 13:49:56 +0200 |
|---|---|---|
| committer | Maxime Coste <frrrwww@gmail.com> | 2013-03-31 14:53:32 +0200 |
| commit | 22c34b79f6e41fbb755c5b8cf8ae16b85c0b13bc (patch) | |
| tree | e57a892f9782cb6e517a625beb1ef07e677a1771 /src/buffer.hh | |
| parent | dbbe455eb1ccc9985c3c4965d0f96859242d9d88 (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.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; +}; } |
