summaryrefslogtreecommitdiff
path: root/sc
diff options
context:
space:
mode:
authorNoel Grandin <noel.grandin@collabora.co.uk>2019-04-17 15:19:25 +0200
committerNoel Grandin <noel.grandin@collabora.co.uk>2019-04-20 08:02:25 +0200
commitec7ba61a6164c805f5a71b077715b7e1521a2d62 (patch)
tree4d4f3fb1ad960465897754601b0842c78db564bf /sc
parent7d58f26bf4dbeb4e138c2a91f039d8bc7fa00f0c (diff)
simplify SfxPoolItemArray_Impl (tdf#81765 related)
Since we want to look up items by pointer, just store them in a std::unordered_set, which allows fast find(). This dramatically simplifies most operations on this data structure. Fix a dodgy sd test that was relying on items with the same whichid being in the pool being in a certain order. Change-Id: I4d79fc718f95e3083a20788be1050fbe9fca7263 Reviewed-on: https://gerrit.libreoffice.org/70881 Tested-by: Jenkins Reviewed-by: Noel Grandin <noel.grandin@collabora.co.uk>
Diffstat (limited to 'sc')
-rw-r--r--sc/source/core/data/docpool.cxx11
-rw-r--r--sc/source/core/data/documen9.cxx22
-rw-r--r--sc/source/core/data/document.cxx29
-rw-r--r--sc/source/core/data/document10.cxx9
-rw-r--r--sc/source/core/data/fillinfo.cxx11
-rw-r--r--sc/source/filter/xml/xmlexprt.cxx31
-rw-r--r--sc/source/filter/xml/xmlfonte.cxx57
-rw-r--r--sc/source/ui/view/cellsh1.cxx28
-rw-r--r--sc/source/ui/view/tabvwshc.cxx13
9 files changed, 80 insertions, 131 deletions
diff --git a/sc/source/core/data/docpool.cxx b/sc/source/core/data/docpool.cxx
index 0f19f8561b14..3c21de8c8d69 100644
--- a/sc/source/core/data/docpool.cxx
+++ b/sc/source/core/data/docpool.cxx
@@ -349,10 +349,9 @@ const SfxPoolItem& ScDocumentPool::Put( const SfxPoolItem& rItem, sal_uInt16 nWh
void ScDocumentPool::StyleDeleted( const ScStyleSheet* pStyle )
{
- sal_uInt32 nCount = GetItemCount2(ATTR_PATTERN);
- for (sal_uInt32 i=0; i<nCount; i++)
+ for (const SfxPoolItem* pItem : GetItemSurrogates( ATTR_PATTERN ))
{
- ScPatternAttr* pPattern = const_cast<ScPatternAttr*>(GetItem2(ATTR_PATTERN, i));
+ ScPatternAttr* pPattern = const_cast<ScPatternAttr*>(dynamic_cast<const ScPatternAttr*>(pItem));
if ( pPattern && pPattern->GetStyleSheet() == pStyle )
pPattern->StyleToName();
}
@@ -365,11 +364,9 @@ void ScDocumentPool::CellStyleCreated( const OUString& rName, const ScDocument*
// Calling StyleSheetChanged isn't enough because the pool may still contain items
// for undo or clipboard content.
- sal_uInt32 nCount = GetItemCount2(ATTR_PATTERN);
- for (sal_uInt32 i=0; i<nCount; i++)
+ for (const SfxPoolItem* pItem : GetItemSurrogates( ATTR_PATTERN ))
{
- ScPatternAttr *const pPattern =
- const_cast<ScPatternAttr*>(GetItem2(ATTR_PATTERN, i));
+ auto pPattern = const_cast<ScPatternAttr*>(dynamic_cast<const ScPatternAttr*>(pItem));
if ( pPattern && pPattern->GetStyleSheet() == nullptr )
{
const OUString* pStyleName = pPattern->GetStyleName();
diff --git a/sc/source/core/data/documen9.cxx b/sc/source/core/data/documen9.cxx
index 8fc38fb2e533..d5146ed509ad 100644
--- a/sc/source/core/data/documen9.cxx
+++ b/sc/source/core/data/documen9.cxx
@@ -553,25 +553,23 @@ void ScDocument::UpdateFontCharSet()
if ( eSrcSet != eSysSet || bUpdateOld )
{
ScDocumentPool* pPool = mxPoolHelper->GetDocPool();
- sal_uInt32 nCount = pPool->GetItemCount2(ATTR_FONT);
- for (sal_uInt32 i=0; i<nCount; i++)
+ for (const SfxPoolItem* pItem : pPool->GetItemSurrogates(ATTR_FONT))
{
- SvxFontItem* pItem = const_cast<SvxFontItem*>(pPool->GetItem2(ATTR_FONT, i));
- if ( pItem && ( pItem->GetCharSet() == eSrcSet ||
- ( bUpdateOld && pItem->GetCharSet() != RTL_TEXTENCODING_SYMBOL ) ) )
- pItem->SetCharSet(eSysSet);
+ auto pFontItem = const_cast<SvxFontItem*>(dynamic_cast<const SvxFontItem*>(pItem));
+ if ( pFontItem && ( pFontItem->GetCharSet() == eSrcSet ||
+ ( bUpdateOld && pFontItem->GetCharSet() != RTL_TEXTENCODING_SYMBOL ) ) )
+ pFontItem->SetCharSet(eSysSet);
}
if ( mpDrawLayer )
{
SfxItemPool& rDrawPool = mpDrawLayer->GetItemPool();
- nCount = rDrawPool.GetItemCount2(EE_CHAR_FONTINFO);
- for (sal_uInt32 i=0; i<nCount; i++)
+ for (const SfxPoolItem* pItem : rDrawPool.GetItemSurrogates(EE_CHAR_FONTINFO))
{
- SvxFontItem* pItem = const_cast<SvxFontItem*>(rDrawPool.GetItem2(EE_CHAR_FONTINFO, i));
- if ( pItem && ( pItem->GetCharSet() == eSrcSet ||
- ( bUpdateOld && pItem->GetCharSet() != RTL_TEXTENCODING_SYMBOL ) ) )
- pItem->SetCharSet( eSysSet );
+ SvxFontItem* pFontItem = const_cast<SvxFontItem*>(dynamic_cast<const SvxFontItem*>(pItem));
+ if ( pFontItem && ( pFontItem->GetCharSet() == eSrcSet ||
+ ( bUpdateOld && pFontItem->GetCharSet() != RTL_TEXTENCODING_SYMBOL ) ) )
+ pFontItem->SetCharSet( eSysSet );
}
}
}
diff --git a/sc/source/core/data/document.cxx b/sc/source/core/data/document.cxx
index f41e9e34c1d4..b4baa4b67da4 100644
--- a/sc/source/core/data/document.cxx
+++ b/sc/source/core/data/document.cxx
@@ -5181,20 +5181,15 @@ bool ScDocument::HasAttrib( SCCOL nCol1, SCROW nRow1, SCTAB nTab1,
ScDocumentPool* pPool = mxPoolHelper->GetDocPool();
bool bAnyItem = false;
- sal_uInt32 nRotCount = pPool->GetItemCount2( ATTR_ROTATE_VALUE );
- for (sal_uInt32 nItem=0; nItem<nRotCount; nItem++)
+ for (const SfxPoolItem* pItem : pPool->GetItemSurrogates(ATTR_ROTATE_VALUE))
{
- const SfxPoolItem* pItem = pPool->GetItem2( ATTR_ROTATE_VALUE, nItem );
- if ( pItem )
+ // 90 or 270 degrees is former SvxOrientationItem - only look for other values
+ // (see ScPatternAttr::GetCellOrientation)
+ sal_Int32 nAngle = static_cast<const SfxInt32Item*>(pItem)->GetValue();
+ if ( nAngle != 0 && nAngle != 9000 && nAngle != 27000 )
{
- // 90 or 270 degrees is former SvxOrientationItem - only look for other values
- // (see ScPatternAttr::GetCellOrientation)
- sal_Int32 nAngle = static_cast<const SfxInt32Item*>(pItem)->GetValue();
- if ( nAngle != 0 && nAngle != 9000 && nAngle != 27000 )
- {
- bAnyItem = true;
- break;
- }
+ bAnyItem = true;
+ break;
}
}
if (!bAnyItem)
@@ -6108,10 +6103,9 @@ void ScDocument::UpdStlShtPtrsFrmNms()
{
ScDocumentPool* pPool = mxPoolHelper->GetDocPool();
- sal_uInt32 nCount = pPool->GetItemCount2(ATTR_PATTERN);
- for (sal_uInt32 i=0; i<nCount; i++)
+ for (const SfxPoolItem* pItem : pPool->GetItemSurrogates(ATTR_PATTERN))
{
- ScPatternAttr* pPattern = const_cast<ScPatternAttr*>(pPool->GetItem2(ATTR_PATTERN, i));
+ auto pPattern = const_cast<ScPatternAttr*>(dynamic_cast<const ScPatternAttr*>(pItem));
if (pPattern)
pPattern->UpdateStyleSheet(this);
}
@@ -6122,10 +6116,9 @@ void ScDocument::StylesToNames()
{
ScDocumentPool* pPool = mxPoolHelper->GetDocPool();
- sal_uInt32 nCount = pPool->GetItemCount2(ATTR_PATTERN);
- for (sal_uInt32 i=0; i<nCount; i++)
+ for (const SfxPoolItem* pItem : pPool->GetItemSurrogates(ATTR_PATTERN))
{
- ScPatternAttr* pPattern = const_cast<ScPatternAttr*>(pPool->GetItem2(ATTR_PATTERN, i));
+ auto pPattern = const_cast<ScPatternAttr*>(dynamic_cast<const ScPatternAttr*>(pItem));
if (pPattern)
pPattern->StyleToName();
}
diff --git a/sc/source/core/data/document10.cxx b/sc/source/core/data/document10.cxx
index 429fc33074fb..877809901297 100644
--- a/sc/source/core/data/document10.cxx
+++ b/sc/source/core/data/document10.cxx
@@ -185,13 +185,10 @@ std::set<Color> ScDocument::GetDocColors()
const sal_uInt16 pAttribs[] = {ATTR_BACKGROUND, ATTR_FONT_COLOR};
for (sal_uInt16 nAttrib : pAttribs)
{
- const sal_uInt32 nCount = pPool->GetItemCount2(nAttrib);
- for (sal_uInt32 j=0; j<nCount; j++)
+ for (const SfxPoolItem* pItem : pPool->GetItemSurrogates(nAttrib))
{
- const SvxColorItem *pItem = static_cast<const SvxColorItem*>(pPool->GetItem2(nAttrib, j));
- if (pItem == nullptr)
- continue;
- Color aColor( pItem->GetValue() );
+ const SvxColorItem *pColorItem = static_cast<const SvxColorItem*>(pItem);
+ Color aColor( pColorItem->GetValue() );
if (COL_AUTO != aColor)
aDocColors.insert(aColor);
}
diff --git a/sc/source/core/data/fillinfo.cxx b/sc/source/core/data/fillinfo.cxx
index 6c170200e8be..678709a6657e 100644
--- a/sc/source/core/data/fillinfo.cxx
+++ b/sc/source/core/data/fillinfo.cxx
@@ -181,16 +181,7 @@ public:
bool isRotateItemUsed(const ScDocumentPool *pPool)
{
- sal_uInt32 nRotCount = pPool->GetItemCount2( ATTR_ROTATE_VALUE );
- for (sal_uInt32 nItem=0; nItem<nRotCount; nItem++)
- {
- if (pPool->GetItem2( ATTR_ROTATE_VALUE, nItem ))
- {
- return true;
- }
- }
-
- return false;
+ return pPool->GetItemCount2( ATTR_ROTATE_VALUE ) > 0;
}
void initRowInfo(const ScDocument* pDoc, RowInfo* pRowInfo, const SCSIZE nMaxRow,
diff --git a/sc/source/filter/xml/xmlexprt.cxx b/sc/source/filter/xml/xmlexprt.cxx
index 914a3b728a7a..828849f4ad7a 100644
--- a/sc/source/filter/xml/xmlexprt.cxx
+++ b/sc/source/filter/xml/xmlexprt.cxx
@@ -5186,29 +5186,24 @@ XMLNumberFormatAttributesExportHelper* ScXMLExport::GetNumberFormatAttributesExp
void ScXMLExport::CollectUserDefinedNamespaces(const SfxItemPool* pPool, sal_uInt16 nAttrib)
{
- sal_uInt32 nItems(pPool->GetItemCount2( nAttrib ));
- for( sal_uInt32 i = 0; i < nItems; ++i )
+ for (const SfxPoolItem* pItem : pPool->GetItemSurrogates(nAttrib))
{
- const SfxPoolItem* pItem;
- if( nullptr != (pItem = pPool->GetItem2( nAttrib, i ) ) )
+ const SvXMLAttrContainerItem *pUnknown(static_cast<const SvXMLAttrContainerItem *>(pItem));
+ if( pUnknown->GetAttrCount() > 0 )
{
- const SvXMLAttrContainerItem *pUnknown(static_cast<const SvXMLAttrContainerItem *>(pItem));
- if( pUnknown->GetAttrCount() > 0 )
+ sal_uInt16 nIdx(pUnknown->GetFirstNamespaceIndex());
+ while( USHRT_MAX != nIdx )
{
- sal_uInt16 nIdx(pUnknown->GetFirstNamespaceIndex());
- while( USHRT_MAX != nIdx )
+ if( (XML_NAMESPACE_UNKNOWN_FLAG & nIdx) != 0 )
{
- if( (XML_NAMESPACE_UNKNOWN_FLAG & nIdx) != 0 )
- {
- const OUString& rPrefix = pUnknown->GetPrefix( nIdx );
- // Add namespace declaration for unknown attributes if
- // there aren't existing ones for the prefix used by the
- // attributes
- GetNamespaceMap_().Add( rPrefix,
- pUnknown->GetNamespace( nIdx ) );
- }
- nIdx = pUnknown->GetNextNamespaceIndex( nIdx );
+ const OUString& rPrefix = pUnknown->GetPrefix( nIdx );
+ // Add namespace declaration for unknown attributes if
+ // there aren't existing ones for the prefix used by the
+ // attributes
+ GetNamespaceMap_().Add( rPrefix,
+ pUnknown->GetNamespace( nIdx ) );
}
+ nIdx = pUnknown->GetNextNamespaceIndex( nIdx );
}
}
}
diff --git a/sc/source/filter/xml/xmlfonte.cxx b/sc/source/filter/xml/xmlfonte.cxx
index d06a03d14aee..773848bfdf47 100644
--- a/sc/source/filter/xml/xmlfonte.cxx
+++ b/sc/source/filter/xml/xmlfonte.cxx
@@ -47,26 +47,21 @@ void ScXMLFontAutoStylePool_Impl::AddFontItems(const sal_uInt16* pWhichIds, sal_
{
for( sal_uInt16 i=0; i < nIdCount; ++i )
{
- const SfxPoolItem* pItem;
sal_uInt16 nWhichId(pWhichIds[i]);
if (bExportDefaults)
{
- pItem = &pItemPool->GetDefaultItem(nWhichId);
+ const SfxPoolItem* pItem = &pItemPool->GetDefaultItem(nWhichId);
const SvxFontItem *pFont(static_cast<const SvxFontItem *>(pItem));
Add( pFont->GetFamilyName(), pFont->GetStyleName(),
pFont->GetFamily(), pFont->GetPitch(),
pFont->GetCharSet() );
}
- sal_uInt32 nItems(pItemPool->GetItemCount2( nWhichId ));
- for( sal_uInt32 j = 0; j < nItems; ++j )
+ for (const SfxPoolItem* pItem : pItemPool->GetItemSurrogates( nWhichId ))
{
- if( nullptr != (pItem = pItemPool->GetItem2( nWhichId, j ) ) )
- {
- const SvxFontItem *pFont(static_cast<const SvxFontItem *>(pItem));
- Add( pFont->GetFamilyName(), pFont->GetStyleName(),
- pFont->GetFamily(), pFont->GetPitch(),
- pFont->GetCharSet() );
- }
+ const SvxFontItem *pFont(static_cast<const SvxFontItem *>(pItem));
+ Add( pFont->GetFamilyName(), pFont->GetStyleName(),
+ pFont->GetFamily(), pFont->GetPitch(),
+ pFont->GetCharSet() );
}
}
}
@@ -111,30 +106,26 @@ ScXMLFontAutoStylePool_Impl::ScXMLFontAutoStylePool_Impl(ScXMLExport& rExportP,
for (sal_uInt16 nPageWhichId : aPageWhichIds)
{
- sal_uInt32 nPageHFItems(rPagePool.GetItemCount2(nPageWhichId));
- for (sal_uInt32 k = 0; k < nPageHFItems; ++k)
+ for (const SfxPoolItem* pItem : rPagePool.GetItemSurrogates( nPageWhichId ))
{
- const ScPageHFItem* pPageItem;
- if (nullptr != (pPageItem = static_cast<const ScPageHFItem*>(rPagePool.GetItem2(nPageWhichId, k))))
+ const ScPageHFItem* pPageItem = static_cast<const ScPageHFItem*>(pItem);
+ const EditTextObject* pLeftArea(pPageItem->GetLeftArea());
+ if (pLeftArea)
+ {
+ aEditEngine.SetText(*pLeftArea);
+ AddFontItems(aEditWhichIds, 3, mpEditEnginePool, false);
+ }
+ const EditTextObject* pCenterArea(pPageItem->GetCenterArea());
+ if (pCenterArea)
+ {
+ aEditEngine.SetText(*pCenterArea);
+ AddFontItems(aEditWhichIds, 3, mpEditEnginePool, false);
+ }
+ const EditTextObject* pRightArea(pPageItem->GetRightArea());
+ if (pRightArea)
{
- const EditTextObject* pLeftArea(pPageItem->GetLeftArea());
- if (pLeftArea)
- {
- aEditEngine.SetText(*pLeftArea);
- AddFontItems(aEditWhichIds, 3, mpEditEnginePool, false);
- }
- const EditTextObject* pCenterArea(pPageItem->GetCenterArea());
- if (pCenterArea)
- {
- aEditEngine.SetText(*pCenterArea);
- AddFontItems(aEditWhichIds, 3, mpEditEnginePool, false);
- }
- const EditTextObject* pRightArea(pPageItem->GetRightArea());
- if (pRightArea)
- {
- aEditEngine.SetText(*pRightArea);
- AddFontItems(aEditWhichIds, 3, mpEditEnginePool, false);
- }
+ aEditEngine.SetText(*pRightArea);
+ AddFontItems(aEditWhichIds, 3, mpEditEnginePool, false);
}
}
}
diff --git a/sc/source/ui/view/cellsh1.cxx b/sc/source/ui/view/cellsh1.cxx
index a1e19a1fe2d3..23014303a12d 100644
--- a/sc/source/ui/view/cellsh1.cxx
+++ b/sc/source/ui/view/cellsh1.cxx
@@ -1921,17 +1921,12 @@ void ScCellShell::ExecuteEdit( SfxRequest& rReq )
bool bManaged = false;
// Get the pool item stored by Conditional Format Manager Dialog.
- sal_uInt32 nItems(pTabViewShell->GetPool().GetItemCount2( SCITEM_CONDFORMATDLGDATA ));
- for( sal_uInt32 nIter = 0; nIter < nItems; ++nIter )
+ auto itemsRange = pTabViewShell->GetPool().GetItemSurrogates(SCITEM_CONDFORMATDLGDATA);
+ if (itemsRange.begin() != itemsRange.end())
{
- const SfxPoolItem* pItem = pTabViewShell->GetPool().GetItem2( SCITEM_CONDFORMATDLGDATA, nIter );
- if( pItem != nullptr )
- {
- const ScCondFormatDlgItem* pDlgItem = static_cast<const ScCondFormatDlgItem*>(pItem);
- nIndex = pDlgItem->GetIndex();
- bManaged = true;
- break;
- }
+ const ScCondFormatDlgItem* pDlgItem = static_cast<const ScCondFormatDlgItem*>(*itemsRange.begin());
+ nIndex = pDlgItem->GetIndex();
+ bManaged = true;
}
// Check if the Conditional Manager Dialog is editing or adding
@@ -2534,17 +2529,12 @@ void ScCellShell::ExecuteEdit( SfxRequest& rReq )
ScConditionalFormatList* pList = nullptr;
- sal_uInt32 nItems(pTabViewShell->GetPool().GetItemCount2( SCITEM_CONDFORMATDLGDATA ));
const ScCondFormatDlgItem* pDlgItem = nullptr;
- for( sal_uInt32 nIter = 0; nIter < nItems; ++nIter )
+ auto itemsRange = pTabViewShell->GetPool().GetItemSurrogates(SCITEM_CONDFORMATDLGDATA);
+ if (itemsRange.begin() != itemsRange.end())
{
- const SfxPoolItem* pItem = pTabViewShell->GetPool().GetItem2( SCITEM_CONDFORMATDLGDATA, nIter );
- if( pItem != nullptr )
- {
- pDlgItem= static_cast<const ScCondFormatDlgItem*>(pItem);
- pList = const_cast<ScCondFormatDlgItem*>(pDlgItem)->GetConditionalFormatList();
- break;
- }
+ pDlgItem= static_cast<const ScCondFormatDlgItem*>(*itemsRange.begin());
+ pList = const_cast<ScCondFormatDlgItem*>(pDlgItem)->GetConditionalFormatList();
}
if (!pList)
diff --git a/sc/source/ui/view/tabvwshc.cxx b/sc/source/ui/view/tabvwshc.cxx
index 18fd810859e1..43b4289a67b5 100644
--- a/sc/source/ui/view/tabvwshc.cxx
+++ b/sc/source/ui/view/tabvwshc.cxx
@@ -187,15 +187,12 @@ VclPtr<SfxModelessDialog> ScTabViewShell::CreateRefDialog(
const ScCondFormatDlgItem* pDlgItem = nullptr;
// Get the pool item stored by Conditional Format Manager Dialog.
const SfxPoolItem* pItem = nullptr;
- sal_uInt32 nItems(GetPool().GetItemCount2( SCITEM_CONDFORMATDLGDATA ));
- for( sal_uInt32 nIter = 0; nIter < nItems; ++nIter )
+ auto itemsRange = GetPool().GetItemSurrogates(SCITEM_CONDFORMATDLGDATA);
+ if (itemsRange.begin() != itemsRange.end())
{
- if( nullptr != (pItem = GetPool().GetItem2( SCITEM_CONDFORMATDLGDATA, nIter ) ) )
- {
- pDlgItem = static_cast<const ScCondFormatDlgItem*>(pItem);
- bFound = true;
- break;
- }
+ pItem = *itemsRange.begin();
+ pDlgItem = static_cast<const ScCondFormatDlgItem*>(pItem);
+ bFound = true;
}
ScViewData& rViewData = GetViewData();