Move change listener registration to BufferChangeListener_AutoRegister
DynamicSelectionList now just inherit from this class, so that the registration logic can be shared.
This commit is contained in:
parent
dbbe455eb1
commit
22c34b79f6
|
@ -244,6 +244,58 @@ constexpr Buffer::Flags operator~(Buffer::Flags lhs)
|
||||||
return (Buffer::Flags)(~(int)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;
|
||||||
|
};
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -5,55 +5,12 @@ namespace Kakoune
|
||||||
|
|
||||||
DynamicSelectionList::DynamicSelectionList(const Buffer& buffer,
|
DynamicSelectionList::DynamicSelectionList(const Buffer& buffer,
|
||||||
SelectionList selections)
|
SelectionList selections)
|
||||||
: m_buffer(&buffer), SelectionList(std::move(selections))
|
: SelectionList(std::move(selections)),
|
||||||
|
BufferChangeListener_AutoRegister(buffer)
|
||||||
{
|
{
|
||||||
m_buffer->change_listeners().insert(this);
|
|
||||||
check_invariant();
|
check_invariant();
|
||||||
}
|
}
|
||||||
|
|
||||||
DynamicSelectionList::~DynamicSelectionList()
|
|
||||||
{
|
|
||||||
m_buffer->change_listeners().erase(this);
|
|
||||||
}
|
|
||||||
|
|
||||||
DynamicSelectionList::DynamicSelectionList(const DynamicSelectionList& other)
|
|
||||||
: SelectionList(other), m_buffer(other.m_buffer)
|
|
||||||
{
|
|
||||||
m_buffer->change_listeners().insert(this);
|
|
||||||
}
|
|
||||||
|
|
||||||
DynamicSelectionList& DynamicSelectionList::operator=(const DynamicSelectionList& other)
|
|
||||||
{
|
|
||||||
SelectionList::operator=((const SelectionList&)other);
|
|
||||||
if (m_buffer != other.m_buffer)
|
|
||||||
{
|
|
||||||
m_buffer->change_listeners().erase(this);
|
|
||||||
m_buffer = other.m_buffer;
|
|
||||||
m_buffer->change_listeners().insert(this);
|
|
||||||
}
|
|
||||||
check_invariant();
|
|
||||||
return *this;
|
|
||||||
}
|
|
||||||
|
|
||||||
DynamicSelectionList::DynamicSelectionList(DynamicSelectionList&& other)
|
|
||||||
: SelectionList(std::move(other)), m_buffer(other.m_buffer)
|
|
||||||
{
|
|
||||||
m_buffer->change_listeners().insert(this);
|
|
||||||
}
|
|
||||||
|
|
||||||
DynamicSelectionList& DynamicSelectionList::operator=(DynamicSelectionList&& other)
|
|
||||||
{
|
|
||||||
SelectionList::operator=(std::move(other));
|
|
||||||
if (m_buffer != other.m_buffer)
|
|
||||||
{
|
|
||||||
m_buffer->change_listeners().erase(this);
|
|
||||||
m_buffer = other.m_buffer;
|
|
||||||
m_buffer->change_listeners().insert(this);
|
|
||||||
}
|
|
||||||
check_invariant();
|
|
||||||
return *this;
|
|
||||||
}
|
|
||||||
|
|
||||||
DynamicSelectionList& DynamicSelectionList::operator=(SelectionList selections)
|
DynamicSelectionList& DynamicSelectionList::operator=(SelectionList selections)
|
||||||
{
|
{
|
||||||
SelectionList::operator=(std::move(selections));
|
SelectionList::operator=(std::move(selections));
|
||||||
|
@ -64,9 +21,10 @@ DynamicSelectionList& DynamicSelectionList::operator=(SelectionList selections)
|
||||||
void DynamicSelectionList::check_invariant() const
|
void DynamicSelectionList::check_invariant() const
|
||||||
{
|
{
|
||||||
#ifdef KAK_DEBUG
|
#ifdef KAK_DEBUG
|
||||||
|
const Buffer* buf = &buffer();
|
||||||
for (auto& sel : *this)
|
for (auto& sel : *this)
|
||||||
{
|
{
|
||||||
assert(m_buffer == &sel.buffer());
|
assert(buf == &sel.buffer());
|
||||||
sel.check_invariant();
|
sel.check_invariant();
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -6,32 +6,23 @@
|
||||||
namespace Kakoune
|
namespace Kakoune
|
||||||
{
|
{
|
||||||
|
|
||||||
class DynamicSelectionList : public SelectionList, public BufferChangeListener
|
class DynamicSelectionList : public SelectionList,
|
||||||
|
public BufferChangeListener_AutoRegister
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
using iterator = SelectionList::iterator;
|
using iterator = SelectionList::iterator;
|
||||||
using const_iterator = SelectionList::const_iterator;
|
using const_iterator = SelectionList::const_iterator;
|
||||||
|
|
||||||
DynamicSelectionList(const Buffer& buffer, SelectionList selections = {});
|
DynamicSelectionList(const Buffer& buffer, SelectionList selections = {});
|
||||||
~DynamicSelectionList();
|
|
||||||
|
|
||||||
DynamicSelectionList(const DynamicSelectionList& other);
|
|
||||||
DynamicSelectionList& operator=(const DynamicSelectionList& other);
|
|
||||||
DynamicSelectionList(DynamicSelectionList&& other);
|
|
||||||
DynamicSelectionList& operator=(DynamicSelectionList&& other);
|
|
||||||
|
|
||||||
DynamicSelectionList& operator=(SelectionList selections);
|
DynamicSelectionList& operator=(SelectionList selections);
|
||||||
void check_invariant() const;
|
void check_invariant() const;
|
||||||
|
|
||||||
const Buffer& buffer() const { return *m_buffer; }
|
|
||||||
|
|
||||||
private:
|
private:
|
||||||
void on_insert(const BufferIterator& begin,
|
void on_insert(const BufferIterator& begin,
|
||||||
const BufferIterator& end) override;
|
const BufferIterator& end) override;
|
||||||
void on_erase(const BufferIterator& begin,
|
void on_erase(const BufferIterator& begin,
|
||||||
const BufferIterator& end) override;
|
const BufferIterator& end) override;
|
||||||
|
|
||||||
const Buffer* m_buffer;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
Loading…
Reference in New Issue
Block a user