diff options
author | Bjoern Michaelsen <bjoern.michaelsen@libreoffice.org> | 2018-05-08 01:02:45 +0200 |
---|---|---|
committer | Björn Michaelsen <bjoern.michaelsen@libreoffice.org> | 2018-05-09 21:26:00 +0200 |
commit | c663523ae63b18ea7e85afeb47c0c97e1064aa05 (patch) | |
tree | 183b88e922675b8e8d3c34fc13d09194acb2baeb /sw | |
parent | c330f795ae1e2515e5663e70426334659c2d8506 (diff) |
no extra heap allocs by WriterMultiListener
Change-Id: I53fbc049e8462b09a1fe7fbdd4207032ddaf5a2b
Reviewed-on: https://gerrit.libreoffice.org/53955
Tested-by: Jenkins <ci@libreoffice.org>
Reviewed-by: Björn Michaelsen <bjoern.michaelsen@libreoffice.org>
Diffstat (limited to 'sw')
-rw-r--r-- | sw/inc/calbck.hxx | 12 | ||||
-rw-r--r-- | sw/source/core/attr/calbck.cxx | 24 |
2 files changed, 22 insertions, 14 deletions
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()); } |