Kaydet (Commit) b06657fc authored tarafından Noel Grandin's avatar Noel Grandin

use std::array in BlockInfo

Change-Id: I28a13592e5993454ae96b0a32ba328013da7856e
Reviewed-on: https://gerrit.libreoffice.org/39296Tested-by: 's avatarJenkins <ci@libreoffice.org>
Reviewed-by: 's avatarNoel Grandin <noel.grandin@collabora.co.uk>
üst 2c355e3a
......@@ -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;
}
......
......@@ -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-- )
......
......@@ -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;
}
}
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment