[Libreoffice-commits] core.git: filter/source include/filter sw/source
Caolán McNamara
caolanm at redhat.com
Fri Apr 20 10:21:22 UTC 2018
filter/source/msfilter/msdffimp.cxx | 21 ++++++++++++++-------
include/filter/msfilter/msdffimp.hxx | 17 +++++++++++------
sw/source/filter/ww8/ww8graf.cxx | 5 ++---
sw/source/filter/ww8/ww8par.cxx | 2 +-
4 files changed, 28 insertions(+), 17 deletions(-)
New commits:
commit 9887cd14e2777eed019aacfd0ac75554686c6b79
Author: Caolán McNamara <caolanm at redhat.com>
Date: Thu Apr 19 14:43:40 2018 +0100
use a map to avoid looping on every obj delete
Change-Id: I47ff4f0f959b7d09fc91593b7dacb3d1a2b50472
Reviewed-on: https://gerrit.libreoffice.org/53164
Tested-by: Jenkins <ci at libreoffice.org>
Reviewed-by: Caolán McNamara <caolanm at redhat.com>
Tested-by: Caolán McNamara <caolanm at redhat.com>
diff --git a/filter/source/msfilter/msdffimp.cxx b/filter/source/msfilter/msdffimp.cxx
index 6e1726c9785c..f2fbc026c16d 100644
--- a/filter/source/msfilter/msdffimp.cxx
+++ b/filter/source/msfilter/msdffimp.cxx
@@ -5030,14 +5030,18 @@ void SvxMSDffManager::GetGroupAnchors( const DffRecordHeader& rHd, SvStream& rSt
SvxMSDffImportRec* SvxMSDffImportData::find(const SdrObject* pObj)
{
- for (const auto& it : *this)
- {
- if (it->pObj == pObj)
- return it.get();
- }
+ auto it = m_ObjToRecMap.find(pObj);
+ if (it != m_ObjToRecMap.end())
+ return it->second;
return nullptr;
}
+void SvxMSDffImportData::insert(SvxMSDffImportRec* pImpRec)
+{
+ m_ObjToRecMap[pImpRec->pObj] = pImpRec;
+ m_Records.insert(std::unique_ptr<SvxMSDffImportRec>(pImpRec));
+}
+
void SvxMSDffManager::NotifyFreeObj(void* pData, SdrObject* pObj)
{
if (SdrObjGroup* pGroup = dynamic_cast<SdrObjGroup*>(pObj))
@@ -5050,7 +5054,10 @@ void SvxMSDffManager::NotifyFreeObj(void* pData, SdrObject* pObj)
SvxMSDffImportData& rImportData = *static_cast<SvxMSDffImportData*>(pData);
if (SvxMSDffImportRec* pRecord = rImportData.find(pObj))
+ {
+ rImportData.unmap(pObj);
pRecord->pObj = nullptr;
+ }
}
void SvxMSDffManager::FreeObj(void* pData, SdrObject* pObj)
@@ -5543,7 +5550,7 @@ SdrObject* SvxMSDffManager::ProcessObj(SvStream& rSt,
if( pOrgObj )
{
pImpRec->pObj = pOrgObj;
- rImportData.m_Records.insert(std::unique_ptr<SvxMSDffImportRec>(pImpRec));
+ rImportData.insert(pImpRec);
bDeleteImpRec = false;
if (pImpRec == pTextImpRec)
bDeleteTextImpRec = false;
@@ -5554,7 +5561,7 @@ SdrObject* SvxMSDffManager::ProcessObj(SvStream& rSt,
// Modify ShapeId (must be unique)
pImpRec->nShapeId |= 0x8000000;
pTextImpRec->pObj = pTextObj;
- rImportData.m_Records.insert(std::unique_ptr<SvxMSDffImportRec>(pTextImpRec));
+ rImportData.insert(pTextImpRec);
bDeleteTextImpRec = false;
if (pTextImpRec == pImpRec)
bDeleteImpRec = false;
diff --git a/include/filter/msfilter/msdffimp.hxx b/include/filter/msfilter/msdffimp.hxx
index 022994a51873..5c0742a39f0a 100644
--- a/include/filter/msfilter/msdffimp.hxx
+++ b/include/filter/msfilter/msdffimp.hxx
@@ -262,16 +262,18 @@ private:
SvxMSDffImportRec &operator=(const SvxMSDffImportRec&) = delete;
};
-/** list of all SvxMSDffImportRec instances of/for a group */
-typedef std::set<std::unique_ptr<SvxMSDffImportRec>,
- comphelper::UniquePtrValueLess<SvxMSDffImportRec>> MSDffImportRecords;
-
/** block of parameters for import/export for a single call of
ImportObjAtCurrentStreamPos() */
-struct MSFILTER_DLLPUBLIC SvxMSDffImportData
+class MSFILTER_DLLPUBLIC SvxMSDffImportData
{
+private:
+ /** list of all SvxMSDffImportRec instances of/for a group */
+ typedef std::set<std::unique_ptr<SvxMSDffImportRec>,
+ comphelper::UniquePtrValueLess<SvxMSDffImportRec>> MSDffImportRecords;
MSDffImportRecords m_Records; ///< Shape pointer, Shape ids and private data
- tools::Rectangle aParentRect;///< Rectangle of the surrounding groups,
+ std::map<const SdrObject*, SvxMSDffImportRec*> m_ObjToRecMap;
+public:
+ tools::Rectangle aParentRect;///< Rectangle of the surrounding groups,
///< which might have been provided externally
explicit SvxMSDffImportData(const tools::Rectangle& rParentRect);
@@ -279,6 +281,9 @@ struct MSFILTER_DLLPUBLIC SvxMSDffImportData
SvxMSDffImportData( SvxMSDffImportData const & ) = delete; // MSVC2015 workaround
~SvxMSDffImportData();
bool empty() const { return m_Records.empty(); }
+ void insert(SvxMSDffImportRec* pImpRec);
+ void unmap(const SdrObject* pObj) { m_ObjToRecMap.erase(pObj); }
+ SvxMSDffImportRec* front() { return m_Records.begin()->get(); }
size_t size() const { return m_Records.size(); }
SvxMSDffImportRec* find(const SdrObject* pObj);
MSDffImportRecords::const_iterator begin() const { return m_Records.begin(); }
diff --git a/sw/source/filter/ww8/ww8graf.cxx b/sw/source/filter/ww8/ww8graf.cxx
index d16d16cfa4af..53a3c3289f71 100644
--- a/sw/source/filter/ww8/ww8graf.cxx
+++ b/sw/source/filter/ww8/ww8graf.cxx
@@ -2753,10 +2753,9 @@ SwFrameFormat* SwWW8ImplReader::Read_GrafLayer( long nGrafAnchorCp )
*/
if (!aData.empty())
{
- for (MSDffImportRecords::const_iterator it = aData.begin();
- it != aData.end(); ++it)
+ for (const auto& it : aData)
{
- pRecord = it->get();
+ pRecord = it.get();
if (pRecord->pObj && pRecord->aTextId.nTxBxS)
{ // #i52825# pRetFrameFormat can be NULL
pRetFrameFormat = MungeTextIntoDrawBox(
diff --git a/sw/source/filter/ww8/ww8par.cxx b/sw/source/filter/ww8/ww8par.cxx
index befa3c2eb51a..1b735a0b02a0 100644
--- a/sw/source/filter/ww8/ww8par.cxx
+++ b/sw/source/filter/ww8/ww8par.cxx
@@ -1040,7 +1040,7 @@ SdrObject* SwMSDffManager::ProcessObj(SvStream& rSt,
{
// Complement Import Record List
pImpRec->pObj = pObj;
- rImportData.m_Records.insert(std::unique_ptr<SvxMSDffImportRec>(pImpRec));
+ rImportData.insert(pImpRec);
// Complement entry in Z Order List with a pointer to this Object
// Only store objects which are not deep inside the tree
More information about the Libreoffice-commits
mailing list