tdf#100442 use unordered_set for GraphicManager's maObjList
Speeds up ImplCheckSizeOfSwappedInGraphics. maObjList didn't seem to depend on it being a vector. Change-Id: I0028186b5c4f53ae198b9b33a31c51f0b2e5eb45 Reviewed-on: https://gerrit.libreoffice.org/28439 Tested-by: Jenkins <ci@libreoffice.org> Reviewed-by: Michael Meeks <michael.meeks@collabora.com> Tested-by: Michael Meeks <michael.meeks@collabora.com>
This commit is contained in:
committed by
Michael Meeks
parent
67ef208b2b
commit
fdc867a4bc
@@ -24,6 +24,8 @@
|
||||
#include <svtools/svtdllapi.h>
|
||||
#include <o3tl/typed_flags_set.hxx>
|
||||
|
||||
#include <unordered_set>
|
||||
|
||||
enum class GraphicManagerDrawFlags
|
||||
{
|
||||
CACHED = 0x01,
|
||||
@@ -504,8 +506,6 @@ public:
|
||||
sal_uLong GetDataChangeTimeStamp() const { return mnDataChangeTimeStamp; }
|
||||
};
|
||||
|
||||
typedef ::std::vector< GraphicObject* > GraphicObjectList_impl;
|
||||
|
||||
class SVT_DLLPUBLIC GraphicManager
|
||||
{
|
||||
friend class GraphicObject;
|
||||
@@ -513,7 +513,7 @@ class SVT_DLLPUBLIC GraphicManager
|
||||
|
||||
private:
|
||||
|
||||
GraphicObjectList_impl maObjList;
|
||||
std::unordered_set< GraphicObject* > maObjList;
|
||||
sal_uLong mnUsedSize; // currently used memory footprint of all swapped in graphics
|
||||
GraphicCache* mpCache;
|
||||
|
||||
|
@@ -146,7 +146,7 @@ class GraphicCacheEntry
|
||||
{
|
||||
private:
|
||||
|
||||
GraphicObjectList_impl maGraphicObjectList;
|
||||
std::vector< GraphicObject* > maGraphicObjectList;
|
||||
|
||||
GraphicID maID;
|
||||
GfxLink maGfxLink;
|
||||
@@ -336,7 +336,7 @@ void GraphicCacheEntry::AddGraphicObjectReference( const GraphicObject& rObj, Gr
|
||||
bool GraphicCacheEntry::ReleaseGraphicObjectReference( const GraphicObject& rObj )
|
||||
{
|
||||
for(
|
||||
GraphicObjectList_impl::iterator it = maGraphicObjectList.begin();
|
||||
auto it = maGraphicObjectList.begin();
|
||||
it != maGraphicObjectList.end();
|
||||
++it
|
||||
) {
|
||||
|
@@ -141,10 +141,10 @@ bool GraphicManager::DrawObj( OutputDevice* pOut, const Point& rPt, const Size&
|
||||
void GraphicManager::ImplRegisterObj( const GraphicObject& rObj, Graphic& rSubstitute,
|
||||
const OString* pID, const GraphicObject* pCopyObj )
|
||||
{
|
||||
assert(std::find(maObjList.begin(), maObjList.end(),
|
||||
const_cast<GraphicObject*>(&rObj)) == maObjList.end());
|
||||
assert(maObjList.find(const_cast<GraphicObject*>(&rObj)) == maObjList.end());
|
||||
|
||||
maObjList.emplace( const_cast<GraphicObject*>(&rObj) );
|
||||
|
||||
maObjList.push_back( const_cast<GraphicObject*>(&rObj) );
|
||||
mpCache->AddGraphicObject( rObj, rSubstitute, pID, pCopyObj );
|
||||
if( !rObj.IsSwappedOut() )
|
||||
mnUsedSize += rObj.maGraphic.GetSizeBytes();
|
||||
@@ -158,13 +158,9 @@ void GraphicManager::ImplUnregisterObj( const GraphicObject& rObj )
|
||||
assert(mnUsedSize >= rObj.maGraphic.GetSizeBytes());
|
||||
mnUsedSize -= rObj.maGraphic.GetSizeBytes();
|
||||
}
|
||||
for( GraphicObjectList_impl::iterator it = maObjList.begin(); it != maObjList.end(); ++it )
|
||||
{
|
||||
if ( *it == &rObj ) {
|
||||
maObjList.erase( it );
|
||||
return;
|
||||
}
|
||||
}
|
||||
if ( 0 < maObjList.erase( const_cast<GraphicObject*>(&rObj) ) )
|
||||
return;
|
||||
|
||||
assert(false); // surely it should have been registered?
|
||||
}
|
||||
|
||||
@@ -203,7 +199,7 @@ void GraphicManager::ImplCheckSizeOfSwappedInGraphics(const GraphicObject* pGrap
|
||||
std::vector< GraphicObject* > aCandidates(maObjList.begin(), maObjList.end());
|
||||
// if we use more currently, sort by last DataChangeTimeStamp
|
||||
// sort by DataChangeTimeStamp so that the oldest get removed first
|
||||
::std::sort(aCandidates.begin(), aCandidates.end(), simpleSortByDataChangeTimeStamp());
|
||||
std::sort(aCandidates.begin(), aCandidates.end(), simpleSortByDataChangeTimeStamp());
|
||||
|
||||
for(sal_uInt32 a(0); mnUsedSize >= nMaxCacheSize && a < aCandidates.size(); a++)
|
||||
{
|
||||
@@ -214,7 +210,7 @@ void GraphicManager::ImplCheckSizeOfSwappedInGraphics(const GraphicObject* pGrap
|
||||
{
|
||||
continue;
|
||||
}
|
||||
if (std::find(maObjList.begin(), maObjList.end(), pObj) == maObjList.end())
|
||||
if (maObjList.find(pObj) == maObjList.end())
|
||||
{
|
||||
// object has been deleted when swapping out another one
|
||||
continue;
|
||||
|
Reference in New Issue
Block a user