diff options
Diffstat (limited to 'sw/inc/bparr.hxx')
-rw-r--r-- | sw/inc/bparr.hxx | 126 |
1 files changed, 126 insertions, 0 deletions
diff --git a/sw/inc/bparr.hxx b/sw/inc/bparr.hxx new file mode 100644 index 000000000000..731dddd2e3fe --- /dev/null +++ b/sw/inc/bparr.hxx @@ -0,0 +1,126 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2000, 2010 Oracle and/or its affiliates. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * <http://www.openoffice.org/license.html> + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + +#ifndef _BPARR_HXX +#define _BPARR_HXX + +#include <tools/solar.h> +#include <tools/debug.hxx> +#include <swdllapi.h> + +struct BlockInfo; +class BigPtrArray; + +class BigPtrEntry +{ + friend class BigPtrArray; + BlockInfo* pBlock; + sal_uInt16 nOffset; +public: + virtual ~BigPtrEntry() {} +protected: + BigPtrEntry() : pBlock(0), nOffset(0) {} + + inline sal_uLong GetPos() const; + inline BigPtrArray& GetArray() const; +}; +typedef BigPtrEntry* ElementPtr; + + +typedef sal_Bool (*FnForEach)( const ElementPtr&, void* pArgs ); + +// 1000 Eintr„ge pro Block = etwas weniger als 4K +#define MAXENTRY 1000 + + +// Anzahl Eintraege, die bei der Kompression frei bleiben duerfen +// dieser Wert ist fuer den Worst Case, da wir MAXBLOCK mit ca 25% +// Overhead definiert haben, reichen 80% = 800 Eintraege vollkommen aus +// Will mann voellige Kompression haben, muss eben 100 angegeben werden. + +#define COMPRESSLVL 80 + +struct BlockInfo { // Block-Info: + BigPtrArray* pBigArr; // in diesem Array steht der Block + ElementPtr* pData; // Datenblock + sal_uLong nStart, nEnd; // Start- und EndIndex + sal_uInt16 nElem; // Anzahl Elemente +}; + +class SW_DLLPUBLIC BigPtrArray +{ + BlockInfo** ppInf; // Block-Infos + sal_uLong nSize; // Anzahl Elemente + sal_uInt16 nMaxBlock; // akt. max Anzahl Bloecke + sal_uInt16 nBlock; // Anzahl Bloecke + sal_uInt16 nCur; // letzter Block + + sal_uInt16 Index2Block( sal_uLong ) const; // Blocksuche + BlockInfo* InsBlock( sal_uInt16 ); // Block einfuegen + void BlockDel( sal_uInt16 ); // es wurden Bloecke geloescht + void UpdIndex( sal_uInt16 ); // Indexe neu berechnen + +protected: + // fuelle alle Bloecke auf. + // Der short gibt in Prozent an, wie voll die Bloecke werden sollen. + // Der ReturnWert besagt, das irgendetwas "getan" wurde + sal_uInt16 Compress( short = COMPRESSLVL ); + +public: + BigPtrArray(); + ~BigPtrArray(); + + sal_uLong Count() const { return nSize; } + + void Insert( const ElementPtr& r, sal_uLong pos ); + void Remove( sal_uLong pos, sal_uLong n = 1 ); + void Move( sal_uLong from, sal_uLong to ); + void Replace( sal_uLong pos, const ElementPtr& r); + + ElementPtr operator[]( sal_uLong ) const; + void ForEach( FnForEach fn, void* pArgs = NULL ) + { + ForEach( 0, nSize, fn, pArgs ); + } + void ForEach( sal_uLong nStart, sal_uLong nEnd, FnForEach fn, void* pArgs = NULL ); +}; + + + +inline sal_uLong BigPtrEntry::GetPos() const +{ + DBG_ASSERT( this == pBlock->pData[ nOffset ], "Element nicht im Block" ); + return pBlock->nStart + nOffset; +} + +inline BigPtrArray& BigPtrEntry::GetArray() const +{ + return *pBlock->pBigArr; +} + + +#endif |