use std::array in BlockInfo

Change-Id: I28a13592e5993454ae96b0a32ba328013da7856e
Reviewed-on: https://gerrit.libreoffice.org/39296
Tested-by: Jenkins <ci@libreoffice.org>
Reviewed-by: Noel Grandin <noel.grandin@collabora.co.uk>
diff --git a/sw/inc/bparr.hxx b/sw/inc/bparr.hxx
index 4626076..c51e959 100644
--- a/sw/inc/bparr.hxx
+++ b/sw/inc/bparr.hxx
@@ -24,6 +24,7 @@

#include <tools/solar.h>
#include <swdllapi.h>
#include <array>

struct BlockInfo;
class BigPtrArray;
@@ -31,8 +32,8 @@ class BigPtrArray;
class BigPtrEntry
{
    friend class BigPtrArray;
    BlockInfo* m_pBlock;
    sal_uInt16 m_nOffset;
    BlockInfo*  m_pBlock;
    sal_uInt16  m_nOffset;
public:
    BigPtrEntry() : m_pBlock(nullptr), m_nOffset(0) {}
    virtual ~BigPtrEntry() {}
@@ -50,11 +51,16 @@ public:
// if complete compression is desired, 100 has to be specified
#define COMPRESSLVL 80

struct BlockInfo {
    BigPtrArray* pBigArr;           ///< in this array the block is located
    BigPtrEntry** pData;            ///< data block
    sal_uLong nStart, nEnd;         ///< start- and end index
    sal_uInt16 nElem;               ///< number of elements
struct BlockInfo final
{
    BigPtrArray* const
                 pBigArr;              ///< in this array the block is located
    std::array<BigPtrEntry*, MAXENTRY>
                 mvData;               ///< data block
    sal_uLong    nStart, nEnd;         ///< start- and end index
    sal_uInt16   nElem;                ///< number of elements

    BlockInfo(BigPtrArray* b) : pBigArr(b) {}
};

class SW_DLLPUBLIC BigPtrArray
@@ -91,7 +97,7 @@ public:

inline sal_uLong BigPtrEntry::GetPos() const
{
    assert(this == m_pBlock->pData[ m_nOffset ]); // element not in the block
    assert(this == m_pBlock->mvData[ m_nOffset ]); // element not in the block
    return m_pBlock->nStart + m_nOffset;
}

diff --git a/sw/source/core/bastyp/bparr.cxx b/sw/source/core/bastyp/bparr.cxx
index b0d62c7..c5331bc 100644
--- a/sw/source/core/bastyp/bparr.cxx
+++ b/sw/source/core/bastyp/bparr.cxx
@@ -60,8 +60,7 @@ BigPtrArray::~BigPtrArray()
        BlockInfo** pp = m_ppInf;
        for( sal_uInt16 n = 0; n < m_nBlock; ++n, ++pp )
        {
            delete[] (*pp)->pData;
            delete    *pp;
            delete *pp;
        }
    }
    delete[] m_ppInf;
@@ -75,7 +74,7 @@ void BigPtrArray::Move( sal_uLong from, sal_uLong to )
    {
        sal_uInt16 cur = Index2Block( from );
        BlockInfo* p = m_ppInf[ cur ];
        BigPtrEntry* pElem = p->pData[ from - p->nStart ];
        BigPtrEntry* pElem = p->mvData[ from - p->nStart ];
        Insert( pElem, to ); // insert first, then delete!
        Remove( ( to < from ) ? ( from + 1 ) : from );
    }
@@ -86,7 +85,7 @@ BigPtrEntry* BigPtrArray::operator[]( sal_uLong idx ) const
    assert(idx < m_nSize); // operator[]: Index out of bounds
    m_nCur = Index2Block( idx );
    BlockInfo* p = m_ppInf[ m_nCur ];
    return p->pData[ idx - p->nStart ];
    return p->mvData[ idx - p->nStart ];
}

/** Search a block at a given position */
@@ -173,7 +172,7 @@ BlockInfo* BigPtrArray::InsBlock( sal_uInt16 pos )
                 ( m_nBlock - pos ) * sizeof( BlockInfo* ));
    }
    ++m_nBlock;
    BlockInfo* p = new BlockInfo;
    BlockInfo* p = new BlockInfo(this);
    m_ppInf[ pos ] = p;

    if( pos )
@@ -183,8 +182,6 @@ BlockInfo* BigPtrArray::InsBlock( sal_uInt16 pos )

    p->nEnd--;  // no elements
    p->nElem = 0;
    p->pData = new BigPtrEntry* [ MAXENTRY ];
    p->pBigArr = this;
    return p;
}

@@ -240,8 +237,8 @@ void BigPtrArray::Insert( BigPtrEntry* pElem, sal_uLong pos )
            if( q->nElem )
            {
                int nCount = q->nElem;
                BigPtrEntry** pFrom = q->pData + nCount;
                BigPtrEntry** pTo   = pFrom + 1;
                auto pFrom = q->mvData.begin() + nCount;
                auto pTo   = pFrom + 1;
                while( nCount-- )
                    ++( *--pTo = *--pFrom )->m_nOffset;
            }
@@ -266,11 +263,11 @@ void BigPtrArray::Insert( BigPtrEntry* pElem, sal_uLong pos )
        }

        // entry does not fit anymore - clear space
        BigPtrEntry* pLast = p->pData[ MAXENTRY-1 ];
        BigPtrEntry* pLast = p->mvData[ MAXENTRY-1 ];
        pLast->m_nOffset = 0;
        pLast->m_pBlock = q;

        q->pData[ 0 ] = pLast;
        q->mvData[ 0 ] = pLast;
        q->nElem++;
        q->nEnd++;

@@ -283,15 +280,15 @@ void BigPtrArray::Insert( BigPtrEntry* pElem, sal_uLong pos )
    if( pos != p->nElem )
    {
        int nCount = p->nElem - sal_uInt16(pos);
        BigPtrEntry* *pFrom = p->pData + p->nElem;
        BigPtrEntry* *pTo   = pFrom + 1;
        auto pFrom = p->mvData.begin() + p->nElem;
        auto pTo   = pFrom + 1;
        while( nCount-- )
            ++( *--pTo = *--pFrom )->m_nOffset;
    }
    // insert element and update indices
    pElem->m_nOffset = sal_uInt16(pos);
    pElem->m_pBlock = p;
    p->pData[ pos ] = pElem;
    p->mvData[ pos ] = pElem;
    p->nEnd++;
    p->nElem++;
    m_nSize++;
@@ -321,8 +318,8 @@ void BigPtrArray::Remove( sal_uLong pos, sal_uLong n )
        // move elements if needed
        if( ( pos + nel ) < sal_uLong(p->nElem) )
        {
            BigPtrEntry* *pTo = p->pData + pos;
            BigPtrEntry* *pFrom = pTo + nel;
            auto pTo = p->mvData.begin() + pos;
            auto pFrom = pTo + nel;
            int nCount = p->nElem - nel - sal_uInt16(pos);
            while( nCount-- )
            {
@@ -336,7 +333,6 @@ void BigPtrArray::Remove( sal_uLong pos, sal_uLong n )
        // possibly delete block completely
        if( !p->nElem )
        {
            delete[] p->pData;
            nBlkdel++;
            if( USHRT_MAX == nBlk1del )
                nBlk1del = cur;
@@ -393,7 +389,7 @@ void BigPtrArray::Replace( sal_uLong idx, BigPtrEntry* pElem)
    BlockInfo* p = m_ppInf[ m_nCur ];
    pElem->m_nOffset = sal_uInt16(idx - p->nStart);
    pElem->m_pBlock = p;
    p->pData[ idx - p->nStart ] = pElem;
    p->mvData[ idx - p->nStart ] = pElem;
}

/** Compress the array */
@@ -434,8 +430,8 @@ sal_uInt16 BigPtrArray::Compress()
                n = nLast;

            // move elements from current to last block
            BigPtrEntry** pElem = pLast->pData + pLast->nElem;
            BigPtrEntry** pFrom = p->pData;
            auto pElem = pLast->mvData.begin() + pLast->nElem;
            auto pFrom = p->mvData.begin();
            for( sal_uInt16 nCount = n, nOff = pLast->nElem;
                            nCount; --nCount, ++pElem )
            {
@@ -453,14 +449,13 @@ sal_uInt16 BigPtrArray::Compress()
            if( !p->nElem )
            {
                // than remove
                delete[] p->pData;
                delete   p;
                p = nullptr;
                ++nBlkdel;
            }
            else
            {
                pElem = p->pData;
                pElem = p->mvData.begin();
                pFrom = pElem + n;
                int nCount = p->nElem;
                while( nCount-- )
diff --git a/sw/source/core/docnode/nodes.cxx b/sw/source/core/docnode/nodes.cxx
index 123062b..7d50999 100644
--- a/sw/source/core/docnode/nodes.cxx
+++ b/sw/source/core/docnode/nodes.cxx
@@ -2188,7 +2188,7 @@ void SwNodes::ForEach( sal_uLong nStart, sal_uLong nEnd,
        BlockInfo** pp = m_ppInf + cur;
        BlockInfo* p = *pp;
        sal_uInt16 nElem = sal_uInt16( nStart - p->nStart );
        BigPtrEntry** pElem = p->pData + nElem;
        auto pElem = p->mvData.begin() + nElem;
        nElem = p->nElem - nElem;
        for(;;)
        {
@@ -2200,7 +2200,7 @@ void SwNodes::ForEach( sal_uLong nStart, sal_uLong nEnd,
            {
                // new block
                p = *++pp;
                pElem = p->pData;
                pElem = p->mvData.begin();
                nElem = p->nElem;
            }
        }