1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
|
/*************************************************************************
*
* OpenOffice.org - a multi-platform office productivity suite
*
* $RCSfile: bparr.hxx,v $
*
* $Revision: 1.4 $
*
* last change: $Author: hr $ $Date: 2006-08-14 15:17:05 $
*
* The Contents of this file are made available subject to
* the terms of GNU Lesser General Public License Version 2.1.
*
*
* GNU Lesser General Public License Version 2.1
* =============================================
* Copyright 2005 by Sun Microsystems, Inc.
* 901 San Antonio Road, Palo Alto, CA 94303, USA
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License version 2.1, as published by the Free Software Foundation.
*
* This library 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 for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston,
* MA 02111-1307 USA
*
************************************************************************/
#ifndef _BPARR_HXX
#define _BPARR_HXX
#ifndef _SOLAR_H
#include <tools/solar.h>
#endif
#ifndef _DEBUG_HXX //autogen
#include <tools/debug.hxx>
#endif
struct BlockInfo;
class BigPtrArray;
class BigPtrEntry
{
friend class BigPtrArray;
BlockInfo* pBlock;
USHORT nOffset;
public:
virtual ~BigPtrEntry() {}
protected:
BigPtrEntry() : pBlock(0), nOffset(0) {}
inline ULONG GetPos() const;
inline BigPtrArray& GetArray() const;
};
typedef BigPtrEntry* ElementPtr;
typedef BOOL (*FnForEach)( const ElementPtr&, void* pArgs );
// 1000 Eintrge 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
ULONG nStart, nEnd; // Start- und EndIndex
USHORT nElem; // Anzahl Elemente
};
class BigPtrArray
{
BlockInfo** ppInf; // Block-Infos
ULONG nSize; // Anzahl Elemente
USHORT nMaxBlock; // akt. max Anzahl Bloecke
USHORT nBlock; // Anzahl Bloecke
USHORT nCur; // letzter Block
USHORT Index2Block( ULONG ) const; // Blocksuche
BlockInfo* InsBlock( USHORT ); // Block einfuegen
void BlockDel( USHORT ); // es wurden Bloecke geloescht
void UpdIndex( USHORT ); // 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
USHORT Compress( short = COMPRESSLVL );
public:
BigPtrArray();
~BigPtrArray();
ULONG Count() const { return nSize; }
void Insert( const ElementPtr& r, ULONG pos );
void Remove( ULONG pos, ULONG n = 1 );
void Move( ULONG from, ULONG to );
void Replace( ULONG pos, const ElementPtr& r);
ElementPtr operator[]( ULONG ) const;
void ForEach( FnForEach fn, void* pArgs = NULL )
{
ForEach( 0, nSize, fn, pArgs );
}
void ForEach( ULONG nStart, ULONG nEnd, FnForEach fn, void* pArgs = NULL );
};
inline 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
|