88e78230de
so that it is more likely that the interesting data is next to each other and thus in CPU cache (i.e. the control fields and the first few elements of the array) Change-Id: I50e46df3f639899e39f1b7733cf8e754d2435b4d Reviewed-on: https://gerrit.libreoffice.org/c/core/+/124038 Tested-by: Jenkins Reviewed-by: Noel Grandin <noel.grandin@collabora.co.uk>
112 lines
3.5 KiB
C++
112 lines
3.5 KiB
C++
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
|
|
/*
|
|
* This file is part of the LibreOffice project.
|
|
*
|
|
* This Source Code Form is subject to the terms of the Mozilla Public
|
|
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
|
*
|
|
* This file incorporates work covered by the following license notice:
|
|
*
|
|
* Licensed to the Apache Software Foundation (ASF) under one or more
|
|
* contributor license agreements. See the NOTICE file distributed
|
|
* with this work for additional information regarding copyright
|
|
* ownership. The ASF licenses this file to you under the Apache
|
|
* License, Version 2.0 (the "License"); you may not use this file
|
|
* except in compliance with the License. You may obtain a copy of
|
|
* the License at http://www.apache.org/licenses/LICENSE-2.0 .
|
|
*/
|
|
|
|
#ifndef INCLUDED_SW_INC_BPARR_HXX
|
|
#define INCLUDED_SW_INC_BPARR_HXX
|
|
|
|
#include <assert.h>
|
|
|
|
#include <tools/solar.h>
|
|
#include "swdllapi.h"
|
|
#include <array>
|
|
#include <memory>
|
|
|
|
struct BlockInfo;
|
|
class BigPtrArray;
|
|
|
|
class BigPtrEntry
|
|
{
|
|
friend class BigPtrArray;
|
|
BlockInfo* m_pBlock;
|
|
sal_uInt16 m_nOffset;
|
|
public:
|
|
BigPtrEntry() : m_pBlock(nullptr), m_nOffset(0) {}
|
|
BigPtrEntry(BigPtrEntry const &) = default;
|
|
virtual ~BigPtrEntry() = default;
|
|
BigPtrEntry & operator =(BigPtrEntry const &) = default;
|
|
|
|
inline sal_Int32 GetPos() const;
|
|
inline BigPtrArray& GetArray() const;
|
|
};
|
|
|
|
// 1000 entries per Block = a bit less than 4K
|
|
#define MAXENTRY 1000
|
|
|
|
// number of entries that may remain free during compression
|
|
// this value is for the worst case; because we defined MAXBLOCK with ca 25%
|
|
// overhead, 80% = 800 entries are enough
|
|
// if complete compression is desired, 100 has to be specified
|
|
#define COMPRESSLVL 80
|
|
|
|
struct BlockInfo final
|
|
{
|
|
BigPtrArray* pBigArr; ///< in this array the block is located
|
|
sal_Int32 nStart, nEnd; ///< start- and end index
|
|
sal_uInt16 nElem; ///< number of elements
|
|
std::array<BigPtrEntry*, MAXENTRY>
|
|
mvData; ///< data block
|
|
};
|
|
|
|
class SW_DLLPUBLIC BigPtrArray
|
|
{
|
|
protected:
|
|
std::unique_ptr<BlockInfo*[]>
|
|
m_ppInf; ///< block info
|
|
sal_Int32 m_nSize; ///< number of elements
|
|
sal_uInt16 m_nMaxBlock; ///< current max. number of blocks
|
|
sal_uInt16 m_nBlock; ///< number of blocks
|
|
mutable
|
|
sal_uInt16 m_nCur; ///< last used block
|
|
|
|
sal_uInt16 Index2Block( sal_Int32 ) const; ///< block search
|
|
BlockInfo* InsBlock( sal_uInt16 ); ///< insert block
|
|
void BlockDel( sal_uInt16 ); ///< some blocks were deleted
|
|
void UpdIndex( sal_uInt16 ); ///< recalculate indices
|
|
|
|
// fill all blocks
|
|
sal_uInt16 Compress();
|
|
|
|
public:
|
|
BigPtrArray();
|
|
~BigPtrArray();
|
|
|
|
sal_Int32 Count() const { return m_nSize; }
|
|
|
|
void Insert( BigPtrEntry* p, sal_Int32 pos );
|
|
void Remove( sal_Int32 pos, sal_Int32 n = 1 );
|
|
void Move( sal_Int32 from, sal_Int32 to );
|
|
void Replace( sal_Int32 pos, BigPtrEntry* p);
|
|
|
|
BigPtrEntry* operator[]( sal_Int32 ) const;
|
|
};
|
|
|
|
inline sal_Int32 BigPtrEntry::GetPos() const
|
|
{
|
|
assert(this == m_pBlock->mvData[ m_nOffset ]); // element not in the block
|
|
return m_pBlock->nStart + m_nOffset;
|
|
}
|
|
|
|
inline BigPtrArray& BigPtrEntry::GetArray() const
|
|
{
|
|
return *m_pBlock->pBigArr;
|
|
}
|
|
|
|
#endif
|
|
|
|
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|