sw/inc/calbck.hxx | 12 ++++-------- sw/source/core/attr/calbck.cxx | 24 ++++++++++++++++++------ 2 files changed, 22 insertions(+), 14 deletions(-)
New commits: commit c663523ae63b18ea7e85afeb47c0c97e1064aa05 Author: Bjoern Michaelsen <bjoern.michael...@libreoffice.org> Date: Tue May 8 01:02:45 2018 +0200 no extra heap allocs by WriterMultiListener Change-Id: I53fbc049e8462b09a1fe7fbdd4207032ddaf5a2b Reviewed-on: https://gerrit.libreoffice.org/53955 Tested-by: Jenkins <c...@libreoffice.org> Reviewed-by: Björn Michaelsen <bjoern.michael...@libreoffice.org> diff --git a/sw/inc/calbck.hxx b/sw/inc/calbck.hxx index cbe45ce74b48..9f809ea24dbd 100644 --- a/sw/inc/calbck.hxx +++ b/sw/inc/calbck.hxx @@ -106,14 +106,13 @@ class SW_DLLPUBLIC SwClient : public ::sw::WriterListener protected: // single argument ctors shall be explicit. inline explicit SwClient( SwModify* pToRegisterIn ); - SwClient(SwClient&&); // write access to pRegisteredIn shall be granted only to the object itself (protected access) SwModify* GetRegisteredInNonConst() const { return m_pRegisteredIn; } public: - SwClient() : m_pRegisteredIn(nullptr) {} + SwClient(SwClient&&) noexcept; virtual ~SwClient() override; // callbacks received from SwModify (friend class - so these methods can be private) // should be called only from SwModify the client is registered in @@ -209,15 +208,12 @@ namespace sw class ListenerEntry; class SW_DLLPUBLIC WriterMultiListener final { - #ifdef WNT - typedef std::shared_ptr<ListenerEntry> pointer_t; - #else - typedef std::unique_ptr<ListenerEntry> pointer_t; - #endif SwClient& m_rToTell; - std::vector<pointer_t> m_vDepends; + std::vector<ListenerEntry> m_vDepends; public: WriterMultiListener(SwClient& rToTell); + WriterMultiListener& operator=(WriterMultiListener const&) = delete; // MSVC2015 workaround + WriterMultiListener(WriterMultiListener const&) = delete; // MSVC2015 workaround ~WriterMultiListener(); void StartListening(SwModify* pDepend); void EndListening(SwModify* pDepend); diff --git a/sw/source/core/attr/calbck.cxx b/sw/source/core/attr/calbck.cxx index e9774a10a716..3ab307bd6e24 100644 --- a/sw/source/core/attr/calbck.cxx +++ b/sw/source/core/attr/calbck.cxx @@ -34,6 +34,18 @@ namespace sw public: ListenerEntry(SwClient* pTellHim, SwModify * pDepend) : SwClient(pDepend), m_pToTell(pTellHim) {} ListenerEntry(ListenerEntry&) = delete; + ListenerEntry& operator=(ListenerEntry const&) = delete; + ListenerEntry(ListenerEntry&& other) noexcept + : SwClient(std::move(other)) + , m_pToTell(other.m_pToTell) + { } + ListenerEntry& operator=(ListenerEntry&& other) noexcept + { + m_pToTell = other.m_pToTell; + other.GetRegisteredIn()->Add(this); + other.EndListeningAll(); + return *this; + } /** get Client information */ virtual bool GetInfo( SfxPoolItem& rInfo) const override @@ -65,7 +77,7 @@ namespace sw sw::LegacyModifyHint::~LegacyModifyHint() {} sw::ModifyChangedHint::~ModifyChangedHint() {} -SwClient::SwClient(SwClient&& o) +SwClient::SwClient(SwClient&& o) noexcept : m_pRegisteredIn(nullptr) { if(o.m_pRegisteredIn) @@ -343,16 +355,16 @@ sw::WriterMultiListener::~WriterMultiListener() void sw::WriterMultiListener::StartListening(SwModify* pDepend) { EndListening(nullptr); - m_vDepends.emplace_back(pointer_t(new ListenerEntry(&m_rToTell, pDepend))); + m_vDepends.emplace_back(ListenerEntry(&m_rToTell, pDepend)); } bool sw::WriterMultiListener::IsListeningTo(const SwModify* const pBroadcaster) { return std::any_of(m_vDepends.begin(), m_vDepends.end(), - [&pBroadcaster](const pointer_t& pListener) + [&pBroadcaster](const ListenerEntry& aListener) { - return pListener->GetRegisteredIn() == pBroadcaster; + return aListener.GetRegisteredIn() == pBroadcaster; }); } @@ -360,9 +372,9 @@ void sw::WriterMultiListener::EndListening(SwModify* pBroadcaster) { m_vDepends.erase( std::remove_if( m_vDepends.begin(), m_vDepends.end(), - [&pBroadcaster](const pointer_t& pListener) + [&pBroadcaster](const ListenerEntry& aListener) { - return pListener->GetRegisteredIn() == nullptr || pListener->GetRegisteredIn() == pBroadcaster; + return aListener.GetRegisteredIn() == nullptr || aListener.GetRegisteredIn() == pBroadcaster; }), m_vDepends.end()); } _______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/libreoffice-commits