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