diff options
author | Noel Grandin <noel.grandin@collabora.co.uk> | 2019-04-17 15:19:25 +0200 |
---|---|---|
committer | Noel Grandin <noel.grandin@collabora.co.uk> | 2019-04-20 08:02:25 +0200 |
commit | ec7ba61a6164c805f5a71b077715b7e1521a2d62 (patch) | |
tree | 4d4f3fb1ad960465897754601b0842c78db564bf /sc | |
parent | 7d58f26bf4dbeb4e138c2a91f039d8bc7fa00f0c (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.cxx | 11 | ||||
-rw-r--r-- | sc/source/core/data/documen9.cxx | 22 | ||||
-rw-r--r-- | sc/source/core/data/document.cxx | 29 | ||||
-rw-r--r-- | sc/source/core/data/document10.cxx | 9 | ||||
-rw-r--r-- | sc/source/core/data/fillinfo.cxx | 11 | ||||
-rw-r--r-- | sc/source/filter/xml/xmlexprt.cxx | 31 | ||||
-rw-r--r-- | sc/source/filter/xml/xmlfonte.cxx | 57 | ||||
-rw-r--r-- | sc/source/ui/view/cellsh1.cxx | 28 | ||||
-rw-r--r-- | sc/source/ui/view/tabvwshc.cxx | 13 |
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(); |