diff options
author | Noel Grandin <noel.grandin@collabora.co.uk> | 2017-06-27 13:42:01 +0200 |
---|---|---|
committer | Noel Grandin <noel.grandin@collabora.co.uk> | 2017-06-27 14:34:36 +0200 |
commit | b06657fca57b02ffb267a168bc9323780aeafbef (patch) | |
tree | df0a90322c17d3f92065bd22efec8d4ae36579c3 /sw | |
parent | 2c355e3a76b7a167a61200ab749b2d88d5fbe3a7 (diff) |
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>
Diffstat (limited to 'sw')
-rw-r--r-- | sw/inc/bparr.hxx | 22 | ||||
-rw-r--r-- | sw/source/core/bastyp/bparr.cxx | 39 | ||||
-rw-r--r-- | sw/source/core/docnode/nodes.cxx | 4 |
3 files changed, 33 insertions, 32 deletions
diff --git a/sw/inc/bparr.hxx b/sw/inc/bparr.hxx index 46260762b9d4..c51e959ada1d 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 b0d62c7a6e9c..c5331bcf11d6 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 123062b86c1c..7d509998ba63 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; } } |