tdf#135683 speedup SwAttrHandler
we only care about the "highest priority" attribute, so we only
need to store a single attribute, not a whole vector worth.
Shaves 5% off the load time for me.
Change-Id: Ib7dc800db47502b33c69df0fe473a82bd8d93af5
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/122773
Tested-by: Jenkins
Reviewed-by: Noel Grandin <noel.grandin@collabora.co.uk>
diff --git a/sw/source/core/text/atrhndl.hxx b/sw/source/core/text/atrhndl.hxx
index 1033242..8a3c438 100644
--- a/sw/source/core/text/atrhndl.hxx
+++ b/sw/source/core/text/atrhndl.hxx
@@ -38,7 +38,7 @@
class SwAttrHandler
{
private:
std::vector<const SwTextAttr*> m_aAttrStack[NUM_ATTRIBUTE_STACKS]; // stack collection
const SwTextAttr* m_aAttrStack[NUM_ATTRIBUTE_STACKS] {}; // stack collection
const SfxPoolItem* m_pDefaultArray[ NUM_DEFAULT_VALUES ];
const IDocumentSettingAccess* m_pIDocumentSettingAccess;
const SwViewShell* m_pShell;
diff --git a/sw/source/core/text/atrstck.cxx b/sw/source/core/text/atrstck.cxx
index 4cc7b50..794390a 100644
--- a/sw/source/core/text/atrstck.cxx
+++ b/sw/source/core/text/atrstck.cxx
@@ -335,7 +335,7 @@
void SwAttrHandler::Reset( )
{
for (auto& i : m_aAttrStack)
i.clear();
i = nullptr;
}
void SwAttrHandler::PushAndChg( const SwTextAttr& rAttr, SwFont& rFnt )
@@ -384,7 +384,7 @@
const SwTextAttr* SwAttrHandler::GetTop(sal_uInt16 nStack)
{
return m_aAttrStack[nStack].empty() ? nullptr : m_aAttrStack[nStack].back();
return m_aAttrStack[nStack];
}
bool SwAttrHandler::Push( const SwTextAttr& rAttr, const SfxPoolItem& rItem )
@@ -406,21 +406,20 @@
|| ( !pTopAttr->IsPriorityAttr()
&& !lcl_ChgHyperLinkColor(*pTopAttr, rItem, m_pShell, nullptr)))
{
m_aAttrStack[nStack].push_back(&rAttr);
m_aAttrStack[nStack] = &rAttr;
return true;
}
const auto it = m_aAttrStack[nStack].end() - 1;
m_aAttrStack[nStack].insert(it, &rAttr);
if (!pTopAttr)
m_aAttrStack[nStack] = &rAttr;
return false;
}
void SwAttrHandler::RemoveFromStack(sal_uInt16 nWhich, const SwTextAttr& rAttr)
{
auto& rStack = m_aAttrStack[StackPos[nWhich]];
const auto it = std::find(rStack.begin(), rStack.end(), &rAttr);
if (it != rStack.end())
rStack.erase(it);
if (rStack == &rAttr)
rStack = nullptr;
}
void SwAttrHandler::PopAndChg( const SwTextAttr& rAttr, SwFont& rFnt )
@@ -740,7 +739,7 @@
// 2. top of two line stack ( or default attribute )is an
// deactivated two line attribute
const bool bRuby =
0 != m_aAttrStack[ StackPos[ RES_TXTATR_CJK_RUBY ] ].size();
nullptr != m_aAttrStack[ StackPos[ RES_TXTATR_CJK_RUBY ] ];
if ( bRuby )
break;
@@ -764,8 +763,7 @@
}
case RES_CHRATR_TWO_LINES :
{
bool bRuby = 0 !=
m_aAttrStack[ StackPos[ RES_TXTATR_CJK_RUBY ] ].size();
bool bRuby = nullptr != m_aAttrStack[ StackPos[ RES_TXTATR_CJK_RUBY ] ];
// two line is activated, if
// 1. no ruby attribute is set and