xref: /aoo4110/main/tools/source/memtools/contnr.cxx (revision b1cdbd2c)
1*b1cdbd2cSJim Jagielski /**************************************************************
2*b1cdbd2cSJim Jagielski  *
3*b1cdbd2cSJim Jagielski  * Licensed to the Apache Software Foundation (ASF) under one
4*b1cdbd2cSJim Jagielski  * or more contributor license agreements.  See the NOTICE file
5*b1cdbd2cSJim Jagielski  * distributed with this work for additional information
6*b1cdbd2cSJim Jagielski  * regarding copyright ownership.  The ASF licenses this file
7*b1cdbd2cSJim Jagielski  * to you under the Apache License, Version 2.0 (the
8*b1cdbd2cSJim Jagielski  * "License"); you may not use this file except in compliance
9*b1cdbd2cSJim Jagielski  * with the License.  You may obtain a copy of the License at
10*b1cdbd2cSJim Jagielski  *
11*b1cdbd2cSJim Jagielski  *   http://www.apache.org/licenses/LICENSE-2.0
12*b1cdbd2cSJim Jagielski  *
13*b1cdbd2cSJim Jagielski  * Unless required by applicable law or agreed to in writing,
14*b1cdbd2cSJim Jagielski  * software distributed under the License is distributed on an
15*b1cdbd2cSJim Jagielski  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16*b1cdbd2cSJim Jagielski  * KIND, either express or implied.  See the License for the
17*b1cdbd2cSJim Jagielski  * specific language governing permissions and limitations
18*b1cdbd2cSJim Jagielski  * under the License.
19*b1cdbd2cSJim Jagielski  *
20*b1cdbd2cSJim Jagielski  *************************************************************/
21*b1cdbd2cSJim Jagielski 
22*b1cdbd2cSJim Jagielski 
23*b1cdbd2cSJim Jagielski 
24*b1cdbd2cSJim Jagielski // MARKER(update_precomp.py): autogen include statement, do not remove
25*b1cdbd2cSJim Jagielski #include "precompiled_tools.hxx"
26*b1cdbd2cSJim Jagielski 
27*b1cdbd2cSJim Jagielski #ifndef _LIMITS_H
28*b1cdbd2cSJim Jagielski #include <limits.h>
29*b1cdbd2cSJim Jagielski #endif
30*b1cdbd2cSJim Jagielski 
31*b1cdbd2cSJim Jagielski #ifndef _STRING_H
32*b1cdbd2cSJim Jagielski #include <string.h>
33*b1cdbd2cSJim Jagielski #endif
34*b1cdbd2cSJim Jagielski 
35*b1cdbd2cSJim Jagielski #ifndef _STDIO_H
36*b1cdbd2cSJim Jagielski #include <stdio.h>
37*b1cdbd2cSJim Jagielski #endif
38*b1cdbd2cSJim Jagielski #include <tools/solar.h>
39*b1cdbd2cSJim Jagielski #include <impcont.hxx>
40*b1cdbd2cSJim Jagielski #include <tools/contnr.hxx>
41*b1cdbd2cSJim Jagielski #include <tools/debug.hxx>
42*b1cdbd2cSJim Jagielski 
43*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
44*b1cdbd2cSJim Jagielski 
45*b1cdbd2cSJim Jagielski DBG_NAME( CBlock )
DBG_NAME(Container) const46*b1cdbd2cSJim Jagielski DBG_NAME( Container )
47*b1cdbd2cSJim Jagielski 
48*b1cdbd2cSJim Jagielski /*************************************************************************
49*b1cdbd2cSJim Jagielski |*
50*b1cdbd2cSJim Jagielski |*	  DbgCheckCBlock()
51*b1cdbd2cSJim Jagielski |*
52*b1cdbd2cSJim Jagielski |*	  Beschreibung		Pruefung eines CBlock fuer Debug-Utilities
53*b1cdbd2cSJim Jagielski |*	  Ersterstellung	MI 30.01.92
54*b1cdbd2cSJim Jagielski |*	  Letzte Aenderung	TH 24.01.96
55*b1cdbd2cSJim Jagielski |*
56*b1cdbd2cSJim Jagielski *************************************************************************/
57*b1cdbd2cSJim Jagielski 
58*b1cdbd2cSJim Jagielski #ifdef DBG_UTIL
59*b1cdbd2cSJim Jagielski const char* CBlock::DbgCheckCBlock( const void* pBlock )
60*b1cdbd2cSJim Jagielski {
61*b1cdbd2cSJim Jagielski 	CBlock* p = (CBlock*)pBlock;
62*b1cdbd2cSJim Jagielski 
63*b1cdbd2cSJim Jagielski 	if ( p->nCount > p->nSize )
64*b1cdbd2cSJim Jagielski 		return "nCount > nSize";
65*b1cdbd2cSJim Jagielski 
66*b1cdbd2cSJim Jagielski 	if ( p->nSize && !p->pNodes )
67*b1cdbd2cSJim Jagielski 		return "nSize > 0 && pNodes == NULL";
68*b1cdbd2cSJim Jagielski 
69*b1cdbd2cSJim Jagielski 	return NULL;
70*b1cdbd2cSJim Jagielski }
71*b1cdbd2cSJim Jagielski #endif
72*b1cdbd2cSJim Jagielski 
73*b1cdbd2cSJim Jagielski /*************************************************************************
74*b1cdbd2cSJim Jagielski |*
75*b1cdbd2cSJim Jagielski |*	  CBlock::CBlock()
76*b1cdbd2cSJim Jagielski |*
77*b1cdbd2cSJim Jagielski |*	  Beschreibung		Construktor des Verwaltungsblocks
78*b1cdbd2cSJim Jagielski |*	  Ersterstellung	TH 17.09.91
79*b1cdbd2cSJim Jagielski |*	  Letzte Aenderung	TH 17.09.91
80*b1cdbd2cSJim Jagielski |*
81*b1cdbd2cSJim Jagielski *************************************************************************/
82*b1cdbd2cSJim Jagielski 
CBlock(sal_uInt16 nInitSize,CBlock * _pPrev,CBlock * _pNext)83*b1cdbd2cSJim Jagielski CBlock::CBlock( sal_uInt16 nInitSize, CBlock* _pPrev, CBlock* _pNext )
84*b1cdbd2cSJim Jagielski {
85*b1cdbd2cSJim Jagielski 	DBG_CTOR( CBlock, DbgCheckCBlock );
86*b1cdbd2cSJim Jagielski 
87*b1cdbd2cSJim Jagielski 	pPrev	= _pPrev;
88*b1cdbd2cSJim Jagielski 	pNext	= _pNext;
89*b1cdbd2cSJim Jagielski 	nSize	= nInitSize;
90*b1cdbd2cSJim Jagielski 	nCount	= 0;
91*b1cdbd2cSJim Jagielski 
92*b1cdbd2cSJim Jagielski 	// Datenpuffer anlegen
93*b1cdbd2cSJim Jagielski 	pNodes = new PVOID[nSize];
94*b1cdbd2cSJim Jagielski }
95*b1cdbd2cSJim Jagielski 
96*b1cdbd2cSJim Jagielski /*************************************************************************
97*b1cdbd2cSJim Jagielski |*
98*b1cdbd2cSJim Jagielski |*	  CBlock::CBlock()
99*b1cdbd2cSJim Jagielski |*
100*b1cdbd2cSJim Jagielski |*	  Beschreibung		Construktor des Verwaltungsblocks
101*b1cdbd2cSJim Jagielski |*	  Ersterstellung	TH 17.09.91
102*b1cdbd2cSJim Jagielski |*	  Letzte Aenderung	TH 17.09.91
103*b1cdbd2cSJim Jagielski |*
104*b1cdbd2cSJim Jagielski *************************************************************************/
105*b1cdbd2cSJim Jagielski 
CBlock(sal_uInt16 _nSize,CBlock * _pPrev)106*b1cdbd2cSJim Jagielski CBlock::CBlock( sal_uInt16 _nSize, CBlock* _pPrev )
107*b1cdbd2cSJim Jagielski {
108*b1cdbd2cSJim Jagielski 	DBG_CTOR( CBlock, DbgCheckCBlock );
109*b1cdbd2cSJim Jagielski 	DBG_ASSERT( _nSize, "CBlock::CBlock(): nSize == 0" );
110*b1cdbd2cSJim Jagielski 
111*b1cdbd2cSJim Jagielski 	pPrev	= _pPrev;
112*b1cdbd2cSJim Jagielski 	pNext	= NULL;
113*b1cdbd2cSJim Jagielski 	nSize	= _nSize;
114*b1cdbd2cSJim Jagielski 	nCount	= _nSize;
115*b1cdbd2cSJim Jagielski 
116*b1cdbd2cSJim Jagielski 	// Datenpuffer anlegen und initialisieren
117*b1cdbd2cSJim Jagielski 	pNodes = new PVOID[nSize];
118*b1cdbd2cSJim Jagielski 	memset( pNodes, 0, nSize*sizeof(PVOID) );
119*b1cdbd2cSJim Jagielski }
120*b1cdbd2cSJim Jagielski 
121*b1cdbd2cSJim Jagielski /*************************************************************************
122*b1cdbd2cSJim Jagielski |*
123*b1cdbd2cSJim Jagielski |*	  CBlock::CBlock()
124*b1cdbd2cSJim Jagielski |*
125*b1cdbd2cSJim Jagielski |*	  Beschreibung		Copy-Construktor des Verwaltungsblocks
126*b1cdbd2cSJim Jagielski |*	  Ersterstellung	TH 17.09.91
127*b1cdbd2cSJim Jagielski |*	  Letzte Aenderung	TH 17.09.91
128*b1cdbd2cSJim Jagielski |*
129*b1cdbd2cSJim Jagielski *************************************************************************/
130*b1cdbd2cSJim Jagielski 
CBlock(const CBlock & r,CBlock * _pPrev)131*b1cdbd2cSJim Jagielski CBlock::CBlock( const CBlock& r, CBlock* _pPrev )
132*b1cdbd2cSJim Jagielski {
133*b1cdbd2cSJim Jagielski 	DBG_CTOR( CBlock, DbgCheckCBlock );
134*b1cdbd2cSJim Jagielski 	DBG_CHKOBJ( &r, CBlock, DbgCheckCBlock );
135*b1cdbd2cSJim Jagielski 
136*b1cdbd2cSJim Jagielski 	pPrev	= _pPrev;
137*b1cdbd2cSJim Jagielski 	pNext	= NULL;
138*b1cdbd2cSJim Jagielski 	nSize	= r.nSize;
139*b1cdbd2cSJim Jagielski 	nCount	= r.nCount;
140*b1cdbd2cSJim Jagielski 
141*b1cdbd2cSJim Jagielski 	// Datenpuffer anlegen und Daten kopieren
142*b1cdbd2cSJim Jagielski 	pNodes = new PVOID[nSize];
143*b1cdbd2cSJim Jagielski 	memcpy( pNodes, r.pNodes, nCount*sizeof(PVOID) );
144*b1cdbd2cSJim Jagielski }
145*b1cdbd2cSJim Jagielski 
146*b1cdbd2cSJim Jagielski /*************************************************************************
147*b1cdbd2cSJim Jagielski |*
148*b1cdbd2cSJim Jagielski |*	  CBlock::~CBlock()
149*b1cdbd2cSJim Jagielski |*
150*b1cdbd2cSJim Jagielski |*	  Beschreibung		Destruktor des Verwaltungsblocks
151*b1cdbd2cSJim Jagielski |*	  Ersterstellung	TH 17.09.91
152*b1cdbd2cSJim Jagielski |*	  Letzte Aenderung	TH 17.09.91
153*b1cdbd2cSJim Jagielski |*
154*b1cdbd2cSJim Jagielski *************************************************************************/
155*b1cdbd2cSJim Jagielski 
~CBlock()156*b1cdbd2cSJim Jagielski inline CBlock::~CBlock()
157*b1cdbd2cSJim Jagielski {
158*b1cdbd2cSJim Jagielski 	DBG_DTOR( CBlock, DbgCheckCBlock );
159*b1cdbd2cSJim Jagielski 
160*b1cdbd2cSJim Jagielski 	// Daten loeschen
161*b1cdbd2cSJim Jagielski 	delete[] pNodes;
162*b1cdbd2cSJim Jagielski }
163*b1cdbd2cSJim Jagielski 
164*b1cdbd2cSJim Jagielski /*************************************************************************
165*b1cdbd2cSJim Jagielski |*
166*b1cdbd2cSJim Jagielski |*	  CBlock::Insert()
167*b1cdbd2cSJim Jagielski |*
168*b1cdbd2cSJim Jagielski |*	  Beschreibung		Fuegt einen Pointer ein
169*b1cdbd2cSJim Jagielski |*	  Ersterstellung	TH 17.09.91
170*b1cdbd2cSJim Jagielski |*	  Letzte Aenderung	TH 17.09.91
171*b1cdbd2cSJim Jagielski |*
172*b1cdbd2cSJim Jagielski *************************************************************************/
173*b1cdbd2cSJim Jagielski 
Insert(void * p,sal_uInt16 nIndex,sal_uInt16 nReSize)174*b1cdbd2cSJim Jagielski void CBlock::Insert( void* p, sal_uInt16 nIndex, sal_uInt16 nReSize )
175*b1cdbd2cSJim Jagielski {
176*b1cdbd2cSJim Jagielski 	DBG_CHKTHIS( CBlock, DbgCheckCBlock );
177*b1cdbd2cSJim Jagielski 	DBG_ASSERT( nIndex <= nCount, "CBlock::Insert(): Index > nCount" );
178*b1cdbd2cSJim Jagielski 
179*b1cdbd2cSJim Jagielski 	// Muss Block realokiert werden
180*b1cdbd2cSJim Jagielski 	if ( nCount == nSize )
181*b1cdbd2cSJim Jagielski 	{
182*b1cdbd2cSJim Jagielski 		// Neue Daten anlegen
183*b1cdbd2cSJim Jagielski         nSize = nSize + nReSize;    // MSVC warns here if += is used
184*b1cdbd2cSJim Jagielski 		void** pNewNodes = new PVOID[nSize];
185*b1cdbd2cSJim Jagielski 
186*b1cdbd2cSJim Jagielski 		// Wird angehaengt
187*b1cdbd2cSJim Jagielski 		if ( nCount == nIndex )
188*b1cdbd2cSJim Jagielski 		{
189*b1cdbd2cSJim Jagielski 			// Daten kopieren
190*b1cdbd2cSJim Jagielski 			memcpy( pNewNodes, pNodes, nCount*sizeof(PVOID) );
191*b1cdbd2cSJim Jagielski 		}
192*b1cdbd2cSJim Jagielski 		else
193*b1cdbd2cSJim Jagielski 		{
194*b1cdbd2cSJim Jagielski 			// Daten kopieren
195*b1cdbd2cSJim Jagielski 			memcpy( pNewNodes, pNodes, nIndex*sizeof(PVOID) );
196*b1cdbd2cSJim Jagielski 			memcpy( pNewNodes + nIndex + 1,
197*b1cdbd2cSJim Jagielski 					pNodes + nIndex,
198*b1cdbd2cSJim Jagielski 					(nCount-nIndex)*sizeof(PVOID) );
199*b1cdbd2cSJim Jagielski 		}
200*b1cdbd2cSJim Jagielski 
201*b1cdbd2cSJim Jagielski 		// Alte Daten loeschen und neue setzen
202*b1cdbd2cSJim Jagielski 		delete[] pNodes;
203*b1cdbd2cSJim Jagielski 		pNodes = pNewNodes;
204*b1cdbd2cSJim Jagielski 	}
205*b1cdbd2cSJim Jagielski 	else
206*b1cdbd2cSJim Jagielski 	{
207*b1cdbd2cSJim Jagielski 		if ( nIndex < nCount )
208*b1cdbd2cSJim Jagielski 		{
209*b1cdbd2cSJim Jagielski 			memmove( pNodes + nIndex + 1,
210*b1cdbd2cSJim Jagielski 					 pNodes + nIndex,
211*b1cdbd2cSJim Jagielski 					 (nCount-nIndex)*sizeof(PVOID) );
212*b1cdbd2cSJim Jagielski 		}
213*b1cdbd2cSJim Jagielski 	}
214*b1cdbd2cSJim Jagielski 
215*b1cdbd2cSJim Jagielski 	// Neuen Pointer setzen und Elementgroesse erhoehen
216*b1cdbd2cSJim Jagielski 	pNodes[nIndex] = p;
217*b1cdbd2cSJim Jagielski 	nCount++;
218*b1cdbd2cSJim Jagielski }
219*b1cdbd2cSJim Jagielski 
220*b1cdbd2cSJim Jagielski /*************************************************************************
221*b1cdbd2cSJim Jagielski |*
222*b1cdbd2cSJim Jagielski |*	  CBlock::Split()
223*b1cdbd2cSJim Jagielski |*
224*b1cdbd2cSJim Jagielski |*	  Beschreibung		Fuegt einen Pointer ein und splittet den Block
225*b1cdbd2cSJim Jagielski |*	  Ersterstellung	TH 17.09.91
226*b1cdbd2cSJim Jagielski |*	  Letzte Aenderung	TH 17.09.91
227*b1cdbd2cSJim Jagielski |*
228*b1cdbd2cSJim Jagielski *************************************************************************/
229*b1cdbd2cSJim Jagielski 
Split(void * p,sal_uInt16 nIndex,sal_uInt16 nReSize)230*b1cdbd2cSJim Jagielski CBlock* CBlock::Split( void* p, sal_uInt16 nIndex, sal_uInt16 nReSize )
231*b1cdbd2cSJim Jagielski {
232*b1cdbd2cSJim Jagielski 	DBG_CHKTHIS( CBlock, DbgCheckCBlock );
233*b1cdbd2cSJim Jagielski 
234*b1cdbd2cSJim Jagielski 	sal_uInt16	nNewSize;
235*b1cdbd2cSJim Jagielski 	sal_uInt16	nMiddle;
236*b1cdbd2cSJim Jagielski 	CBlock* pNewBlock;
237*b1cdbd2cSJim Jagielski 
238*b1cdbd2cSJim Jagielski 	nMiddle = nCount/2;
239*b1cdbd2cSJim Jagielski 
240*b1cdbd2cSJim Jagielski 	if ( ( nIndex == nCount ) || ( nIndex == 0 ) )
241*b1cdbd2cSJim Jagielski 		nNewSize = nReSize;
242*b1cdbd2cSJim Jagielski 	else
243*b1cdbd2cSJim Jagielski 	{
244*b1cdbd2cSJim Jagielski 		// Der aktuelle Block wird in der Mitte geteilt
245*b1cdbd2cSJim Jagielski 		nNewSize = (nCount+1) / 2;
246*b1cdbd2cSJim Jagielski 
247*b1cdbd2cSJim Jagielski 		if ( nNewSize < nReSize )
248*b1cdbd2cSJim Jagielski 			nNewSize = nReSize;
249*b1cdbd2cSJim Jagielski 		else
250*b1cdbd2cSJim Jagielski 		{
251*b1cdbd2cSJim Jagielski 			// Neue Groesse muss ein vielfaches von Resize sein
252*b1cdbd2cSJim Jagielski 			if ( nNewSize % nReSize )
253*b1cdbd2cSJim Jagielski 				nNewSize += nReSize - (nNewSize % nReSize);
254*b1cdbd2cSJim Jagielski 			else
255*b1cdbd2cSJim Jagielski                 nNewSize = nNewSize + nReSize;  // MSVC warns here if += is used
256*b1cdbd2cSJim Jagielski 		}
257*b1cdbd2cSJim Jagielski 	}
258*b1cdbd2cSJim Jagielski 
259*b1cdbd2cSJim Jagielski 	// Vor oder hinter dem aktuellem Block einfuegen?
260*b1cdbd2cSJim Jagielski 	if ( nIndex > nMiddle )
261*b1cdbd2cSJim Jagielski 	{
262*b1cdbd2cSJim Jagielski 		// Neuen Split-Block anlegen und hinter dem aktuellem Block einfuegen
263*b1cdbd2cSJim Jagielski 		pNewBlock = new CBlock( nNewSize, this, pNext );
264*b1cdbd2cSJim Jagielski 
265*b1cdbd2cSJim Jagielski 		if ( pNext )
266*b1cdbd2cSJim Jagielski 			pNext->pPrev = pNewBlock;
267*b1cdbd2cSJim Jagielski 		pNext = pNewBlock;
268*b1cdbd2cSJim Jagielski 
269*b1cdbd2cSJim Jagielski 		if ( nIndex == nCount )
270*b1cdbd2cSJim Jagielski 		{
271*b1cdbd2cSJim Jagielski 			// Neuen Pointer einfuegen
272*b1cdbd2cSJim Jagielski 			pNewBlock->pNodes[0] = p;
273*b1cdbd2cSJim Jagielski 			pNewBlock->nCount = 1;
274*b1cdbd2cSJim Jagielski 		}
275*b1cdbd2cSJim Jagielski 		else
276*b1cdbd2cSJim Jagielski 		{
277*b1cdbd2cSJim Jagielski             nIndex = nIndex - nMiddle;  // MSVC warns here if += is used
278*b1cdbd2cSJim Jagielski 			// Alles von Mitte bis Index kopieren
279*b1cdbd2cSJim Jagielski 			if ( nIndex )
280*b1cdbd2cSJim Jagielski 				memcpy( pNewBlock->pNodes, pNodes+nMiddle, nIndex*sizeof(PVOID) );
281*b1cdbd2cSJim Jagielski 
282*b1cdbd2cSJim Jagielski 			// Neuen Pointer einfuegen
283*b1cdbd2cSJim Jagielski 			pNewBlock->pNodes[nIndex] = p;
284*b1cdbd2cSJim Jagielski 
285*b1cdbd2cSJim Jagielski 			// Alles von Mitte bis Ende hinter Index kopieren
286*b1cdbd2cSJim Jagielski 			memcpy( pNewBlock->pNodes+nIndex+1,
287*b1cdbd2cSJim Jagielski 					pNodes+nMiddle+nIndex,
288*b1cdbd2cSJim Jagielski 					(nCount-nMiddle-nIndex) * sizeof(PVOID) );
289*b1cdbd2cSJim Jagielski 
290*b1cdbd2cSJim Jagielski 			pNewBlock->nCount = (nCount-nMiddle+1);
291*b1cdbd2cSJim Jagielski 			nCount = nMiddle;
292*b1cdbd2cSJim Jagielski 
293*b1cdbd2cSJim Jagielski 			// Den aktuellen Datenbereich auch halbieren
294*b1cdbd2cSJim Jagielski 			if ( nSize != nNewSize )
295*b1cdbd2cSJim Jagielski 			{
296*b1cdbd2cSJim Jagielski 				void** pNewNodes = new PVOID[nNewSize];
297*b1cdbd2cSJim Jagielski 				memcpy( pNewNodes, pNodes, nCount*sizeof(PVOID) );
298*b1cdbd2cSJim Jagielski 				delete[] pNodes;
299*b1cdbd2cSJim Jagielski 				pNodes = pNewNodes;
300*b1cdbd2cSJim Jagielski 				nSize = nNewSize;
301*b1cdbd2cSJim Jagielski 			}
302*b1cdbd2cSJim Jagielski 		}
303*b1cdbd2cSJim Jagielski 	}
304*b1cdbd2cSJim Jagielski 	else
305*b1cdbd2cSJim Jagielski 	{
306*b1cdbd2cSJim Jagielski 		// Neuen Split-Block anlegen und vor dem aktuellem Block einfuegen
307*b1cdbd2cSJim Jagielski 		pNewBlock = new CBlock( nNewSize, pPrev, this );
308*b1cdbd2cSJim Jagielski 
309*b1cdbd2cSJim Jagielski 		if ( pPrev )
310*b1cdbd2cSJim Jagielski 			pPrev->pNext = pNewBlock;
311*b1cdbd2cSJim Jagielski 		pPrev = pNewBlock;
312*b1cdbd2cSJim Jagielski 
313*b1cdbd2cSJim Jagielski 		if ( nIndex == 0 )
314*b1cdbd2cSJim Jagielski 		{
315*b1cdbd2cSJim Jagielski 			// Neuen Pointer einfuegen
316*b1cdbd2cSJim Jagielski 			pNewBlock->pNodes[0] = p;
317*b1cdbd2cSJim Jagielski 			pNewBlock->nCount = 1;
318*b1cdbd2cSJim Jagielski 		}
319*b1cdbd2cSJim Jagielski 		else
320*b1cdbd2cSJim Jagielski 		{
321*b1cdbd2cSJim Jagielski 			// Alles von Anfang bis Index kopieren
322*b1cdbd2cSJim Jagielski 			memcpy( pNewBlock->pNodes, pNodes, nIndex*sizeof(PVOID) );
323*b1cdbd2cSJim Jagielski 
324*b1cdbd2cSJim Jagielski 			// Neuen Pointer einfuegen
325*b1cdbd2cSJim Jagielski 			pNewBlock->pNodes[nIndex] = p;
326*b1cdbd2cSJim Jagielski 
327*b1cdbd2cSJim Jagielski 			// Alles von Index bis Mitte hinter Index kopieren
328*b1cdbd2cSJim Jagielski 			if ( nIndex != nMiddle )
329*b1cdbd2cSJim Jagielski 			{
330*b1cdbd2cSJim Jagielski 				memcpy( pNewBlock->pNodes+nIndex+1,
331*b1cdbd2cSJim Jagielski 						pNodes+nIndex,
332*b1cdbd2cSJim Jagielski 						(nMiddle-nIndex) * sizeof(PVOID) );
333*b1cdbd2cSJim Jagielski 			}
334*b1cdbd2cSJim Jagielski 
335*b1cdbd2cSJim Jagielski 			pNewBlock->nCount = nMiddle+1;
336*b1cdbd2cSJim Jagielski             nCount = nCount - nMiddle;  // MSVC warns here if += is used
337*b1cdbd2cSJim Jagielski 
338*b1cdbd2cSJim Jagielski 			// Die zweite Haelfte in einen neuen Block kopieren
339*b1cdbd2cSJim Jagielski 			if ( nSize != nNewSize )
340*b1cdbd2cSJim Jagielski 			{
341*b1cdbd2cSJim Jagielski 				void** pNewNodes = new PVOID[nNewSize];
342*b1cdbd2cSJim Jagielski 				memcpy( pNewNodes, pNodes+nMiddle, nCount*sizeof(PVOID) );
343*b1cdbd2cSJim Jagielski 				delete[] pNodes;
344*b1cdbd2cSJim Jagielski 				pNodes = pNewNodes;
345*b1cdbd2cSJim Jagielski 				nSize = nNewSize;
346*b1cdbd2cSJim Jagielski 			}
347*b1cdbd2cSJim Jagielski 			else
348*b1cdbd2cSJim Jagielski 				memmove( pNodes, pNodes+nMiddle, nCount*sizeof(PVOID) );
349*b1cdbd2cSJim Jagielski 		}
350*b1cdbd2cSJim Jagielski 	}
351*b1cdbd2cSJim Jagielski 
352*b1cdbd2cSJim Jagielski 	// Neu angelegten Block zurueckgeben, da gegebenfalls die Blockpointer
353*b1cdbd2cSJim Jagielski 	// im Container angepast werden koennen
354*b1cdbd2cSJim Jagielski 	return pNewBlock;
355*b1cdbd2cSJim Jagielski }
356*b1cdbd2cSJim Jagielski 
357*b1cdbd2cSJim Jagielski /*************************************************************************
358*b1cdbd2cSJim Jagielski |*
359*b1cdbd2cSJim Jagielski |*	  CBlock::Remove()
360*b1cdbd2cSJim Jagielski |*
361*b1cdbd2cSJim Jagielski |*	  Beschreibung		Entfernt einen Pointer
362*b1cdbd2cSJim Jagielski |*	  Ersterstellung	TH 17.09.91
363*b1cdbd2cSJim Jagielski |*	  Letzte Aenderung	TH 17.09.91
364*b1cdbd2cSJim Jagielski |*
365*b1cdbd2cSJim Jagielski *************************************************************************/
366*b1cdbd2cSJim Jagielski 
Remove(sal_uInt16 nIndex,sal_uInt16 nReSize)367*b1cdbd2cSJim Jagielski void* CBlock::Remove( sal_uInt16 nIndex, sal_uInt16 nReSize )
368*b1cdbd2cSJim Jagielski {
369*b1cdbd2cSJim Jagielski 	DBG_CHKTHIS( CBlock, DbgCheckCBlock );
370*b1cdbd2cSJim Jagielski 
371*b1cdbd2cSJim Jagielski 	// Alten Pointer sichern
372*b1cdbd2cSJim Jagielski 	void* pOld = pNodes[nIndex];
373*b1cdbd2cSJim Jagielski 
374*b1cdbd2cSJim Jagielski 	// 1 Element weniger
375*b1cdbd2cSJim Jagielski 	nCount--;
376*b1cdbd2cSJim Jagielski 
377*b1cdbd2cSJim Jagielski 	// Block verkleinern (wenn Reallokationsgroesse um 4 unterschritten wird)
378*b1cdbd2cSJim Jagielski 	if ( nCount == (nSize-nReSize-4) )
379*b1cdbd2cSJim Jagielski 	{
380*b1cdbd2cSJim Jagielski 		// Neue Daten anlegen
381*b1cdbd2cSJim Jagielski         nSize = nSize - nReSize;    // MSVC warns here if += is used
382*b1cdbd2cSJim Jagielski 		void** pNewNodes = new PVOID[nSize];
383*b1cdbd2cSJim Jagielski 
384*b1cdbd2cSJim Jagielski 		// Wird letzter Eintrag geloescht
385*b1cdbd2cSJim Jagielski 		if ( nIndex == nCount )
386*b1cdbd2cSJim Jagielski 		{
387*b1cdbd2cSJim Jagielski 			// Daten kopieren
388*b1cdbd2cSJim Jagielski 			memcpy( pNewNodes, pNodes, nCount*sizeof(PVOID) );
389*b1cdbd2cSJim Jagielski 		}
390*b1cdbd2cSJim Jagielski 		else
391*b1cdbd2cSJim Jagielski 		{
392*b1cdbd2cSJim Jagielski 			// Daten kopieren
393*b1cdbd2cSJim Jagielski 			memcpy( pNewNodes, pNodes, nIndex*sizeof(PVOID) );
394*b1cdbd2cSJim Jagielski 			memcpy( pNewNodes + nIndex, pNodes + nIndex+1,
395*b1cdbd2cSJim Jagielski 					(nCount-nIndex)*sizeof(PVOID) );
396*b1cdbd2cSJim Jagielski 		}
397*b1cdbd2cSJim Jagielski 
398*b1cdbd2cSJim Jagielski 		// Alte Daten loeschen und neue setzen
399*b1cdbd2cSJim Jagielski 		delete[] pNodes;
400*b1cdbd2cSJim Jagielski 		pNodes = pNewNodes;
401*b1cdbd2cSJim Jagielski 	}
402*b1cdbd2cSJim Jagielski 	else
403*b1cdbd2cSJim Jagielski 	{
404*b1cdbd2cSJim Jagielski 		// Wenn nicht das letzte Element, dann zusammenschieben
405*b1cdbd2cSJim Jagielski 		if ( nIndex < nCount )
406*b1cdbd2cSJim Jagielski 		{
407*b1cdbd2cSJim Jagielski 			memmove( pNodes + nIndex, pNodes + nIndex + 1,
408*b1cdbd2cSJim Jagielski 					 (nCount-nIndex)*sizeof(PVOID) );
409*b1cdbd2cSJim Jagielski 		}
410*b1cdbd2cSJim Jagielski 	}
411*b1cdbd2cSJim Jagielski 
412*b1cdbd2cSJim Jagielski 	// Alten Pointer zurueckgeben
413*b1cdbd2cSJim Jagielski 	return pOld;
414*b1cdbd2cSJim Jagielski }
415*b1cdbd2cSJim Jagielski 
416*b1cdbd2cSJim Jagielski /*************************************************************************
417*b1cdbd2cSJim Jagielski |*
418*b1cdbd2cSJim Jagielski |*	  CBlock::Replace()
419*b1cdbd2cSJim Jagielski |*
420*b1cdbd2cSJim Jagielski |*	  Beschreibung		Ersetzt einen Pointer
421*b1cdbd2cSJim Jagielski |*	  Ersterstellung	TH 17.09.91
422*b1cdbd2cSJim Jagielski |*	  Letzte Aenderung	TH 17.09.91
423*b1cdbd2cSJim Jagielski |*
424*b1cdbd2cSJim Jagielski *************************************************************************/
425*b1cdbd2cSJim Jagielski 
Replace(void * p,sal_uInt16 nIndex)426*b1cdbd2cSJim Jagielski inline void* CBlock::Replace( void* p, sal_uInt16 nIndex )
427*b1cdbd2cSJim Jagielski {
428*b1cdbd2cSJim Jagielski 	DBG_CHKTHIS( CBlock, DbgCheckCBlock );
429*b1cdbd2cSJim Jagielski 
430*b1cdbd2cSJim Jagielski 	// Alten Pointer sichern, neuen setzen und alten zurueckgeben
431*b1cdbd2cSJim Jagielski 	void* pOld = pNodes[nIndex];
432*b1cdbd2cSJim Jagielski 	pNodes[nIndex] = p;
433*b1cdbd2cSJim Jagielski 	return pOld;
434*b1cdbd2cSJim Jagielski }
435*b1cdbd2cSJim Jagielski 
436*b1cdbd2cSJim Jagielski /*************************************************************************
437*b1cdbd2cSJim Jagielski |*
438*b1cdbd2cSJim Jagielski |*	  CBlock::GetObjectPtr()
439*b1cdbd2cSJim Jagielski |*
440*b1cdbd2cSJim Jagielski |*	  Beschreibung		Gibt einen Pointer auf den Pointer aus dem Block
441*b1cdbd2cSJim Jagielski |*						zurueck
442*b1cdbd2cSJim Jagielski |*	  Ersterstellung	TH 26.01.93
443*b1cdbd2cSJim Jagielski |*	  Letzte Aenderung	TH 26.01.93
444*b1cdbd2cSJim Jagielski |*
445*b1cdbd2cSJim Jagielski *************************************************************************/
446*b1cdbd2cSJim Jagielski 
GetObjectPtr(sal_uInt16 nIndex)447*b1cdbd2cSJim Jagielski inline void** CBlock::GetObjectPtr( sal_uInt16 nIndex )
448*b1cdbd2cSJim Jagielski {
449*b1cdbd2cSJim Jagielski 	DBG_CHKTHIS( CBlock, DbgCheckCBlock );
450*b1cdbd2cSJim Jagielski 
451*b1cdbd2cSJim Jagielski 	return &(pNodes[nIndex]);
452*b1cdbd2cSJim Jagielski }
453*b1cdbd2cSJim Jagielski 
454*b1cdbd2cSJim Jagielski /*************************************************************************
455*b1cdbd2cSJim Jagielski |*
456*b1cdbd2cSJim Jagielski |*	  CBlock::SetSize()
457*b1cdbd2cSJim Jagielski |*
458*b1cdbd2cSJim Jagielski |*	  Beschreibung		Aendert die Groesse des Blocks
459*b1cdbd2cSJim Jagielski |*	  Ersterstellung	TH 17.09.91
460*b1cdbd2cSJim Jagielski |*	  Letzte Aenderung	TH 17.09.91
461*b1cdbd2cSJim Jagielski |*
462*b1cdbd2cSJim Jagielski *************************************************************************/
463*b1cdbd2cSJim Jagielski 
SetSize(sal_uInt16 nNewSize)464*b1cdbd2cSJim Jagielski void CBlock::SetSize( sal_uInt16 nNewSize )
465*b1cdbd2cSJim Jagielski {
466*b1cdbd2cSJim Jagielski 	DBG_CHKTHIS( CBlock, DbgCheckCBlock );
467*b1cdbd2cSJim Jagielski 	DBG_ASSERT( nNewSize, "CBlock::SetSize(): nNewSize == 0" );
468*b1cdbd2cSJim Jagielski 
469*b1cdbd2cSJim Jagielski 	// Unterscheidet sich die Groesse
470*b1cdbd2cSJim Jagielski 	if ( nNewSize != nCount )
471*b1cdbd2cSJim Jagielski 	{
472*b1cdbd2cSJim Jagielski 		// Array erweitern
473*b1cdbd2cSJim Jagielski 		void** pNewNodes = new PVOID[nNewSize];
474*b1cdbd2cSJim Jagielski 
475*b1cdbd2cSJim Jagielski 		// Alte Tabelle in die Neue kopieren
476*b1cdbd2cSJim Jagielski 		if ( nNewSize < nCount )
477*b1cdbd2cSJim Jagielski 			memcpy( pNewNodes, pNodes, nNewSize*sizeof(PVOID) );
478*b1cdbd2cSJim Jagielski 		else
479*b1cdbd2cSJim Jagielski 		{
480*b1cdbd2cSJim Jagielski 			memcpy( pNewNodes, pNodes, nCount*sizeof(PVOID) );
481*b1cdbd2cSJim Jagielski 
482*b1cdbd2cSJim Jagielski 			// Array mit 0 initialisieren
483*b1cdbd2cSJim Jagielski 			memset( pNewNodes+nCount, 0, (nNewSize-nCount)*sizeof(PVOID) );
484*b1cdbd2cSJim Jagielski 		}
485*b1cdbd2cSJim Jagielski 
486*b1cdbd2cSJim Jagielski 		// Altes Array loeschen und neue Werte setzen
487*b1cdbd2cSJim Jagielski 		nSize  = nNewSize;
488*b1cdbd2cSJim Jagielski 		nCount = nSize;
489*b1cdbd2cSJim Jagielski 		delete[] pNodes;
490*b1cdbd2cSJim Jagielski 		pNodes = pNewNodes;
491*b1cdbd2cSJim Jagielski 	}
492*b1cdbd2cSJim Jagielski }
493*b1cdbd2cSJim Jagielski 
494*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------
495*b1cdbd2cSJim Jagielski 
496*b1cdbd2cSJim Jagielski /*************************************************************************
497*b1cdbd2cSJim Jagielski |*
498*b1cdbd2cSJim Jagielski |*	  DbgCheckContainer()
499*b1cdbd2cSJim Jagielski |*
500*b1cdbd2cSJim Jagielski |*	  Beschreibung		Pruefung eines Container fuer Debug-Utilities
501*b1cdbd2cSJim Jagielski |*	  Ersterstellung	MI 30.01.92
502*b1cdbd2cSJim Jagielski |*	  Letzte Aenderung	TH 24.01.96
503*b1cdbd2cSJim Jagielski |*
504*b1cdbd2cSJim Jagielski *************************************************************************/
505*b1cdbd2cSJim Jagielski 
506*b1cdbd2cSJim Jagielski #ifdef DBG_UTIL
DbgCheckContainer(const void * pCont)507*b1cdbd2cSJim Jagielski const char* Container::DbgCheckContainer( const void* pCont )
508*b1cdbd2cSJim Jagielski {
509*b1cdbd2cSJim Jagielski 	Container* p = (Container*)pCont;
510*b1cdbd2cSJim Jagielski 
511*b1cdbd2cSJim Jagielski 	if ( p->nCount && (!p->pFirstBlock || !p->pLastBlock || !p->pCurBlock) )
512*b1cdbd2cSJim Jagielski 		return "nCount > 0 but no CBlocks";
513*b1cdbd2cSJim Jagielski 
514*b1cdbd2cSJim Jagielski 	return NULL;
515*b1cdbd2cSJim Jagielski }
516*b1cdbd2cSJim Jagielski #endif
517*b1cdbd2cSJim Jagielski 
518*b1cdbd2cSJim Jagielski /*************************************************************************
519*b1cdbd2cSJim Jagielski |*
520*b1cdbd2cSJim Jagielski |*	  ImpCopyContainer()
521*b1cdbd2cSJim Jagielski |*
522*b1cdbd2cSJim Jagielski |*	  Beschreibung		Kopiert alle Daten des Containers
523*b1cdbd2cSJim Jagielski |*	  Ersterstellung	TH 24.01.96
524*b1cdbd2cSJim Jagielski |*	  Letzte Aenderung	TH 24.01.96
525*b1cdbd2cSJim Jagielski |*
526*b1cdbd2cSJim Jagielski *************************************************************************/
527*b1cdbd2cSJim Jagielski 
ImpCopyContainer(const Container * pCont2)528*b1cdbd2cSJim Jagielski void Container::ImpCopyContainer( const Container* pCont2 )
529*b1cdbd2cSJim Jagielski {
530*b1cdbd2cSJim Jagielski 	// Werte vom uebergebenen Container uebernehmen
531*b1cdbd2cSJim Jagielski 	nCount	   = pCont2->nCount;
532*b1cdbd2cSJim Jagielski 	nCurIndex  = pCont2->nCurIndex;
533*b1cdbd2cSJim Jagielski 	nInitSize  = pCont2->nInitSize;
534*b1cdbd2cSJim Jagielski 	nReSize    = pCont2->nReSize;
535*b1cdbd2cSJim Jagielski 	nBlockSize = pCont2->nBlockSize;
536*b1cdbd2cSJim Jagielski 
537*b1cdbd2cSJim Jagielski 	// Alle Bloecke kopieren
538*b1cdbd2cSJim Jagielski 	if ( pCont2->nCount )
539*b1cdbd2cSJim Jagielski 	{
540*b1cdbd2cSJim Jagielski 		CBlock* pBlock1;
541*b1cdbd2cSJim Jagielski 		CBlock* pBlock2;
542*b1cdbd2cSJim Jagielski 		CBlock* pTempBlock;
543*b1cdbd2cSJim Jagielski 
544*b1cdbd2cSJim Jagielski 		// Erstmal ersten Block kopieren
545*b1cdbd2cSJim Jagielski 		pBlock2 = pCont2->pFirstBlock;
546*b1cdbd2cSJim Jagielski 		pFirstBlock = new CBlock( *pBlock2, NULL );
547*b1cdbd2cSJim Jagielski 		// Ist erster Block der Current-Block, dann Current-Block setzen
548*b1cdbd2cSJim Jagielski 		if ( pBlock2 == pCont2->pCurBlock )
549*b1cdbd2cSJim Jagielski 			pCurBlock = pFirstBlock;
550*b1cdbd2cSJim Jagielski 		pBlock1 = pFirstBlock;
551*b1cdbd2cSJim Jagielski 		pBlock2 = pBlock2->GetNextBlock();
552*b1cdbd2cSJim Jagielski 		while ( pBlock2 )
553*b1cdbd2cSJim Jagielski 		{
554*b1cdbd2cSJim Jagielski 			// Neuen Block anlegen und aus der uebergebenen Liste kopieren
555*b1cdbd2cSJim Jagielski 			pTempBlock = new CBlock( *pBlock2, pBlock1 );
556*b1cdbd2cSJim Jagielski 			pBlock1->SetNextBlock( pTempBlock );
557*b1cdbd2cSJim Jagielski 			pBlock1 = pTempBlock;
558*b1cdbd2cSJim Jagielski 
559*b1cdbd2cSJim Jagielski 			// Current-Block beruecksichtigen
560*b1cdbd2cSJim Jagielski 			if ( pBlock2 == pCont2->pCurBlock )
561*b1cdbd2cSJim Jagielski 				pCurBlock = pBlock1;
562*b1cdbd2cSJim Jagielski 
563*b1cdbd2cSJim Jagielski 			// Auf naechsten Block weitersetzen
564*b1cdbd2cSJim Jagielski 			pBlock2 = pBlock2->GetNextBlock();
565*b1cdbd2cSJim Jagielski 		}
566*b1cdbd2cSJim Jagielski 
567*b1cdbd2cSJim Jagielski 		// Letzten Block setzen
568*b1cdbd2cSJim Jagielski 		pLastBlock = pBlock1;
569*b1cdbd2cSJim Jagielski 	}
570*b1cdbd2cSJim Jagielski 	else
571*b1cdbd2cSJim Jagielski 	{
572*b1cdbd2cSJim Jagielski 		pFirstBlock = NULL;
573*b1cdbd2cSJim Jagielski 		pLastBlock	= NULL;
574*b1cdbd2cSJim Jagielski 		pCurBlock	= NULL;
575*b1cdbd2cSJim Jagielski 	}
576*b1cdbd2cSJim Jagielski }
577*b1cdbd2cSJim Jagielski 
578*b1cdbd2cSJim Jagielski /*************************************************************************
579*b1cdbd2cSJim Jagielski |*
580*b1cdbd2cSJim Jagielski |*	  Container::Container()
581*b1cdbd2cSJim Jagielski |*
582*b1cdbd2cSJim Jagielski |*	  Beschreibung		CONTNR.SDW
583*b1cdbd2cSJim Jagielski |*	  Ersterstellung	TH 17.09.91
584*b1cdbd2cSJim Jagielski |*	  Letzte Aenderung	TH 17.09.91
585*b1cdbd2cSJim Jagielski |*
586*b1cdbd2cSJim Jagielski *************************************************************************/
587*b1cdbd2cSJim Jagielski 
Container(sal_uInt16 _nBlockSize,sal_uInt16 _nInitSize,sal_uInt16 _nReSize)588*b1cdbd2cSJim Jagielski Container::Container( sal_uInt16 _nBlockSize, sal_uInt16 _nInitSize, sal_uInt16 _nReSize )
589*b1cdbd2cSJim Jagielski {
590*b1cdbd2cSJim Jagielski 	DBG_CTOR( Container, DbgCheckContainer );
591*b1cdbd2cSJim Jagielski 
592*b1cdbd2cSJim Jagielski 	// BlockSize muss mindestens 4 sein und kleiner als 64 KB
593*b1cdbd2cSJim Jagielski 	if ( _nBlockSize < 4 )
594*b1cdbd2cSJim Jagielski 		nBlockSize = 4;
595*b1cdbd2cSJim Jagielski 	else
596*b1cdbd2cSJim Jagielski 	{
597*b1cdbd2cSJim Jagielski 		if ( _nBlockSize < CONTAINER_MAXBLOCKSIZE )
598*b1cdbd2cSJim Jagielski 			nBlockSize = _nBlockSize;
599*b1cdbd2cSJim Jagielski 		else
600*b1cdbd2cSJim Jagielski 			nBlockSize = CONTAINER_MAXBLOCKSIZE;
601*b1cdbd2cSJim Jagielski 	}
602*b1cdbd2cSJim Jagielski 
603*b1cdbd2cSJim Jagielski 	// ReSize muss mindestens 2 sein und kleiner als BlockSize
604*b1cdbd2cSJim Jagielski 	if ( _nReSize >= nBlockSize )
605*b1cdbd2cSJim Jagielski 		nReSize = nBlockSize;
606*b1cdbd2cSJim Jagielski 	else
607*b1cdbd2cSJim Jagielski 	{
608*b1cdbd2cSJim Jagielski 		if ( _nReSize < 2 )
609*b1cdbd2cSJim Jagielski 			nReSize = 2;
610*b1cdbd2cSJim Jagielski 		else
611*b1cdbd2cSJim Jagielski 			nReSize = _nReSize;
612*b1cdbd2cSJim Jagielski 
613*b1cdbd2cSJim Jagielski 		// BlockSize muss ein vielfaches der Resizegroesse sein
614*b1cdbd2cSJim Jagielski 		if ( nBlockSize % nReSize )
615*b1cdbd2cSJim Jagielski 			nBlockSize -= nReSize - (nBlockSize % nReSize);
616*b1cdbd2cSJim Jagielski 	}
617*b1cdbd2cSJim Jagielski 
618*b1cdbd2cSJim Jagielski 	// InitSize muss groesser gleich ReSize sein und kleiner als BlockSize
619*b1cdbd2cSJim Jagielski 	if ( _nInitSize <= nReSize )
620*b1cdbd2cSJim Jagielski 		nInitSize = nReSize;
621*b1cdbd2cSJim Jagielski 	else
622*b1cdbd2cSJim Jagielski 	{
623*b1cdbd2cSJim Jagielski 		if ( _nInitSize >= nBlockSize )
624*b1cdbd2cSJim Jagielski 			nInitSize = nBlockSize;
625*b1cdbd2cSJim Jagielski 		else
626*b1cdbd2cSJim Jagielski 		{
627*b1cdbd2cSJim Jagielski 			nInitSize = _nInitSize;
628*b1cdbd2cSJim Jagielski 
629*b1cdbd2cSJim Jagielski 			// InitSize muss ein vielfaches der Resizegroesse sein
630*b1cdbd2cSJim Jagielski 			if ( nInitSize % nReSize )
631*b1cdbd2cSJim Jagielski 				nInitSize -= nReSize - (nInitSize % nReSize);
632*b1cdbd2cSJim Jagielski 		}
633*b1cdbd2cSJim Jagielski 	}
634*b1cdbd2cSJim Jagielski 
635*b1cdbd2cSJim Jagielski 	// Werte initialisieren
636*b1cdbd2cSJim Jagielski 	pFirstBlock = NULL;
637*b1cdbd2cSJim Jagielski 	pLastBlock	= NULL;
638*b1cdbd2cSJim Jagielski 	pCurBlock	= NULL;
639*b1cdbd2cSJim Jagielski 	nCount		= 0;
640*b1cdbd2cSJim Jagielski 	nCurIndex	= 0;
641*b1cdbd2cSJim Jagielski }
642*b1cdbd2cSJim Jagielski 
643*b1cdbd2cSJim Jagielski /*************************************************************************
644*b1cdbd2cSJim Jagielski |*
645*b1cdbd2cSJim Jagielski |*	  Container::Container()
646*b1cdbd2cSJim Jagielski |*
647*b1cdbd2cSJim Jagielski |*	  Beschreibung		CONTNR.SDW
648*b1cdbd2cSJim Jagielski |*	  Ersterstellung	TH 17.09.91
649*b1cdbd2cSJim Jagielski |*	  Letzte Aenderung	TH 17.09.91
650*b1cdbd2cSJim Jagielski |*
651*b1cdbd2cSJim Jagielski *************************************************************************/
652*b1cdbd2cSJim Jagielski 
Container(sal_uIntPtr nSize)653*b1cdbd2cSJim Jagielski Container::Container( sal_uIntPtr nSize )
654*b1cdbd2cSJim Jagielski {
655*b1cdbd2cSJim Jagielski 	DBG_CTOR( Container, DbgCheckContainer );
656*b1cdbd2cSJim Jagielski 
657*b1cdbd2cSJim Jagielski 	nCount	   = nSize;
658*b1cdbd2cSJim Jagielski 	nCurIndex  = 0;
659*b1cdbd2cSJim Jagielski 	nBlockSize = CONTAINER_MAXBLOCKSIZE;
660*b1cdbd2cSJim Jagielski 	nInitSize  = 1;
661*b1cdbd2cSJim Jagielski 	nReSize    = 1;
662*b1cdbd2cSJim Jagielski 
663*b1cdbd2cSJim Jagielski 	if ( !nSize )
664*b1cdbd2cSJim Jagielski 	{
665*b1cdbd2cSJim Jagielski 		pFirstBlock = NULL;
666*b1cdbd2cSJim Jagielski 		pLastBlock	= NULL;
667*b1cdbd2cSJim Jagielski 		pCurBlock	= NULL;
668*b1cdbd2cSJim Jagielski 	}
669*b1cdbd2cSJim Jagielski 	else
670*b1cdbd2cSJim Jagielski 	{
671*b1cdbd2cSJim Jagielski 		// Muss mehr als ein Block angelegt werden
672*b1cdbd2cSJim Jagielski 		if ( nSize <= nBlockSize )
673*b1cdbd2cSJim Jagielski 		{
674*b1cdbd2cSJim Jagielski 			pFirstBlock = new CBlock( (sal_uInt16)nSize, NULL );
675*b1cdbd2cSJim Jagielski 			pLastBlock = pFirstBlock;
676*b1cdbd2cSJim Jagielski 		}
677*b1cdbd2cSJim Jagielski 		else
678*b1cdbd2cSJim Jagielski 		{
679*b1cdbd2cSJim Jagielski 			CBlock* pBlock1;
680*b1cdbd2cSJim Jagielski 			CBlock* pBlock2;
681*b1cdbd2cSJim Jagielski 
682*b1cdbd2cSJim Jagielski 			pFirstBlock = new CBlock( nBlockSize, NULL );
683*b1cdbd2cSJim Jagielski 			pBlock1 = pFirstBlock;
684*b1cdbd2cSJim Jagielski 			nSize -= nBlockSize;
685*b1cdbd2cSJim Jagielski 
686*b1cdbd2cSJim Jagielski 			// Solange die Blockgroesse ueberschritten wird, neue Bloecke anlegen
687*b1cdbd2cSJim Jagielski 			while ( nSize > nBlockSize )
688*b1cdbd2cSJim Jagielski 			{
689*b1cdbd2cSJim Jagielski 				pBlock2 = new CBlock( nBlockSize, pBlock1 );
690*b1cdbd2cSJim Jagielski 				pBlock1->SetNextBlock( pBlock2 );
691*b1cdbd2cSJim Jagielski 				pBlock1 = pBlock2;
692*b1cdbd2cSJim Jagielski 				nSize -= nBlockSize;
693*b1cdbd2cSJim Jagielski 			}
694*b1cdbd2cSJim Jagielski 
695*b1cdbd2cSJim Jagielski 			pLastBlock = new CBlock( (sal_uInt16)nSize, pBlock1 );
696*b1cdbd2cSJim Jagielski 			pBlock1->SetNextBlock( pLastBlock );
697*b1cdbd2cSJim Jagielski 		}
698*b1cdbd2cSJim Jagielski 
699*b1cdbd2cSJim Jagielski 		pCurBlock  = pFirstBlock;
700*b1cdbd2cSJim Jagielski 	}
701*b1cdbd2cSJim Jagielski }
702*b1cdbd2cSJim Jagielski 
703*b1cdbd2cSJim Jagielski /*************************************************************************
704*b1cdbd2cSJim Jagielski |*
705*b1cdbd2cSJim Jagielski |*	  Container::Container()
706*b1cdbd2cSJim Jagielski |*
707*b1cdbd2cSJim Jagielski |*	  Beschreibung		CONTNR.SDW
708*b1cdbd2cSJim Jagielski |*	  Ersterstellung	TH 17.09.91
709*b1cdbd2cSJim Jagielski |*	  Letzte Aenderung	TH 17.09.91
710*b1cdbd2cSJim Jagielski |*
711*b1cdbd2cSJim Jagielski *************************************************************************/
712*b1cdbd2cSJim Jagielski 
Container(const Container & r)713*b1cdbd2cSJim Jagielski Container::Container( const Container& r )
714*b1cdbd2cSJim Jagielski {
715*b1cdbd2cSJim Jagielski 	DBG_CTOR( Container, DbgCheckContainer );
716*b1cdbd2cSJim Jagielski 
717*b1cdbd2cSJim Jagielski 	// Daten kopieren
718*b1cdbd2cSJim Jagielski 	ImpCopyContainer( &r );
719*b1cdbd2cSJim Jagielski }
720*b1cdbd2cSJim Jagielski 
721*b1cdbd2cSJim Jagielski /*************************************************************************
722*b1cdbd2cSJim Jagielski |*
723*b1cdbd2cSJim Jagielski |*	  Container::~Container()
724*b1cdbd2cSJim Jagielski |*
725*b1cdbd2cSJim Jagielski |*	  Beschreibung		CONTNR.SDW
726*b1cdbd2cSJim Jagielski |*	  Ersterstellung	TH 17.09.91
727*b1cdbd2cSJim Jagielski |*	  Letzte Aenderung	TH 17.09.91
728*b1cdbd2cSJim Jagielski |*
729*b1cdbd2cSJim Jagielski *************************************************************************/
730*b1cdbd2cSJim Jagielski 
~Container()731*b1cdbd2cSJim Jagielski Container::~Container()
732*b1cdbd2cSJim Jagielski {
733*b1cdbd2cSJim Jagielski 	DBG_DTOR( Container, DbgCheckContainer );
734*b1cdbd2cSJim Jagielski 
735*b1cdbd2cSJim Jagielski 	// Alle Bloecke loeschen
736*b1cdbd2cSJim Jagielski 	CBlock* pBlock = pFirstBlock;
737*b1cdbd2cSJim Jagielski 	while ( pBlock )
738*b1cdbd2cSJim Jagielski 	{
739*b1cdbd2cSJim Jagielski 		CBlock* pTemp = pBlock->GetNextBlock();
740*b1cdbd2cSJim Jagielski 		delete pBlock;
741*b1cdbd2cSJim Jagielski 		pBlock = pTemp;
742*b1cdbd2cSJim Jagielski 	}
743*b1cdbd2cSJim Jagielski }
744*b1cdbd2cSJim Jagielski 
745*b1cdbd2cSJim Jagielski /*************************************************************************
746*b1cdbd2cSJim Jagielski |*
747*b1cdbd2cSJim Jagielski |*	  Container::ImpInsert()
748*b1cdbd2cSJim Jagielski |*
749*b1cdbd2cSJim Jagielski |*	  Beschreibung		Interne Methode zum Einfuegen eines Pointers
750*b1cdbd2cSJim Jagielski |*	  Ersterstellung	TH 17.09.91
751*b1cdbd2cSJim Jagielski |*	  Letzte Aenderung	DV 01.07.97
752*b1cdbd2cSJim Jagielski |*
753*b1cdbd2cSJim Jagielski *************************************************************************/
754*b1cdbd2cSJim Jagielski 
ImpInsert(void * p,CBlock * pBlock,sal_uInt16 nIndex)755*b1cdbd2cSJim Jagielski void Container::ImpInsert( void* p, CBlock* pBlock, sal_uInt16 nIndex )
756*b1cdbd2cSJim Jagielski {
757*b1cdbd2cSJim Jagielski 	DBG_CHKTHIS( Container, DbgCheckContainer );
758*b1cdbd2cSJim Jagielski 
759*b1cdbd2cSJim Jagielski 	if ( !nCount )
760*b1cdbd2cSJim Jagielski 	{
761*b1cdbd2cSJim Jagielski 		if ( !pBlock )
762*b1cdbd2cSJim Jagielski 		{
763*b1cdbd2cSJim Jagielski 			pFirstBlock = new CBlock( nInitSize, NULL, NULL );
764*b1cdbd2cSJim Jagielski 			pLastBlock	= pFirstBlock;
765*b1cdbd2cSJim Jagielski 			pCurBlock	= pFirstBlock;
766*b1cdbd2cSJim Jagielski 		}
767*b1cdbd2cSJim Jagielski 		pFirstBlock->Insert( p, nIndex, nReSize );
768*b1cdbd2cSJim Jagielski 	}
769*b1cdbd2cSJim Jagielski 	else
770*b1cdbd2cSJim Jagielski 	{
771*b1cdbd2cSJim Jagielski 		// Ist im Block die maximale Blockgroesse erreicht,
772*b1cdbd2cSJim Jagielski 		// dann neuen Block anlegen
773*b1cdbd2cSJim Jagielski 		if ( pBlock->Count() == nBlockSize )
774*b1cdbd2cSJim Jagielski 		{
775*b1cdbd2cSJim Jagielski 			// Block auftrennen
776*b1cdbd2cSJim Jagielski 			CBlock* pNewBlock = pBlock->Split( p, nIndex, nReSize );
777*b1cdbd2cSJim Jagielski 
778*b1cdbd2cSJim Jagielski 			// Wurde Block dahinter angehaegnt
779*b1cdbd2cSJim Jagielski 			if ( pBlock->pNext == pNewBlock )
780*b1cdbd2cSJim Jagielski 			{
781*b1cdbd2cSJim Jagielski 				// Gegebenenfalls LastBlock anpassen
782*b1cdbd2cSJim Jagielski 				if ( pBlock == pLastBlock )
783*b1cdbd2cSJim Jagielski 					pLastBlock = pNewBlock;
784*b1cdbd2cSJim Jagielski 
785*b1cdbd2cSJim Jagielski 				// Current-Position nachfuehren
786*b1cdbd2cSJim Jagielski 				if ( pBlock == pCurBlock )
787*b1cdbd2cSJim Jagielski 				{
788*b1cdbd2cSJim Jagielski 					if ( pBlock->nCount <= nCurIndex )
789*b1cdbd2cSJim Jagielski 					{
790*b1cdbd2cSJim Jagielski 						if ( nIndex <= nCurIndex )
791*b1cdbd2cSJim Jagielski 							nCurIndex++;
792*b1cdbd2cSJim Jagielski 						pCurBlock  = pNewBlock;
793*b1cdbd2cSJim Jagielski                         nCurIndex = nCurIndex - pBlock->nCount; // MSVC warns here if += is used
794*b1cdbd2cSJim Jagielski 					}
795*b1cdbd2cSJim Jagielski 				}
796*b1cdbd2cSJim Jagielski 			}
797*b1cdbd2cSJim Jagielski 			else
798*b1cdbd2cSJim Jagielski 			{
799*b1cdbd2cSJim Jagielski 				// Gegebenenfalls FirstBlock anpassen
800*b1cdbd2cSJim Jagielski 				if ( pBlock == pFirstBlock )
801*b1cdbd2cSJim Jagielski 					pFirstBlock = pNewBlock;
802*b1cdbd2cSJim Jagielski 
803*b1cdbd2cSJim Jagielski 				// Current-Position nachfuehren
804*b1cdbd2cSJim Jagielski 				if ( pBlock == pCurBlock )
805*b1cdbd2cSJim Jagielski 				{
806*b1cdbd2cSJim Jagielski 					if ( nIndex <= nCurIndex )
807*b1cdbd2cSJim Jagielski 						nCurIndex++;
808*b1cdbd2cSJim Jagielski 					if ( pNewBlock->nCount <= nCurIndex )
809*b1cdbd2cSJim Jagielski                         nCurIndex = nCurIndex - pNewBlock->nCount;  // MSVC warns here if += is used
810*b1cdbd2cSJim Jagielski 					else
811*b1cdbd2cSJim Jagielski 						pCurBlock = pNewBlock;
812*b1cdbd2cSJim Jagielski 				}
813*b1cdbd2cSJim Jagielski 			}
814*b1cdbd2cSJim Jagielski 		}
815*b1cdbd2cSJim Jagielski 		else
816*b1cdbd2cSJim Jagielski 		{
817*b1cdbd2cSJim Jagielski 			// Sonst reicht normales einfuegen in den Block
818*b1cdbd2cSJim Jagielski 			pBlock->Insert( p, nIndex, nReSize );
819*b1cdbd2cSJim Jagielski 
820*b1cdbd2cSJim Jagielski 			// Current-Position nachfuehren
821*b1cdbd2cSJim Jagielski 			if ( (pBlock == pCurBlock) && (nIndex <= nCurIndex) )
822*b1cdbd2cSJim Jagielski 				nCurIndex++;
823*b1cdbd2cSJim Jagielski 		}
824*b1cdbd2cSJim Jagielski 	}
825*b1cdbd2cSJim Jagielski 
826*b1cdbd2cSJim Jagielski 	// Ein neues Item im Container
827*b1cdbd2cSJim Jagielski 	nCount++;
828*b1cdbd2cSJim Jagielski }
829*b1cdbd2cSJim Jagielski 
830*b1cdbd2cSJim Jagielski /*************************************************************************
831*b1cdbd2cSJim Jagielski |*
832*b1cdbd2cSJim Jagielski |*	  Container::Insert()
833*b1cdbd2cSJim Jagielski |*
834*b1cdbd2cSJim Jagielski |*	  Beschreibung		CONTNR.SDW
835*b1cdbd2cSJim Jagielski |*	  Ersterstellung	TH 17.09.91
836*b1cdbd2cSJim Jagielski |*	  Letzte Aenderung	TH 17.09.91
837*b1cdbd2cSJim Jagielski |*
838*b1cdbd2cSJim Jagielski *************************************************************************/
839*b1cdbd2cSJim Jagielski 
Insert(void * p)840*b1cdbd2cSJim Jagielski void Container::Insert( void* p )
841*b1cdbd2cSJim Jagielski {
842*b1cdbd2cSJim Jagielski 	ImpInsert( p, pCurBlock, nCurIndex );
843*b1cdbd2cSJim Jagielski }
844*b1cdbd2cSJim Jagielski 
845*b1cdbd2cSJim Jagielski /*************************************************************************
846*b1cdbd2cSJim Jagielski |*
847*b1cdbd2cSJim Jagielski |*	  Container::Insert()
848*b1cdbd2cSJim Jagielski |*
849*b1cdbd2cSJim Jagielski |*	  Beschreibung		CONTNR.SDW
850*b1cdbd2cSJim Jagielski |*	  Ersterstellung	TH 17.09.91
851*b1cdbd2cSJim Jagielski |*	  Letzte Aenderung	TH 17.09.91
852*b1cdbd2cSJim Jagielski |*
853*b1cdbd2cSJim Jagielski *************************************************************************/
854*b1cdbd2cSJim Jagielski 
Insert(void * p,sal_uIntPtr nIndex)855*b1cdbd2cSJim Jagielski void Container::Insert( void* p, sal_uIntPtr nIndex )
856*b1cdbd2cSJim Jagielski {
857*b1cdbd2cSJim Jagielski 	if ( nCount <= nIndex )
858*b1cdbd2cSJim Jagielski 	{
859*b1cdbd2cSJim Jagielski 		if ( pLastBlock )
860*b1cdbd2cSJim Jagielski 			ImpInsert( p, pLastBlock, pLastBlock->Count() );
861*b1cdbd2cSJim Jagielski 		else
862*b1cdbd2cSJim Jagielski 			ImpInsert( p, NULL, 0 );
863*b1cdbd2cSJim Jagielski 	}
864*b1cdbd2cSJim Jagielski 	else
865*b1cdbd2cSJim Jagielski 	{
866*b1cdbd2cSJim Jagielski 		// Block suchen
867*b1cdbd2cSJim Jagielski 		CBlock* pTemp = pFirstBlock;
868*b1cdbd2cSJim Jagielski 		while ( pTemp->Count() < nIndex )
869*b1cdbd2cSJim Jagielski 		{
870*b1cdbd2cSJim Jagielski 			nIndex -= pTemp->Count();
871*b1cdbd2cSJim Jagielski 			pTemp	= pTemp->GetNextBlock();
872*b1cdbd2cSJim Jagielski 		}
873*b1cdbd2cSJim Jagielski 
874*b1cdbd2cSJim Jagielski 		ImpInsert( p, pTemp, (sal_uInt16)nIndex );
875*b1cdbd2cSJim Jagielski 	}
876*b1cdbd2cSJim Jagielski }
877*b1cdbd2cSJim Jagielski 
878*b1cdbd2cSJim Jagielski /*************************************************************************
879*b1cdbd2cSJim Jagielski |*
880*b1cdbd2cSJim Jagielski |*	  Container::Insert()
881*b1cdbd2cSJim Jagielski |*
882*b1cdbd2cSJim Jagielski |*	  Beschreibung		CONTNR.SDW
883*b1cdbd2cSJim Jagielski |*	  Ersterstellung	TH 17.09.91
884*b1cdbd2cSJim Jagielski |*	  Letzte Aenderung	TH 17.09.91
885*b1cdbd2cSJim Jagielski |*
886*b1cdbd2cSJim Jagielski *************************************************************************/
887*b1cdbd2cSJim Jagielski 
Insert(void * pNew,void * pOld)888*b1cdbd2cSJim Jagielski void Container::Insert( void* pNew, void* pOld )
889*b1cdbd2cSJim Jagielski {
890*b1cdbd2cSJim Jagielski 	sal_uIntPtr nIndex = GetPos( pOld );
891*b1cdbd2cSJim Jagielski 	if ( nIndex != CONTAINER_ENTRY_NOTFOUND )
892*b1cdbd2cSJim Jagielski 		Insert( pNew, nIndex );
893*b1cdbd2cSJim Jagielski }
894*b1cdbd2cSJim Jagielski 
895*b1cdbd2cSJim Jagielski /*************************************************************************
896*b1cdbd2cSJim Jagielski |*
897*b1cdbd2cSJim Jagielski |*	  Container::ImpRemove()
898*b1cdbd2cSJim Jagielski |*
899*b1cdbd2cSJim Jagielski |*	  Beschreibung		Interne Methode zum Entfernen eines Pointers
900*b1cdbd2cSJim Jagielski |*	  Ersterstellung	TH 17.09.91
901*b1cdbd2cSJim Jagielski |*	  Letzte Aenderung	TH 17.09.91
902*b1cdbd2cSJim Jagielski |*
903*b1cdbd2cSJim Jagielski *************************************************************************/
904*b1cdbd2cSJim Jagielski 
ImpRemove(CBlock * pBlock,sal_uInt16 nIndex)905*b1cdbd2cSJim Jagielski void* Container::ImpRemove( CBlock* pBlock, sal_uInt16 nIndex )
906*b1cdbd2cSJim Jagielski {
907*b1cdbd2cSJim Jagielski 	DBG_CHKTHIS( Container, DbgCheckContainer );
908*b1cdbd2cSJim Jagielski 
909*b1cdbd2cSJim Jagielski 	void* pOld;
910*b1cdbd2cSJim Jagielski 
911*b1cdbd2cSJim Jagielski 	// Ist Liste danach leer
912*b1cdbd2cSJim Jagielski 	if ( nCount == 1 )
913*b1cdbd2cSJim Jagielski 	{
914*b1cdbd2cSJim Jagielski 		// Block und CurIndex zuruecksetzen
915*b1cdbd2cSJim Jagielski 		pOld = pBlock->GetObject( nIndex );
916*b1cdbd2cSJim Jagielski 		pBlock->Reset();
917*b1cdbd2cSJim Jagielski 		nCurIndex = 0;
918*b1cdbd2cSJim Jagielski 	}
919*b1cdbd2cSJim Jagielski 	else
920*b1cdbd2cSJim Jagielski 	{
921*b1cdbd2cSJim Jagielski 		// Ist Block nach Remove leer
922*b1cdbd2cSJim Jagielski 		if ( pBlock->Count() == 1 )
923*b1cdbd2cSJim Jagielski 		{
924*b1cdbd2cSJim Jagielski 			// dann Block entfernen und Block-Pointer umsetzen
925*b1cdbd2cSJim Jagielski 			if ( pBlock->GetPrevBlock() )
926*b1cdbd2cSJim Jagielski 				(pBlock->GetPrevBlock())->SetNextBlock( pBlock->GetNextBlock() );
927*b1cdbd2cSJim Jagielski 			else
928*b1cdbd2cSJim Jagielski 				pFirstBlock = pBlock->GetNextBlock();
929*b1cdbd2cSJim Jagielski 
930*b1cdbd2cSJim Jagielski 			if ( pBlock->GetNextBlock() )
931*b1cdbd2cSJim Jagielski 				(pBlock->GetNextBlock())->SetPrevBlock( pBlock->GetPrevBlock() );
932*b1cdbd2cSJim Jagielski 			else
933*b1cdbd2cSJim Jagielski 				pLastBlock = pBlock->GetPrevBlock();
934*b1cdbd2cSJim Jagielski 
935*b1cdbd2cSJim Jagielski 			// Current-Position nachfuehren
936*b1cdbd2cSJim Jagielski 			if ( pBlock == pCurBlock )
937*b1cdbd2cSJim Jagielski 			{
938*b1cdbd2cSJim Jagielski 				if ( pBlock->GetNextBlock() )
939*b1cdbd2cSJim Jagielski 				{
940*b1cdbd2cSJim Jagielski 					pCurBlock = pBlock->GetNextBlock();
941*b1cdbd2cSJim Jagielski 					nCurIndex = 0;
942*b1cdbd2cSJim Jagielski 				}
943*b1cdbd2cSJim Jagielski 				else
944*b1cdbd2cSJim Jagielski 				{
945*b1cdbd2cSJim Jagielski 					pCurBlock = pBlock->GetPrevBlock();
946*b1cdbd2cSJim Jagielski 					nCurIndex = pCurBlock->Count()-1;
947*b1cdbd2cSJim Jagielski 				}
948*b1cdbd2cSJim Jagielski 			}
949*b1cdbd2cSJim Jagielski 
950*b1cdbd2cSJim Jagielski 			pOld = pBlock->GetObject( nIndex );
951*b1cdbd2cSJim Jagielski 			delete pBlock;
952*b1cdbd2cSJim Jagielski 		}
953*b1cdbd2cSJim Jagielski 		else
954*b1cdbd2cSJim Jagielski 		{
955*b1cdbd2cSJim Jagielski 			// Sonst Item aus dem Block entfernen
956*b1cdbd2cSJim Jagielski 			pOld = pBlock->Remove( nIndex, nReSize );
957*b1cdbd2cSJim Jagielski 
958*b1cdbd2cSJim Jagielski 			// Current-Position nachfuehren
959*b1cdbd2cSJim Jagielski 			if ( (pBlock == pCurBlock) &&
960*b1cdbd2cSJim Jagielski 				 ((nIndex < nCurIndex) || ((nCurIndex == pBlock->Count()) && nCurIndex)) )
961*b1cdbd2cSJim Jagielski 				nCurIndex--;
962*b1cdbd2cSJim Jagielski 		}
963*b1cdbd2cSJim Jagielski 	}
964*b1cdbd2cSJim Jagielski 
965*b1cdbd2cSJim Jagielski 	// Jetzt gibt es ein Item weniger
966*b1cdbd2cSJim Jagielski 	nCount--;
967*b1cdbd2cSJim Jagielski 
968*b1cdbd2cSJim Jagielski 	// Und den Pointer zurueckgeben, der entfernt wurde
969*b1cdbd2cSJim Jagielski 	return pOld;
970*b1cdbd2cSJim Jagielski }
971*b1cdbd2cSJim Jagielski 
972*b1cdbd2cSJim Jagielski /*************************************************************************
973*b1cdbd2cSJim Jagielski |*
974*b1cdbd2cSJim Jagielski |*	  Container::Remove()
975*b1cdbd2cSJim Jagielski |*
976*b1cdbd2cSJim Jagielski |*	  Beschreibung		CONTNR.SDW
977*b1cdbd2cSJim Jagielski |*	  Ersterstellung	TH 17.09.91
978*b1cdbd2cSJim Jagielski |*	  Letzte Aenderung	TH 17.09.91
979*b1cdbd2cSJim Jagielski |*
980*b1cdbd2cSJim Jagielski *************************************************************************/
981*b1cdbd2cSJim Jagielski 
Remove()982*b1cdbd2cSJim Jagielski void* Container::Remove()
983*b1cdbd2cSJim Jagielski {
984*b1cdbd2cSJim Jagielski 	// Wenn kein Item vorhanden ist, NULL zurueckgeben
985*b1cdbd2cSJim Jagielski 	if ( !nCount )
986*b1cdbd2cSJim Jagielski 		return NULL;
987*b1cdbd2cSJim Jagielski 	else
988*b1cdbd2cSJim Jagielski 		return ImpRemove( pCurBlock, nCurIndex );
989*b1cdbd2cSJim Jagielski }
990*b1cdbd2cSJim Jagielski 
991*b1cdbd2cSJim Jagielski /*************************************************************************
992*b1cdbd2cSJim Jagielski |*
993*b1cdbd2cSJim Jagielski |*	  Container::Remove()
994*b1cdbd2cSJim Jagielski |*
995*b1cdbd2cSJim Jagielski |*	  Beschreibung		CONTNR.SDW
996*b1cdbd2cSJim Jagielski |*	  Ersterstellung	TH 17.09.91
997*b1cdbd2cSJim Jagielski |*	  Letzte Aenderung	TH 17.09.91
998*b1cdbd2cSJim Jagielski |*
999*b1cdbd2cSJim Jagielski *************************************************************************/
1000*b1cdbd2cSJim Jagielski 
Remove(sal_uIntPtr nIndex)1001*b1cdbd2cSJim Jagielski void* Container::Remove( sal_uIntPtr nIndex )
1002*b1cdbd2cSJim Jagielski {
1003*b1cdbd2cSJim Jagielski 	// Ist Index nicht innerhalb des Containers, dann NULL zurueckgeben
1004*b1cdbd2cSJim Jagielski 	if ( nCount <= nIndex )
1005*b1cdbd2cSJim Jagielski 		return NULL;
1006*b1cdbd2cSJim Jagielski 	else
1007*b1cdbd2cSJim Jagielski 	{
1008*b1cdbd2cSJim Jagielski 		// Block suchen
1009*b1cdbd2cSJim Jagielski 		CBlock* pTemp = pFirstBlock;
1010*b1cdbd2cSJim Jagielski 		while ( pTemp->Count() <= nIndex )
1011*b1cdbd2cSJim Jagielski 		{
1012*b1cdbd2cSJim Jagielski 			nIndex -= pTemp->Count();
1013*b1cdbd2cSJim Jagielski 			pTemp	= pTemp->GetNextBlock();
1014*b1cdbd2cSJim Jagielski 		}
1015*b1cdbd2cSJim Jagielski 
1016*b1cdbd2cSJim Jagielski 		return ImpRemove( pTemp, (sal_uInt16)nIndex );
1017*b1cdbd2cSJim Jagielski 	}
1018*b1cdbd2cSJim Jagielski }
1019*b1cdbd2cSJim Jagielski 
1020*b1cdbd2cSJim Jagielski /*************************************************************************
1021*b1cdbd2cSJim Jagielski |*
1022*b1cdbd2cSJim Jagielski |*	  Container::Replace()
1023*b1cdbd2cSJim Jagielski |*
1024*b1cdbd2cSJim Jagielski |*	  Beschreibung		CONTNR.SDW
1025*b1cdbd2cSJim Jagielski |*	  Ersterstellung	TH 17.09.91
1026*b1cdbd2cSJim Jagielski |*	  Letzte Aenderung	TH 17.09.91
1027*b1cdbd2cSJim Jagielski |*
1028*b1cdbd2cSJim Jagielski *************************************************************************/
1029*b1cdbd2cSJim Jagielski 
Replace(void * p)1030*b1cdbd2cSJim Jagielski void* Container::Replace( void* p )
1031*b1cdbd2cSJim Jagielski {
1032*b1cdbd2cSJim Jagielski 	DBG_CHKTHIS( Container, DbgCheckContainer );
1033*b1cdbd2cSJim Jagielski 
1034*b1cdbd2cSJim Jagielski 	if ( !nCount )
1035*b1cdbd2cSJim Jagielski 		return NULL;
1036*b1cdbd2cSJim Jagielski 	else
1037*b1cdbd2cSJim Jagielski 		return pCurBlock->Replace( p, nCurIndex );
1038*b1cdbd2cSJim Jagielski }
1039*b1cdbd2cSJim Jagielski 
1040*b1cdbd2cSJim Jagielski /*************************************************************************
1041*b1cdbd2cSJim Jagielski |*
1042*b1cdbd2cSJim Jagielski |*	  Container::Replace()
1043*b1cdbd2cSJim Jagielski |*
1044*b1cdbd2cSJim Jagielski |*	  Beschreibung		CONTNR.SDW
1045*b1cdbd2cSJim Jagielski |*	  Ersterstellung	TH 17.09.91
1046*b1cdbd2cSJim Jagielski |*	  Letzte Aenderung	TH 17.09.91
1047*b1cdbd2cSJim Jagielski |*
1048*b1cdbd2cSJim Jagielski *************************************************************************/
1049*b1cdbd2cSJim Jagielski 
Replace(void * p,sal_uIntPtr nIndex)1050*b1cdbd2cSJim Jagielski void* Container::Replace( void* p, sal_uIntPtr nIndex )
1051*b1cdbd2cSJim Jagielski {
1052*b1cdbd2cSJim Jagielski 	DBG_CHKTHIS( Container, DbgCheckContainer );
1053*b1cdbd2cSJim Jagielski 
1054*b1cdbd2cSJim Jagielski 	// Ist Index nicht innerhalb des Containers, dann NULL zurueckgeben
1055*b1cdbd2cSJim Jagielski 	if ( nCount <= nIndex )
1056*b1cdbd2cSJim Jagielski 		return NULL;
1057*b1cdbd2cSJim Jagielski 	else
1058*b1cdbd2cSJim Jagielski 	{
1059*b1cdbd2cSJim Jagielski 		// Block suchen
1060*b1cdbd2cSJim Jagielski 		CBlock* pTemp = pFirstBlock;
1061*b1cdbd2cSJim Jagielski 		while ( pTemp->Count() <= nIndex )
1062*b1cdbd2cSJim Jagielski 		{
1063*b1cdbd2cSJim Jagielski 			nIndex -= pTemp->Count();
1064*b1cdbd2cSJim Jagielski 			pTemp	= pTemp->GetNextBlock();
1065*b1cdbd2cSJim Jagielski 		}
1066*b1cdbd2cSJim Jagielski 
1067*b1cdbd2cSJim Jagielski 		return pTemp->Replace( p, (sal_uInt16)nIndex );
1068*b1cdbd2cSJim Jagielski 	}
1069*b1cdbd2cSJim Jagielski }
1070*b1cdbd2cSJim Jagielski 
1071*b1cdbd2cSJim Jagielski /*************************************************************************
1072*b1cdbd2cSJim Jagielski |*
1073*b1cdbd2cSJim Jagielski |*	  Container::SetSize()
1074*b1cdbd2cSJim Jagielski |*
1075*b1cdbd2cSJim Jagielski |*	  Beschreibung		CONTNR.SDW
1076*b1cdbd2cSJim Jagielski |*	  Ersterstellung	TH 17.09.91
1077*b1cdbd2cSJim Jagielski |*	  Letzte Aenderung	TH 17.09.91
1078*b1cdbd2cSJim Jagielski |*
1079*b1cdbd2cSJim Jagielski *************************************************************************/
1080*b1cdbd2cSJim Jagielski 
SetSize(sal_uIntPtr nNewSize)1081*b1cdbd2cSJim Jagielski void Container::SetSize( sal_uIntPtr nNewSize )
1082*b1cdbd2cSJim Jagielski {
1083*b1cdbd2cSJim Jagielski 	DBG_CHKTHIS( Container, DbgCheckContainer );
1084*b1cdbd2cSJim Jagielski 
1085*b1cdbd2cSJim Jagielski 	if ( nNewSize )
1086*b1cdbd2cSJim Jagielski 	{
1087*b1cdbd2cSJim Jagielski 		// Unterscheiden sich die Groessen
1088*b1cdbd2cSJim Jagielski 		if ( nNewSize != nCount )
1089*b1cdbd2cSJim Jagielski 		{
1090*b1cdbd2cSJim Jagielski 			CBlock* pTemp;
1091*b1cdbd2cSJim Jagielski 			sal_uIntPtr	nTemp;
1092*b1cdbd2cSJim Jagielski 
1093*b1cdbd2cSJim Jagielski 			// Wird verkleinert
1094*b1cdbd2cSJim Jagielski 			if ( nNewSize < nCount )
1095*b1cdbd2cSJim Jagielski 			{
1096*b1cdbd2cSJim Jagielski 				pTemp = pFirstBlock;
1097*b1cdbd2cSJim Jagielski 				nTemp = 0;
1098*b1cdbd2cSJim Jagielski 				while ( (nTemp+pTemp->Count()) < nNewSize )
1099*b1cdbd2cSJim Jagielski 				{
1100*b1cdbd2cSJim Jagielski 					nTemp += pTemp->Count();
1101*b1cdbd2cSJim Jagielski 					pTemp  = pTemp->GetNextBlock();
1102*b1cdbd2cSJim Jagielski 				}
1103*b1cdbd2cSJim Jagielski 
1104*b1cdbd2cSJim Jagielski 				// Alle folgenden Bloecke loeschen
1105*b1cdbd2cSJim Jagielski 				sal_Bool	bLast = sal_False;
1106*b1cdbd2cSJim Jagielski 				CBlock* pDelNext;
1107*b1cdbd2cSJim Jagielski 				CBlock* pDelBlock = pTemp->GetNextBlock();
1108*b1cdbd2cSJim Jagielski 				while ( pDelBlock )
1109*b1cdbd2cSJim Jagielski 				{
1110*b1cdbd2cSJim Jagielski 					// Muss CurrentBlock umgesetzt werden
1111*b1cdbd2cSJim Jagielski 					if ( pDelBlock == pCurBlock )
1112*b1cdbd2cSJim Jagielski 						bLast = sal_True;
1113*b1cdbd2cSJim Jagielski 					pDelNext = pDelBlock->GetNextBlock();
1114*b1cdbd2cSJim Jagielski 					delete pDelBlock;
1115*b1cdbd2cSJim Jagielski 					pDelBlock = pDelNext;
1116*b1cdbd2cSJim Jagielski 				}
1117*b1cdbd2cSJim Jagielski 
1118*b1cdbd2cSJim Jagielski 				// Block in der Groesse anpassen, oder bei Groesse 0 loeschen
1119*b1cdbd2cSJim Jagielski 				if ( nNewSize > nTemp )
1120*b1cdbd2cSJim Jagielski 				{
1121*b1cdbd2cSJim Jagielski 					pLastBlock = pTemp;
1122*b1cdbd2cSJim Jagielski 					pTemp->SetNextBlock( NULL );
1123*b1cdbd2cSJim Jagielski 					pTemp->SetSize( (sal_uInt16)(nNewSize-nTemp) );
1124*b1cdbd2cSJim Jagielski 				}
1125*b1cdbd2cSJim Jagielski 				else
1126*b1cdbd2cSJim Jagielski 				{
1127*b1cdbd2cSJim Jagielski 					pLastBlock = pTemp->GetPrevBlock();
1128*b1cdbd2cSJim Jagielski 					pLastBlock->SetNextBlock( NULL );
1129*b1cdbd2cSJim Jagielski 					delete pTemp;
1130*b1cdbd2cSJim Jagielski 				}
1131*b1cdbd2cSJim Jagielski 
1132*b1cdbd2cSJim Jagielski 				nCount = nNewSize;
1133*b1cdbd2cSJim Jagielski 				if ( bLast )
1134*b1cdbd2cSJim Jagielski 				{
1135*b1cdbd2cSJim Jagielski 					pCurBlock = pLastBlock;
1136*b1cdbd2cSJim Jagielski 					nCurIndex = pCurBlock->Count()-1;
1137*b1cdbd2cSJim Jagielski 				}
1138*b1cdbd2cSJim Jagielski 			}
1139*b1cdbd2cSJim Jagielski 			else
1140*b1cdbd2cSJim Jagielski 			{
1141*b1cdbd2cSJim Jagielski 				// Auf den letzen Puffer setzen
1142*b1cdbd2cSJim Jagielski 				pTemp = pLastBlock;
1143*b1cdbd2cSJim Jagielski 				nTemp = nNewSize - nCount;
1144*b1cdbd2cSJim Jagielski 
1145*b1cdbd2cSJim Jagielski 				if ( !pTemp )
1146*b1cdbd2cSJim Jagielski 				{
1147*b1cdbd2cSJim Jagielski 					// Muss mehr als ein Block angelegt werden
1148*b1cdbd2cSJim Jagielski 					if ( nNewSize <= nBlockSize )
1149*b1cdbd2cSJim Jagielski 					{
1150*b1cdbd2cSJim Jagielski 						pFirstBlock = new CBlock( (sal_uInt16)nNewSize, NULL );
1151*b1cdbd2cSJim Jagielski 						pLastBlock = pFirstBlock;
1152*b1cdbd2cSJim Jagielski 					}
1153*b1cdbd2cSJim Jagielski 					else
1154*b1cdbd2cSJim Jagielski 					{
1155*b1cdbd2cSJim Jagielski 						CBlock* pBlock1;
1156*b1cdbd2cSJim Jagielski 						CBlock* pBlock2;
1157*b1cdbd2cSJim Jagielski 
1158*b1cdbd2cSJim Jagielski 						pFirstBlock = new CBlock( nBlockSize, NULL );
1159*b1cdbd2cSJim Jagielski 						pBlock1 = pFirstBlock;
1160*b1cdbd2cSJim Jagielski 						nNewSize -= nBlockSize;
1161*b1cdbd2cSJim Jagielski 
1162*b1cdbd2cSJim Jagielski 						// Solange die Blockgroesse ueberschritten wird, neue Bloecke anlegen
1163*b1cdbd2cSJim Jagielski 						while ( nNewSize > nBlockSize )
1164*b1cdbd2cSJim Jagielski 						{
1165*b1cdbd2cSJim Jagielski 							pBlock2 = new CBlock( nBlockSize, pBlock1 );
1166*b1cdbd2cSJim Jagielski 							pBlock1->SetNextBlock( pBlock2 );
1167*b1cdbd2cSJim Jagielski 							pBlock1 = pBlock2;
1168*b1cdbd2cSJim Jagielski 							nNewSize -= nBlockSize;
1169*b1cdbd2cSJim Jagielski 						}
1170*b1cdbd2cSJim Jagielski 
1171*b1cdbd2cSJim Jagielski 						pLastBlock = new CBlock( (sal_uInt16)nNewSize, pBlock1 );
1172*b1cdbd2cSJim Jagielski 						pBlock1->SetNextBlock( pLastBlock );
1173*b1cdbd2cSJim Jagielski 					}
1174*b1cdbd2cSJim Jagielski 
1175*b1cdbd2cSJim Jagielski 					pCurBlock  = pFirstBlock;
1176*b1cdbd2cSJim Jagielski 				}
1177*b1cdbd2cSJim Jagielski 				// Reicht es, den letzen Puffer in der Groesse anzupassen
1178*b1cdbd2cSJim Jagielski 				else if ( (nTemp+pTemp->Count()) <= nBlockSize )
1179*b1cdbd2cSJim Jagielski 					pTemp->SetSize( (sal_uInt16)(nTemp+pTemp->Count()) );
1180*b1cdbd2cSJim Jagielski 				else
1181*b1cdbd2cSJim Jagielski 				{
1182*b1cdbd2cSJim Jagielski 					// Puffer auf max. Blockgroesse setzen
1183*b1cdbd2cSJim Jagielski 					nTemp -= nBlockSize - pTemp->GetSize();
1184*b1cdbd2cSJim Jagielski 					pTemp->SetSize( nBlockSize );
1185*b1cdbd2cSJim Jagielski 
1186*b1cdbd2cSJim Jagielski 					CBlock* pTemp2;
1187*b1cdbd2cSJim Jagielski 					// Solange die Blockgroesse ueberschritten wird,
1188*b1cdbd2cSJim Jagielski 					// neue Bloecke anlegen
1189*b1cdbd2cSJim Jagielski 					while ( nTemp > nBlockSize )
1190*b1cdbd2cSJim Jagielski 					{
1191*b1cdbd2cSJim Jagielski 						pTemp2 = new CBlock( nBlockSize, pTemp );
1192*b1cdbd2cSJim Jagielski 						pTemp->SetNextBlock( pTemp2 );
1193*b1cdbd2cSJim Jagielski 						pTemp = pTemp2;
1194*b1cdbd2cSJim Jagielski 						nTemp -= nBlockSize;
1195*b1cdbd2cSJim Jagielski 					}
1196*b1cdbd2cSJim Jagielski 
1197*b1cdbd2cSJim Jagielski 					// Den letzten Block anlegen
1198*b1cdbd2cSJim Jagielski 					if ( nTemp )
1199*b1cdbd2cSJim Jagielski 					{
1200*b1cdbd2cSJim Jagielski 						pLastBlock = new CBlock( (sal_uInt16)nTemp, pTemp );
1201*b1cdbd2cSJim Jagielski 						pTemp->SetNextBlock( pLastBlock );
1202*b1cdbd2cSJim Jagielski 					}
1203*b1cdbd2cSJim Jagielski 					else
1204*b1cdbd2cSJim Jagielski 						pLastBlock = pTemp;
1205*b1cdbd2cSJim Jagielski 				}
1206*b1cdbd2cSJim Jagielski 
1207*b1cdbd2cSJim Jagielski 				nCount = nNewSize;
1208*b1cdbd2cSJim Jagielski 			}
1209*b1cdbd2cSJim Jagielski 		}
1210*b1cdbd2cSJim Jagielski 	}
1211*b1cdbd2cSJim Jagielski 	else
1212*b1cdbd2cSJim Jagielski 		Clear();
1213*b1cdbd2cSJim Jagielski }
1214*b1cdbd2cSJim Jagielski 
1215*b1cdbd2cSJim Jagielski /*************************************************************************
1216*b1cdbd2cSJim Jagielski |*
1217*b1cdbd2cSJim Jagielski |*	  Container::Clear()
1218*b1cdbd2cSJim Jagielski |*
1219*b1cdbd2cSJim Jagielski |*	  Beschreibung		CONTNR.SDW
1220*b1cdbd2cSJim Jagielski |*	  Ersterstellung	TH 17.09.91
1221*b1cdbd2cSJim Jagielski |*	  Letzte Aenderung	TH 17.09.91
1222*b1cdbd2cSJim Jagielski |*
1223*b1cdbd2cSJim Jagielski *************************************************************************/
1224*b1cdbd2cSJim Jagielski 
Clear()1225*b1cdbd2cSJim Jagielski void Container::Clear()
1226*b1cdbd2cSJim Jagielski {
1227*b1cdbd2cSJim Jagielski 	DBG_CHKTHIS( Container, DbgCheckContainer );
1228*b1cdbd2cSJim Jagielski 
1229*b1cdbd2cSJim Jagielski 	// Erst alle Bloecke loeschen
1230*b1cdbd2cSJim Jagielski 	CBlock* pBlock = pFirstBlock;
1231*b1cdbd2cSJim Jagielski 	while ( pBlock )
1232*b1cdbd2cSJim Jagielski 	{
1233*b1cdbd2cSJim Jagielski 		CBlock* pTemp = pBlock->GetNextBlock();
1234*b1cdbd2cSJim Jagielski 		delete pBlock;
1235*b1cdbd2cSJim Jagielski 		pBlock = pTemp;
1236*b1cdbd2cSJim Jagielski 	}
1237*b1cdbd2cSJim Jagielski 
1238*b1cdbd2cSJim Jagielski 	// Werte zuruecksetzen
1239*b1cdbd2cSJim Jagielski 	pFirstBlock = NULL;
1240*b1cdbd2cSJim Jagielski 	pLastBlock	= NULL;
1241*b1cdbd2cSJim Jagielski 	pCurBlock	= NULL;
1242*b1cdbd2cSJim Jagielski 	nCount		= 0;
1243*b1cdbd2cSJim Jagielski 	nCurIndex	= 0;
1244*b1cdbd2cSJim Jagielski }
1245*b1cdbd2cSJim Jagielski 
1246*b1cdbd2cSJim Jagielski /*************************************************************************
1247*b1cdbd2cSJim Jagielski |*
1248*b1cdbd2cSJim Jagielski |*	  Container::GetCurObject()
1249*b1cdbd2cSJim Jagielski |*
1250*b1cdbd2cSJim Jagielski |*	  Beschreibung		CONTNR.SDW
1251*b1cdbd2cSJim Jagielski |*	  Ersterstellung	TH 17.09.91
1252*b1cdbd2cSJim Jagielski |*	  Letzte Aenderung	TH 17.09.91
1253*b1cdbd2cSJim Jagielski |*
1254*b1cdbd2cSJim Jagielski *************************************************************************/
1255*b1cdbd2cSJim Jagielski 
GetCurObject() const1256*b1cdbd2cSJim Jagielski void* Container::GetCurObject() const
1257*b1cdbd2cSJim Jagielski {
1258*b1cdbd2cSJim Jagielski 	DBG_CHKTHIS( Container, DbgCheckContainer );
1259*b1cdbd2cSJim Jagielski 
1260*b1cdbd2cSJim Jagielski 	// NULL, wenn Container leer
1261*b1cdbd2cSJim Jagielski 	if ( !nCount )
1262*b1cdbd2cSJim Jagielski 		return NULL;
1263*b1cdbd2cSJim Jagielski 	else
1264*b1cdbd2cSJim Jagielski 		return pCurBlock->GetObject( nCurIndex );
1265*b1cdbd2cSJim Jagielski }
1266*b1cdbd2cSJim Jagielski 
1267*b1cdbd2cSJim Jagielski /*************************************************************************
1268*b1cdbd2cSJim Jagielski |*
1269*b1cdbd2cSJim Jagielski |*	  Container::GetCurPos()
1270*b1cdbd2cSJim Jagielski |*
1271*b1cdbd2cSJim Jagielski |*	  Beschreibung		CONTNR.SDW
1272*b1cdbd2cSJim Jagielski |*	  Ersterstellung	TH 17.09.91
1273*b1cdbd2cSJim Jagielski |*	  Letzte Aenderung	TH 17.09.91
1274*b1cdbd2cSJim Jagielski |*
1275*b1cdbd2cSJim Jagielski *************************************************************************/
1276*b1cdbd2cSJim Jagielski 
GetCurPos() const1277*b1cdbd2cSJim Jagielski sal_uIntPtr Container::GetCurPos() const
1278*b1cdbd2cSJim Jagielski {
1279*b1cdbd2cSJim Jagielski 	DBG_CHKTHIS( Container, DbgCheckContainer );
1280*b1cdbd2cSJim Jagielski 
1281*b1cdbd2cSJim Jagielski 	// CONTAINER_ENTRY_NOTFOUND, wenn Container leer
1282*b1cdbd2cSJim Jagielski 	if ( !nCount )
1283*b1cdbd2cSJim Jagielski 		return CONTAINER_ENTRY_NOTFOUND;
1284*b1cdbd2cSJim Jagielski 	else
1285*b1cdbd2cSJim Jagielski 	{
1286*b1cdbd2cSJim Jagielski 		// Block suchen
1287*b1cdbd2cSJim Jagielski 		CBlock* pTemp = pFirstBlock;
1288*b1cdbd2cSJim Jagielski 		sal_uIntPtr	nTemp = 0;
1289*b1cdbd2cSJim Jagielski 		while ( pTemp != pCurBlock )
1290*b1cdbd2cSJim Jagielski 		{
1291*b1cdbd2cSJim Jagielski 			nTemp += pTemp->Count();
1292*b1cdbd2cSJim Jagielski 			pTemp  = pTemp->GetNextBlock();
1293*b1cdbd2cSJim Jagielski 		}
1294*b1cdbd2cSJim Jagielski 
1295*b1cdbd2cSJim Jagielski 		return nTemp+nCurIndex;
1296*b1cdbd2cSJim Jagielski 	}
1297*b1cdbd2cSJim Jagielski }
1298*b1cdbd2cSJim Jagielski 
1299*b1cdbd2cSJim Jagielski /*************************************************************************
1300*b1cdbd2cSJim Jagielski |*
1301*b1cdbd2cSJim Jagielski |*	  Container::GetObjectPtr()
1302*b1cdbd2cSJim Jagielski |*
1303*b1cdbd2cSJim Jagielski |*	  Beschreibung		Interne Methode fuer Referenz-Container
1304*b1cdbd2cSJim Jagielski |*	  Ersterstellung	TH 26.01.93
1305*b1cdbd2cSJim Jagielski |*	  Letzte Aenderung	TH 26.01.93
1306*b1cdbd2cSJim Jagielski |*
1307*b1cdbd2cSJim Jagielski *************************************************************************/
1308*b1cdbd2cSJim Jagielski 
GetObjectPtr(sal_uIntPtr nIndex)1309*b1cdbd2cSJim Jagielski void** Container::GetObjectPtr( sal_uIntPtr nIndex )
1310*b1cdbd2cSJim Jagielski {
1311*b1cdbd2cSJim Jagielski 	DBG_CHKTHIS( Container, DbgCheckContainer );
1312*b1cdbd2cSJim Jagielski 
1313*b1cdbd2cSJim Jagielski 	// Ist Index nicht innerhalb des Containers, dann NULL zurueckgeben
1314*b1cdbd2cSJim Jagielski 	if ( nCount <= nIndex )
1315*b1cdbd2cSJim Jagielski 		return NULL;
1316*b1cdbd2cSJim Jagielski 	else
1317*b1cdbd2cSJim Jagielski 	{
1318*b1cdbd2cSJim Jagielski 		// Block suchen
1319*b1cdbd2cSJim Jagielski 		CBlock* pTemp = pFirstBlock;
1320*b1cdbd2cSJim Jagielski 		while ( pTemp->Count() <= nIndex )
1321*b1cdbd2cSJim Jagielski 		{
1322*b1cdbd2cSJim Jagielski 			nIndex -= pTemp->Count();
1323*b1cdbd2cSJim Jagielski 			pTemp	= pTemp->GetNextBlock();
1324*b1cdbd2cSJim Jagielski 		}
1325*b1cdbd2cSJim Jagielski 
1326*b1cdbd2cSJim Jagielski 		// Item innerhalb des gefundenen Blocks zurueckgeben
1327*b1cdbd2cSJim Jagielski 		return pTemp->GetObjectPtr( (sal_uInt16)nIndex );
1328*b1cdbd2cSJim Jagielski 	}
1329*b1cdbd2cSJim Jagielski }
1330*b1cdbd2cSJim Jagielski 
1331*b1cdbd2cSJim Jagielski /*************************************************************************
1332*b1cdbd2cSJim Jagielski |*
1333*b1cdbd2cSJim Jagielski |*	  Container::GetObject()
1334*b1cdbd2cSJim Jagielski |*
1335*b1cdbd2cSJim Jagielski |*	  Beschreibung		CONTNR.SDW
1336*b1cdbd2cSJim Jagielski |*	  Ersterstellung	TH 17.09.91
1337*b1cdbd2cSJim Jagielski |*	  Letzte Aenderung	TH 17.09.91
1338*b1cdbd2cSJim Jagielski |*
1339*b1cdbd2cSJim Jagielski *************************************************************************/
1340*b1cdbd2cSJim Jagielski 
GetObject(sal_uIntPtr nIndex) const1341*b1cdbd2cSJim Jagielski void* Container::GetObject( sal_uIntPtr nIndex ) const
1342*b1cdbd2cSJim Jagielski {
1343*b1cdbd2cSJim Jagielski 	DBG_CHKTHIS( Container, DbgCheckContainer );
1344*b1cdbd2cSJim Jagielski 
1345*b1cdbd2cSJim Jagielski 	// Ist Index nicht innerhalb des Containers, dann NULL zurueckgeben
1346*b1cdbd2cSJim Jagielski 	if ( nCount <= nIndex )
1347*b1cdbd2cSJim Jagielski 		return NULL;
1348*b1cdbd2cSJim Jagielski 	else
1349*b1cdbd2cSJim Jagielski 	{
1350*b1cdbd2cSJim Jagielski 		// Block suchen
1351*b1cdbd2cSJim Jagielski 		CBlock* pTemp = pFirstBlock;
1352*b1cdbd2cSJim Jagielski 		while ( pTemp->Count() <= nIndex )
1353*b1cdbd2cSJim Jagielski 		{
1354*b1cdbd2cSJim Jagielski 			nIndex -= pTemp->Count();
1355*b1cdbd2cSJim Jagielski 			pTemp	= pTemp->GetNextBlock();
1356*b1cdbd2cSJim Jagielski 		}
1357*b1cdbd2cSJim Jagielski 
1358*b1cdbd2cSJim Jagielski 		// Item innerhalb des gefundenen Blocks zurueckgeben
1359*b1cdbd2cSJim Jagielski 		return pTemp->GetObject( (sal_uInt16)nIndex );
1360*b1cdbd2cSJim Jagielski 	}
1361*b1cdbd2cSJim Jagielski }
1362*b1cdbd2cSJim Jagielski 
1363*b1cdbd2cSJim Jagielski /*************************************************************************
1364*b1cdbd2cSJim Jagielski |*
1365*b1cdbd2cSJim Jagielski |*	  Container::GetPos()
1366*b1cdbd2cSJim Jagielski |*
1367*b1cdbd2cSJim Jagielski |*	  Beschreibung		CONTNR.SDW
1368*b1cdbd2cSJim Jagielski |*	  Ersterstellung	TH 17.09.91
1369*b1cdbd2cSJim Jagielski |*	  Letzte Aenderung	TH 17.09.91
1370*b1cdbd2cSJim Jagielski |*
1371*b1cdbd2cSJim Jagielski *************************************************************************/
1372*b1cdbd2cSJim Jagielski 
GetPos(const void * p) const1373*b1cdbd2cSJim Jagielski sal_uIntPtr Container::GetPos( const void* p ) const
1374*b1cdbd2cSJim Jagielski {
1375*b1cdbd2cSJim Jagielski 	DBG_CHKTHIS( Container, DbgCheckContainer );
1376*b1cdbd2cSJim Jagielski 
1377*b1cdbd2cSJim Jagielski 	void**	pNodes;
1378*b1cdbd2cSJim Jagielski 	CBlock* pTemp;
1379*b1cdbd2cSJim Jagielski 	sal_uIntPtr	nTemp;
1380*b1cdbd2cSJim Jagielski 	sal_uInt16	nBlockCount;
1381*b1cdbd2cSJim Jagielski 	sal_uInt16	i;
1382*b1cdbd2cSJim Jagielski 
1383*b1cdbd2cSJim Jagielski 	// Block suchen
1384*b1cdbd2cSJim Jagielski 	pTemp = pFirstBlock;
1385*b1cdbd2cSJim Jagielski 	nTemp = 0;
1386*b1cdbd2cSJim Jagielski 	while ( pTemp )
1387*b1cdbd2cSJim Jagielski 	{
1388*b1cdbd2cSJim Jagielski 		pNodes = pTemp->GetNodes();
1389*b1cdbd2cSJim Jagielski 		i = 0;
1390*b1cdbd2cSJim Jagielski 		nBlockCount = pTemp->Count();
1391*b1cdbd2cSJim Jagielski 		while ( i < nBlockCount )
1392*b1cdbd2cSJim Jagielski 		{
1393*b1cdbd2cSJim Jagielski 			if ( p == *pNodes )
1394*b1cdbd2cSJim Jagielski 				return nTemp+i;
1395*b1cdbd2cSJim Jagielski 			pNodes++;
1396*b1cdbd2cSJim Jagielski 			i++;
1397*b1cdbd2cSJim Jagielski 		}
1398*b1cdbd2cSJim Jagielski 		nTemp += nBlockCount;
1399*b1cdbd2cSJim Jagielski 		pTemp  = pTemp->GetNextBlock();
1400*b1cdbd2cSJim Jagielski 	}
1401*b1cdbd2cSJim Jagielski 
1402*b1cdbd2cSJim Jagielski 	return CONTAINER_ENTRY_NOTFOUND;
1403*b1cdbd2cSJim Jagielski }
1404*b1cdbd2cSJim Jagielski 
1405*b1cdbd2cSJim Jagielski /*************************************************************************
1406*b1cdbd2cSJim Jagielski |*
1407*b1cdbd2cSJim Jagielski |*	  Container::GetPos()
1408*b1cdbd2cSJim Jagielski |*
1409*b1cdbd2cSJim Jagielski |*	  Beschreibung		CONTNR.SDW
1410*b1cdbd2cSJim Jagielski |*	  Ersterstellung	TH 14.09.94
1411*b1cdbd2cSJim Jagielski |*	  Letzte Aenderung	TH 14.09.94
1412*b1cdbd2cSJim Jagielski |*
1413*b1cdbd2cSJim Jagielski *************************************************************************/
1414*b1cdbd2cSJim Jagielski 
GetPos(const void * p,sal_uIntPtr nStartIndex,sal_Bool bForward) const1415*b1cdbd2cSJim Jagielski sal_uIntPtr Container::GetPos( const void* p, sal_uIntPtr nStartIndex,
1416*b1cdbd2cSJim Jagielski 						 sal_Bool bForward ) const
1417*b1cdbd2cSJim Jagielski {
1418*b1cdbd2cSJim Jagielski 	DBG_CHKTHIS( Container, DbgCheckContainer );
1419*b1cdbd2cSJim Jagielski 
1420*b1cdbd2cSJim Jagielski 	// Ist Index nicht innerhalb des Containers, dann NOTFOUND zurueckgeben
1421*b1cdbd2cSJim Jagielski 	if ( nCount <= nStartIndex )
1422*b1cdbd2cSJim Jagielski 		return CONTAINER_ENTRY_NOTFOUND;
1423*b1cdbd2cSJim Jagielski 	else
1424*b1cdbd2cSJim Jagielski 	{
1425*b1cdbd2cSJim Jagielski 		void**	pNodes;
1426*b1cdbd2cSJim Jagielski 		sal_uInt16	nBlockCount;
1427*b1cdbd2cSJim Jagielski 		sal_uInt16	i;
1428*b1cdbd2cSJim Jagielski 
1429*b1cdbd2cSJim Jagielski 		// Block suchen
1430*b1cdbd2cSJim Jagielski 		CBlock* pTemp = pFirstBlock;
1431*b1cdbd2cSJim Jagielski 		sal_uIntPtr	nTemp = 0;
1432*b1cdbd2cSJim Jagielski 		while ( nTemp+pTemp->Count() <= nStartIndex )
1433*b1cdbd2cSJim Jagielski 		{
1434*b1cdbd2cSJim Jagielski 			nTemp += pTemp->Count();
1435*b1cdbd2cSJim Jagielski 			pTemp  = pTemp->GetNextBlock();
1436*b1cdbd2cSJim Jagielski 		}
1437*b1cdbd2cSJim Jagielski 
1438*b1cdbd2cSJim Jagielski 		// Jetzt den Pointer suchen
1439*b1cdbd2cSJim Jagielski 		if ( bForward )
1440*b1cdbd2cSJim Jagielski 		{
1441*b1cdbd2cSJim Jagielski 			// Alle Bloecke durchrsuchen
1442*b1cdbd2cSJim Jagielski 			i = (sal_uInt16)(nStartIndex - nTemp);
1443*b1cdbd2cSJim Jagielski 			pNodes = pTemp->GetObjectPtr( i );
1444*b1cdbd2cSJim Jagielski 			do
1445*b1cdbd2cSJim Jagielski 			{
1446*b1cdbd2cSJim Jagielski 				nBlockCount = pTemp->Count();
1447*b1cdbd2cSJim Jagielski 				while ( i < nBlockCount )
1448*b1cdbd2cSJim Jagielski 				{
1449*b1cdbd2cSJim Jagielski 					if ( p == *pNodes )
1450*b1cdbd2cSJim Jagielski 						return nTemp+i;
1451*b1cdbd2cSJim Jagielski 					pNodes++;
1452*b1cdbd2cSJim Jagielski 					i++;
1453*b1cdbd2cSJim Jagielski 				}
1454*b1cdbd2cSJim Jagielski 				nTemp += nBlockCount;
1455*b1cdbd2cSJim Jagielski 				pTemp  = pTemp->GetNextBlock();
1456*b1cdbd2cSJim Jagielski 				if ( pTemp )
1457*b1cdbd2cSJim Jagielski 				{
1458*b1cdbd2cSJim Jagielski 					i = 0;
1459*b1cdbd2cSJim Jagielski 					pNodes = pTemp->GetNodes();
1460*b1cdbd2cSJim Jagielski 				}
1461*b1cdbd2cSJim Jagielski 				else
1462*b1cdbd2cSJim Jagielski 					break;
1463*b1cdbd2cSJim Jagielski 			}
1464*b1cdbd2cSJim Jagielski 			while ( sal_True );
1465*b1cdbd2cSJim Jagielski 		}
1466*b1cdbd2cSJim Jagielski 		else
1467*b1cdbd2cSJim Jagielski 		{
1468*b1cdbd2cSJim Jagielski 			// Alle Bloecke durchrsuchen
1469*b1cdbd2cSJim Jagielski 			i = (sal_uInt16)(nStartIndex-nTemp)+1;
1470*b1cdbd2cSJim Jagielski 			pNodes = pTemp->GetObjectPtr( i-1 );
1471*b1cdbd2cSJim Jagielski 			do
1472*b1cdbd2cSJim Jagielski 			{
1473*b1cdbd2cSJim Jagielski 				do
1474*b1cdbd2cSJim Jagielski 				{
1475*b1cdbd2cSJim Jagielski 					if ( p == *pNodes )
1476*b1cdbd2cSJim Jagielski 						return nTemp+i-1;
1477*b1cdbd2cSJim Jagielski 					pNodes--;
1478*b1cdbd2cSJim Jagielski 					i--;
1479*b1cdbd2cSJim Jagielski 				}
1480*b1cdbd2cSJim Jagielski 				while ( i );
1481*b1cdbd2cSJim Jagielski 				nTemp -= pTemp->Count();
1482*b1cdbd2cSJim Jagielski 				pTemp  = pTemp->GetPrevBlock();
1483*b1cdbd2cSJim Jagielski 				if ( pTemp )
1484*b1cdbd2cSJim Jagielski 				{
1485*b1cdbd2cSJim Jagielski 					i = pTemp->Count();
1486*b1cdbd2cSJim Jagielski 					// Leere Bloecke in der Kette darf es nicht geben. Nur
1487*b1cdbd2cSJim Jagielski 					// wenn ein Block existiert, darf dieser leer sein
1488*b1cdbd2cSJim Jagielski 					pNodes = pTemp->GetObjectPtr( i-1 );
1489*b1cdbd2cSJim Jagielski 				}
1490*b1cdbd2cSJim Jagielski 				else
1491*b1cdbd2cSJim Jagielski 					break;
1492*b1cdbd2cSJim Jagielski 			}
1493*b1cdbd2cSJim Jagielski 			while ( sal_True );
1494*b1cdbd2cSJim Jagielski 		}
1495*b1cdbd2cSJim Jagielski 	}
1496*b1cdbd2cSJim Jagielski 
1497*b1cdbd2cSJim Jagielski 	return CONTAINER_ENTRY_NOTFOUND;
1498*b1cdbd2cSJim Jagielski }
1499*b1cdbd2cSJim Jagielski 
1500*b1cdbd2cSJim Jagielski /*************************************************************************
1501*b1cdbd2cSJim Jagielski |*
1502*b1cdbd2cSJim Jagielski |*	  Container::Seek()
1503*b1cdbd2cSJim Jagielski |*
1504*b1cdbd2cSJim Jagielski |*	  Beschreibung		CONTNR.SDW
1505*b1cdbd2cSJim Jagielski |*	  Ersterstellung	TH 17.09.91
1506*b1cdbd2cSJim Jagielski |*	  Letzte Aenderung	TH 17.09.91
1507*b1cdbd2cSJim Jagielski |*
1508*b1cdbd2cSJim Jagielski *************************************************************************/
1509*b1cdbd2cSJim Jagielski 
Seek(sal_uIntPtr nIndex)1510*b1cdbd2cSJim Jagielski void* Container::Seek( sal_uIntPtr nIndex )
1511*b1cdbd2cSJim Jagielski {
1512*b1cdbd2cSJim Jagielski 	DBG_CHKTHIS( Container, DbgCheckContainer );
1513*b1cdbd2cSJim Jagielski 
1514*b1cdbd2cSJim Jagielski 	// Ist der Container leer, dann NULL zurueckgeben
1515*b1cdbd2cSJim Jagielski 	if ( nCount <= nIndex )
1516*b1cdbd2cSJim Jagielski 		return NULL;
1517*b1cdbd2cSJim Jagielski 	else
1518*b1cdbd2cSJim Jagielski 	{
1519*b1cdbd2cSJim Jagielski 		// Block suchen
1520*b1cdbd2cSJim Jagielski 		CBlock* pTemp = pFirstBlock;
1521*b1cdbd2cSJim Jagielski 		while ( pTemp->Count() <= nIndex )
1522*b1cdbd2cSJim Jagielski 		{
1523*b1cdbd2cSJim Jagielski 			nIndex -= pTemp->Count();
1524*b1cdbd2cSJim Jagielski 			pTemp	= pTemp->GetNextBlock();
1525*b1cdbd2cSJim Jagielski 		}
1526*b1cdbd2cSJim Jagielski 
1527*b1cdbd2cSJim Jagielski 		// Item innerhalb des gefundenen Blocks zurueckgeben
1528*b1cdbd2cSJim Jagielski 		pCurBlock = pTemp;
1529*b1cdbd2cSJim Jagielski 		nCurIndex = (sal_uInt16)nIndex;
1530*b1cdbd2cSJim Jagielski 		return pCurBlock->GetObject( nCurIndex );
1531*b1cdbd2cSJim Jagielski 	}
1532*b1cdbd2cSJim Jagielski }
1533*b1cdbd2cSJim Jagielski 
1534*b1cdbd2cSJim Jagielski /*************************************************************************
1535*b1cdbd2cSJim Jagielski |*
1536*b1cdbd2cSJim Jagielski |*	  Container::First()
1537*b1cdbd2cSJim Jagielski |*
1538*b1cdbd2cSJim Jagielski |*	  Beschreibung		CONTNR.SDW
1539*b1cdbd2cSJim Jagielski |*	  Ersterstellung	TH 17.09.91
1540*b1cdbd2cSJim Jagielski |*	  Letzte Aenderung	TH 17.09.91
1541*b1cdbd2cSJim Jagielski |*
1542*b1cdbd2cSJim Jagielski *************************************************************************/
1543*b1cdbd2cSJim Jagielski 
First()1544*b1cdbd2cSJim Jagielski void* Container::First()
1545*b1cdbd2cSJim Jagielski {
1546*b1cdbd2cSJim Jagielski 	DBG_CHKTHIS( Container, DbgCheckContainer );
1547*b1cdbd2cSJim Jagielski 
1548*b1cdbd2cSJim Jagielski 	// Ist Container leer, dann NULL zurueckgeben
1549*b1cdbd2cSJim Jagielski 	if ( !nCount )
1550*b1cdbd2cSJim Jagielski 		return NULL;
1551*b1cdbd2cSJim Jagielski 	else
1552*b1cdbd2cSJim Jagielski 	{
1553*b1cdbd2cSJim Jagielski 		// Block und Index setzen und ersten Pointer zurueckgeben
1554*b1cdbd2cSJim Jagielski 		pCurBlock = pFirstBlock;
1555*b1cdbd2cSJim Jagielski 		nCurIndex = 0;
1556*b1cdbd2cSJim Jagielski 		return pCurBlock->GetObject( nCurIndex );
1557*b1cdbd2cSJim Jagielski 	}
1558*b1cdbd2cSJim Jagielski }
1559*b1cdbd2cSJim Jagielski 
1560*b1cdbd2cSJim Jagielski /*************************************************************************
1561*b1cdbd2cSJim Jagielski |*
1562*b1cdbd2cSJim Jagielski |*	  Container::Last()
1563*b1cdbd2cSJim Jagielski |*
1564*b1cdbd2cSJim Jagielski |*	  Beschreibung		CONTNR.SDW
1565*b1cdbd2cSJim Jagielski |*	  Ersterstellung	TH 17.09.91
1566*b1cdbd2cSJim Jagielski |*	  Letzte Aenderung	TH 17.09.91
1567*b1cdbd2cSJim Jagielski |*
1568*b1cdbd2cSJim Jagielski *************************************************************************/
1569*b1cdbd2cSJim Jagielski 
Last()1570*b1cdbd2cSJim Jagielski void* Container::Last()
1571*b1cdbd2cSJim Jagielski {
1572*b1cdbd2cSJim Jagielski 	DBG_CHKTHIS( Container, DbgCheckContainer );
1573*b1cdbd2cSJim Jagielski 
1574*b1cdbd2cSJim Jagielski 	// Ist Container leer, dann NULL zurueckgeben
1575*b1cdbd2cSJim Jagielski 	if ( !nCount )
1576*b1cdbd2cSJim Jagielski 		return NULL;
1577*b1cdbd2cSJim Jagielski 	else
1578*b1cdbd2cSJim Jagielski 	{
1579*b1cdbd2cSJim Jagielski 		// Block und Index setzen und ersten Pointer zurueckgeben
1580*b1cdbd2cSJim Jagielski 		pCurBlock = pLastBlock;
1581*b1cdbd2cSJim Jagielski 		nCurIndex = pCurBlock->Count()-1;
1582*b1cdbd2cSJim Jagielski 		return pCurBlock->GetObject( nCurIndex );
1583*b1cdbd2cSJim Jagielski 	}
1584*b1cdbd2cSJim Jagielski }
1585*b1cdbd2cSJim Jagielski 
1586*b1cdbd2cSJim Jagielski /*************************************************************************
1587*b1cdbd2cSJim Jagielski |*
1588*b1cdbd2cSJim Jagielski |*	  Container::Next()
1589*b1cdbd2cSJim Jagielski |*
1590*b1cdbd2cSJim Jagielski |*	  Beschreibung		CONTNR.SDW
1591*b1cdbd2cSJim Jagielski |*	  Ersterstellung	TH 17.09.91
1592*b1cdbd2cSJim Jagielski |*	  Letzte Aenderung	TH 17.09.91
1593*b1cdbd2cSJim Jagielski |*
1594*b1cdbd2cSJim Jagielski *************************************************************************/
1595*b1cdbd2cSJim Jagielski 
Next()1596*b1cdbd2cSJim Jagielski void* Container::Next()
1597*b1cdbd2cSJim Jagielski {
1598*b1cdbd2cSJim Jagielski 	DBG_CHKTHIS( Container, DbgCheckContainer );
1599*b1cdbd2cSJim Jagielski 
1600*b1cdbd2cSJim Jagielski 	// Ist Container leer, dann NULL zurueckgeben, ansonsten preufen ob
1601*b1cdbd2cSJim Jagielski 	// naechste Position noch im aktuellen Block ist. Falls nicht, dann
1602*b1cdbd2cSJim Jagielski 	// einen Block weiterschalten (geht ohne Gefahr, da leere Bloecke
1603*b1cdbd2cSJim Jagielski 	// nicht vorkommen duerfen, es sein denn, es ist der einzige).
1604*b1cdbd2cSJim Jagielski 	if ( !nCount )
1605*b1cdbd2cSJim Jagielski 		return NULL;
1606*b1cdbd2cSJim Jagielski 	else if ( (nCurIndex+1) < pCurBlock->Count() )
1607*b1cdbd2cSJim Jagielski 		return pCurBlock->GetObject( ++nCurIndex );
1608*b1cdbd2cSJim Jagielski 	else if ( pCurBlock->GetNextBlock() )
1609*b1cdbd2cSJim Jagielski 	{
1610*b1cdbd2cSJim Jagielski 		pCurBlock = pCurBlock->GetNextBlock();
1611*b1cdbd2cSJim Jagielski 		nCurIndex = 0;
1612*b1cdbd2cSJim Jagielski 		return pCurBlock->GetObject( nCurIndex );
1613*b1cdbd2cSJim Jagielski 	}
1614*b1cdbd2cSJim Jagielski 	else
1615*b1cdbd2cSJim Jagielski 		return NULL;
1616*b1cdbd2cSJim Jagielski }
1617*b1cdbd2cSJim Jagielski 
1618*b1cdbd2cSJim Jagielski /*************************************************************************
1619*b1cdbd2cSJim Jagielski |*
1620*b1cdbd2cSJim Jagielski |*	  Container::Prev()
1621*b1cdbd2cSJim Jagielski |*
1622*b1cdbd2cSJim Jagielski |*	  Beschreibung		CONTNR.SDW
1623*b1cdbd2cSJim Jagielski |*	  Ersterstellung	TH 17.09.91
1624*b1cdbd2cSJim Jagielski |*	  Letzte Aenderung	TH 17.09.91
1625*b1cdbd2cSJim Jagielski |*
1626*b1cdbd2cSJim Jagielski *************************************************************************/
1627*b1cdbd2cSJim Jagielski 
Prev()1628*b1cdbd2cSJim Jagielski void* Container::Prev()
1629*b1cdbd2cSJim Jagielski {
1630*b1cdbd2cSJim Jagielski 	DBG_CHKTHIS( Container, DbgCheckContainer );
1631*b1cdbd2cSJim Jagielski 
1632*b1cdbd2cSJim Jagielski 	// Ist Container leer, dann NULL zurueckgeben, ansonsten preufen ob
1633*b1cdbd2cSJim Jagielski 	// vorherige Position noch im aktuellen Block ist. Falls nicht, dann
1634*b1cdbd2cSJim Jagielski 	// einen Block zurueckschalten (geht ohne Gefahr, da leere Bloecke
1635*b1cdbd2cSJim Jagielski 	// nicht vorkommen duerfen, es sein denn, es ist der einzige).
1636*b1cdbd2cSJim Jagielski 	if ( !nCount )
1637*b1cdbd2cSJim Jagielski 		return NULL;
1638*b1cdbd2cSJim Jagielski 	else if ( nCurIndex )
1639*b1cdbd2cSJim Jagielski 		return pCurBlock->GetObject( --nCurIndex );
1640*b1cdbd2cSJim Jagielski 	else if ( pCurBlock->GetPrevBlock() )
1641*b1cdbd2cSJim Jagielski 	{
1642*b1cdbd2cSJim Jagielski 		pCurBlock = pCurBlock->GetPrevBlock();
1643*b1cdbd2cSJim Jagielski 		nCurIndex = pCurBlock->Count() - 1;
1644*b1cdbd2cSJim Jagielski 		return pCurBlock->GetObject( nCurIndex );
1645*b1cdbd2cSJim Jagielski 	}
1646*b1cdbd2cSJim Jagielski 	else
1647*b1cdbd2cSJim Jagielski 		return NULL;
1648*b1cdbd2cSJim Jagielski }
1649*b1cdbd2cSJim Jagielski 
1650*b1cdbd2cSJim Jagielski /*************************************************************************
1651*b1cdbd2cSJim Jagielski |*
1652*b1cdbd2cSJim Jagielski |*	  Container::operator =()
1653*b1cdbd2cSJim Jagielski |*
1654*b1cdbd2cSJim Jagielski |*	  Beschreibung		CONTNR.SDW
1655*b1cdbd2cSJim Jagielski |*	  Ersterstellung	TH 17.09.91
1656*b1cdbd2cSJim Jagielski |*	  Letzte Aenderung	TH 17.09.91
1657*b1cdbd2cSJim Jagielski |*
1658*b1cdbd2cSJim Jagielski *************************************************************************/
1659*b1cdbd2cSJim Jagielski 
operator =(const Container & r)1660*b1cdbd2cSJim Jagielski Container& Container::operator =( const Container& r )
1661*b1cdbd2cSJim Jagielski {
1662*b1cdbd2cSJim Jagielski 	DBG_CHKTHIS( Container, DbgCheckContainer );
1663*b1cdbd2cSJim Jagielski 
1664*b1cdbd2cSJim Jagielski 	// Erst alle Bloecke loeschen
1665*b1cdbd2cSJim Jagielski 	CBlock* pBlock = pFirstBlock;
1666*b1cdbd2cSJim Jagielski 	while ( pBlock )
1667*b1cdbd2cSJim Jagielski 	{
1668*b1cdbd2cSJim Jagielski 		CBlock* pTemp = pBlock->GetNextBlock();
1669*b1cdbd2cSJim Jagielski 		delete pBlock;
1670*b1cdbd2cSJim Jagielski 		pBlock = pTemp;
1671*b1cdbd2cSJim Jagielski 	}
1672*b1cdbd2cSJim Jagielski 
1673*b1cdbd2cSJim Jagielski 	// Daten kopieren
1674*b1cdbd2cSJim Jagielski 	ImpCopyContainer( &r );
1675*b1cdbd2cSJim Jagielski 	return *this;
1676*b1cdbd2cSJim Jagielski }
1677*b1cdbd2cSJim Jagielski 
1678*b1cdbd2cSJim Jagielski /*************************************************************************
1679*b1cdbd2cSJim Jagielski |*
1680*b1cdbd2cSJim Jagielski |*	  Container::operator ==()
1681*b1cdbd2cSJim Jagielski |*
1682*b1cdbd2cSJim Jagielski |*	  Beschreibung		CONTNR.SDW
1683*b1cdbd2cSJim Jagielski |*	  Ersterstellung	TH 17.09.91
1684*b1cdbd2cSJim Jagielski |*	  Letzte Aenderung	TH 17.09.91
1685*b1cdbd2cSJim Jagielski |*
1686*b1cdbd2cSJim Jagielski *************************************************************************/
1687*b1cdbd2cSJim Jagielski 
operator ==(const Container & r) const1688*b1cdbd2cSJim Jagielski sal_Bool Container::operator ==( const Container& r ) const
1689*b1cdbd2cSJim Jagielski {
1690*b1cdbd2cSJim Jagielski 	DBG_CHKTHIS( Container, DbgCheckContainer );
1691*b1cdbd2cSJim Jagielski 
1692*b1cdbd2cSJim Jagielski 	if ( nCount != r.nCount )
1693*b1cdbd2cSJim Jagielski 		return sal_False;
1694*b1cdbd2cSJim Jagielski 
1695*b1cdbd2cSJim Jagielski 	sal_uIntPtr i = 0;
1696*b1cdbd2cSJim Jagielski 	while ( i < nCount )
1697*b1cdbd2cSJim Jagielski 	{
1698*b1cdbd2cSJim Jagielski 		if ( GetObject( i ) != r.GetObject( i ) )
1699*b1cdbd2cSJim Jagielski 			return sal_False;
1700*b1cdbd2cSJim Jagielski 		i++;
1701*b1cdbd2cSJim Jagielski 	}
1702*b1cdbd2cSJim Jagielski 
1703*b1cdbd2cSJim Jagielski 	return sal_True;
1704*b1cdbd2cSJim Jagielski }
1705