xref: /AOO41X/main/tools/source/memtools/unqidx.cxx (revision cdf0e10c4e3984b49a9502b011690b615761d4a3)
1*cdf0e10cSrcweir /*************************************************************************
2*cdf0e10cSrcweir  *
3*cdf0e10cSrcweir  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4*cdf0e10cSrcweir  *
5*cdf0e10cSrcweir  * Copyright 2000, 2010 Oracle and/or its affiliates.
6*cdf0e10cSrcweir  *
7*cdf0e10cSrcweir  * OpenOffice.org - a multi-platform office productivity suite
8*cdf0e10cSrcweir  *
9*cdf0e10cSrcweir  * This file is part of OpenOffice.org.
10*cdf0e10cSrcweir  *
11*cdf0e10cSrcweir  * OpenOffice.org is free software: you can redistribute it and/or modify
12*cdf0e10cSrcweir  * it under the terms of the GNU Lesser General Public License version 3
13*cdf0e10cSrcweir  * only, as published by the Free Software Foundation.
14*cdf0e10cSrcweir  *
15*cdf0e10cSrcweir  * OpenOffice.org is distributed in the hope that it will be useful,
16*cdf0e10cSrcweir  * but WITHOUT ANY WARRANTY; without even the implied warranty of
17*cdf0e10cSrcweir  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18*cdf0e10cSrcweir  * GNU Lesser General Public License version 3 for more details
19*cdf0e10cSrcweir  * (a copy is included in the LICENSE file that accompanied this code).
20*cdf0e10cSrcweir  *
21*cdf0e10cSrcweir  * You should have received a copy of the GNU Lesser General Public License
22*cdf0e10cSrcweir  * version 3 along with OpenOffice.org.  If not, see
23*cdf0e10cSrcweir  * <http://www.openoffice.org/license.html>
24*cdf0e10cSrcweir  * for a copy of the LGPLv3 License.
25*cdf0e10cSrcweir  *
26*cdf0e10cSrcweir  ************************************************************************/
27*cdf0e10cSrcweir 
28*cdf0e10cSrcweir // MARKER(update_precomp.py): autogen include statement, do not remove
29*cdf0e10cSrcweir #include "precompiled_tools.hxx"
30*cdf0e10cSrcweir #include <impcont.hxx>
31*cdf0e10cSrcweir #include <tools/unqidx.hxx>
32*cdf0e10cSrcweir #include <tools/unqid.hxx>
33*cdf0e10cSrcweir 
34*cdf0e10cSrcweir /*************************************************************************
35*cdf0e10cSrcweir |*
36*cdf0e10cSrcweir |*    UniqueIndex::UniqueIndex()
37*cdf0e10cSrcweir |*
38*cdf0e10cSrcweir |*    Beschreibung      UNQIDX.SDW
39*cdf0e10cSrcweir |*    Ersterstellung    TH 24.09.91
40*cdf0e10cSrcweir |*    Letzte Aenderung  TH 24.09.91
41*cdf0e10cSrcweir |*
42*cdf0e10cSrcweir *************************************************************************/
43*cdf0e10cSrcweir 
44*cdf0e10cSrcweir UniqueIndex::UniqueIndex( sal_uIntPtr _nStartIndex,
45*cdf0e10cSrcweir                           sal_uIntPtr _nInitSize, sal_uIntPtr _nReSize ) :
46*cdf0e10cSrcweir                  Container( _nInitSize )
47*cdf0e10cSrcweir {
48*cdf0e10cSrcweir     nReSize     	= _nReSize;
49*cdf0e10cSrcweir     nStartIndex 	= _nStartIndex;
50*cdf0e10cSrcweir     nUniqIndex  	= 0;
51*cdf0e10cSrcweir     nCount      	= 0;
52*cdf0e10cSrcweir }
53*cdf0e10cSrcweir 
54*cdf0e10cSrcweir /*************************************************************************
55*cdf0e10cSrcweir |*
56*cdf0e10cSrcweir |*    UniqueIndex::UniqueIndex()
57*cdf0e10cSrcweir |*
58*cdf0e10cSrcweir |*    Beschreibung      UNQIDX.SDW
59*cdf0e10cSrcweir |*    Ersterstellung    TH 24.09.91
60*cdf0e10cSrcweir |*    Letzte Aenderung  TH 24.09.91
61*cdf0e10cSrcweir |*
62*cdf0e10cSrcweir *************************************************************************/
63*cdf0e10cSrcweir 
64*cdf0e10cSrcweir UniqueIndex::UniqueIndex( const UniqueIndex& rIdx ) :
65*cdf0e10cSrcweir                  Container( rIdx )
66*cdf0e10cSrcweir {
67*cdf0e10cSrcweir     nReSize     = rIdx.nReSize;
68*cdf0e10cSrcweir     nStartIndex = rIdx.nStartIndex;
69*cdf0e10cSrcweir     nUniqIndex  = rIdx.nUniqIndex;
70*cdf0e10cSrcweir     nCount      = rIdx.nCount;
71*cdf0e10cSrcweir }
72*cdf0e10cSrcweir 
73*cdf0e10cSrcweir /*************************************************************************
74*cdf0e10cSrcweir |*
75*cdf0e10cSrcweir |*    UniqueIndex::Insert()
76*cdf0e10cSrcweir |*
77*cdf0e10cSrcweir |*    Beschreibung      UNQIDX.SDW
78*cdf0e10cSrcweir |*    Ersterstellung    TH 24.09.91
79*cdf0e10cSrcweir |*    Letzte Aenderung  TH 24.09.91
80*cdf0e10cSrcweir |*
81*cdf0e10cSrcweir *************************************************************************/
82*cdf0e10cSrcweir 
83*cdf0e10cSrcweir sal_uIntPtr UniqueIndex::Insert( void* p )
84*cdf0e10cSrcweir {
85*cdf0e10cSrcweir     // NULL-Pointer ist nicht erlaubt
86*cdf0e10cSrcweir     if ( !p )
87*cdf0e10cSrcweir         return UNIQUEINDEX_ENTRY_NOTFOUND;
88*cdf0e10cSrcweir 
89*cdf0e10cSrcweir     // Ist Array voll, dann expandieren
90*cdf0e10cSrcweir     if ( nCount == Container::GetSize() )
91*cdf0e10cSrcweir         SetSize( nCount + nReSize );
92*cdf0e10cSrcweir 
93*cdf0e10cSrcweir     // Damit UniqIndex nicht ueberlaeuft, wenn Items geloescht wurden
94*cdf0e10cSrcweir     nUniqIndex = nUniqIndex % Container::GetSize();
95*cdf0e10cSrcweir 
96*cdf0e10cSrcweir     // Leeren Eintrag suchen
97*cdf0e10cSrcweir     while ( Container::ImpGetObject( nUniqIndex ) != NULL )
98*cdf0e10cSrcweir         nUniqIndex = (nUniqIndex+1) % Container::GetSize();
99*cdf0e10cSrcweir 
100*cdf0e10cSrcweir     // Object im Array speichern
101*cdf0e10cSrcweir     Container::Replace( p, nUniqIndex );
102*cdf0e10cSrcweir 
103*cdf0e10cSrcweir     // Anzahl der Eintraege erhoehen und Index zurueckgeben
104*cdf0e10cSrcweir     nCount++;
105*cdf0e10cSrcweir     nUniqIndex++;
106*cdf0e10cSrcweir     return ( nUniqIndex + nStartIndex - 1 );
107*cdf0e10cSrcweir }
108*cdf0e10cSrcweir 
109*cdf0e10cSrcweir /*************************************************************************
110*cdf0e10cSrcweir |*
111*cdf0e10cSrcweir |*    UniqueIndex::Insert()
112*cdf0e10cSrcweir |*
113*cdf0e10cSrcweir |*    Beschreibung      UNQIDX.SDW
114*cdf0e10cSrcweir |*    Ersterstellung    MM 21.04.96
115*cdf0e10cSrcweir |*    Letzte Aenderung  MM 21.04.96
116*cdf0e10cSrcweir |*
117*cdf0e10cSrcweir *************************************************************************/
118*cdf0e10cSrcweir 
119*cdf0e10cSrcweir sal_uIntPtr UniqueIndex::Insert( sal_uIntPtr nIndex, void* p )
120*cdf0e10cSrcweir {
121*cdf0e10cSrcweir     // NULL-Pointer ist nicht erlaubt
122*cdf0e10cSrcweir     if ( !p )
123*cdf0e10cSrcweir         return UNIQUEINDEX_ENTRY_NOTFOUND;
124*cdf0e10cSrcweir 
125*cdf0e10cSrcweir 	sal_uIntPtr nContIndex = nIndex - nStartIndex;
126*cdf0e10cSrcweir     // Ist Array voll, dann expandieren
127*cdf0e10cSrcweir     if ( nContIndex >= Container::GetSize() )
128*cdf0e10cSrcweir         SetSize( nContIndex + nReSize );
129*cdf0e10cSrcweir 
130*cdf0e10cSrcweir     // Object im Array speichern
131*cdf0e10cSrcweir     Container::Replace( p, nContIndex );
132*cdf0e10cSrcweir 
133*cdf0e10cSrcweir     // Anzahl der Eintraege erhoehen und Index zurueckgeben
134*cdf0e10cSrcweir     nCount++;
135*cdf0e10cSrcweir     return nIndex;
136*cdf0e10cSrcweir }
137*cdf0e10cSrcweir 
138*cdf0e10cSrcweir /*************************************************************************
139*cdf0e10cSrcweir |*
140*cdf0e10cSrcweir |*    UniqueIndex::Remove()
141*cdf0e10cSrcweir |*
142*cdf0e10cSrcweir |*    Beschreibung      UNQIDX.SDW
143*cdf0e10cSrcweir |*    Ersterstellung    TH 24.09.91
144*cdf0e10cSrcweir |*    Letzte Aenderung  TH 24.09.91
145*cdf0e10cSrcweir |*
146*cdf0e10cSrcweir *************************************************************************/
147*cdf0e10cSrcweir 
148*cdf0e10cSrcweir void* UniqueIndex::Remove( sal_uIntPtr nIndex )
149*cdf0e10cSrcweir {
150*cdf0e10cSrcweir     // Ist Index zulaessig
151*cdf0e10cSrcweir     if ( (nIndex >= nStartIndex) &&
152*cdf0e10cSrcweir          (nIndex < (Container::GetSize()+nStartIndex)) )
153*cdf0e10cSrcweir     {
154*cdf0e10cSrcweir         // Index-Eintrag als leeren Eintrag setzen und Anzahl der
155*cdf0e10cSrcweir         // gespeicherten Indexe erniedriegen, wenn Eintrag belegt war
156*cdf0e10cSrcweir         void* p = Container::Replace( NULL, nIndex-nStartIndex );
157*cdf0e10cSrcweir         if ( p )
158*cdf0e10cSrcweir             nCount--;
159*cdf0e10cSrcweir         return p;
160*cdf0e10cSrcweir     }
161*cdf0e10cSrcweir     else
162*cdf0e10cSrcweir         return NULL;
163*cdf0e10cSrcweir }
164*cdf0e10cSrcweir 
165*cdf0e10cSrcweir /*************************************************************************
166*cdf0e10cSrcweir |*
167*cdf0e10cSrcweir |*    UniqueIndex::Replace()
168*cdf0e10cSrcweir |*
169*cdf0e10cSrcweir |*    Beschreibung      UNQIDX.SDW
170*cdf0e10cSrcweir |*    Ersterstellung    TH 24.09.91
171*cdf0e10cSrcweir |*    Letzte Aenderung  TH 24.09.91
172*cdf0e10cSrcweir |*
173*cdf0e10cSrcweir *************************************************************************/
174*cdf0e10cSrcweir 
175*cdf0e10cSrcweir void* UniqueIndex::Replace( sal_uIntPtr nIndex, void* p )
176*cdf0e10cSrcweir {
177*cdf0e10cSrcweir     // NULL-Pointer ist nicht erlaubt
178*cdf0e10cSrcweir     if ( !p )
179*cdf0e10cSrcweir         return NULL;
180*cdf0e10cSrcweir 
181*cdf0e10cSrcweir     // Ist Index zulaessig
182*cdf0e10cSrcweir     if ( IsIndexValid( nIndex ) )
183*cdf0e10cSrcweir     {
184*cdf0e10cSrcweir         // Index-Eintrag ersetzen und alten zurueckgeben
185*cdf0e10cSrcweir         return Container::Replace( p, nIndex-nStartIndex );
186*cdf0e10cSrcweir     }
187*cdf0e10cSrcweir     else
188*cdf0e10cSrcweir         return NULL;
189*cdf0e10cSrcweir }
190*cdf0e10cSrcweir 
191*cdf0e10cSrcweir /*************************************************************************
192*cdf0e10cSrcweir |*
193*cdf0e10cSrcweir |*    UniqueIndex::Get()
194*cdf0e10cSrcweir |*
195*cdf0e10cSrcweir |*    Beschreibung      UNQIDX.SDW
196*cdf0e10cSrcweir |*    Ersterstellung    TH 24.09.91
197*cdf0e10cSrcweir |*    Letzte Aenderung  TH 24.09.91
198*cdf0e10cSrcweir |*
199*cdf0e10cSrcweir *************************************************************************/
200*cdf0e10cSrcweir 
201*cdf0e10cSrcweir void* UniqueIndex::Get( sal_uIntPtr nIndex ) const
202*cdf0e10cSrcweir {
203*cdf0e10cSrcweir     // Ist Index zulaessig
204*cdf0e10cSrcweir     if ( (nIndex >= nStartIndex) &&
205*cdf0e10cSrcweir          (nIndex < (Container::GetSize()+nStartIndex)) )
206*cdf0e10cSrcweir         return Container::ImpGetObject( nIndex-nStartIndex );
207*cdf0e10cSrcweir     else
208*cdf0e10cSrcweir         return NULL;
209*cdf0e10cSrcweir }
210*cdf0e10cSrcweir 
211*cdf0e10cSrcweir /*************************************************************************
212*cdf0e10cSrcweir |*
213*cdf0e10cSrcweir |*    UniqueIndex::GetCurIndex()
214*cdf0e10cSrcweir |*
215*cdf0e10cSrcweir |*    Beschreibung      UNQIDX.SDW
216*cdf0e10cSrcweir |*    Ersterstellung    TH 24.09.91
217*cdf0e10cSrcweir |*    Letzte Aenderung  TH 24.09.91
218*cdf0e10cSrcweir |*
219*cdf0e10cSrcweir *************************************************************************/
220*cdf0e10cSrcweir 
221*cdf0e10cSrcweir sal_uIntPtr UniqueIndex::GetCurIndex() const
222*cdf0e10cSrcweir {
223*cdf0e10cSrcweir     sal_uIntPtr nPos = Container::GetCurPos();
224*cdf0e10cSrcweir 
225*cdf0e10cSrcweir     // Ist der Current-Index nicht belegt, dann gibt es keinen Current-Index
226*cdf0e10cSrcweir     if ( !Container::ImpGetObject( nPos ) )
227*cdf0e10cSrcweir         return UNIQUEINDEX_ENTRY_NOTFOUND;
228*cdf0e10cSrcweir     else
229*cdf0e10cSrcweir         return nPos+nStartIndex;
230*cdf0e10cSrcweir }
231*cdf0e10cSrcweir 
232*cdf0e10cSrcweir /*************************************************************************
233*cdf0e10cSrcweir |*
234*cdf0e10cSrcweir |*    UniqueIndex::GetIndex()
235*cdf0e10cSrcweir |*
236*cdf0e10cSrcweir |*    Beschreibung      UNQIDX.SDW
237*cdf0e10cSrcweir |*    Ersterstellung    TH 24.09.91
238*cdf0e10cSrcweir |*    Letzte Aenderung  TH 24.09.91
239*cdf0e10cSrcweir |*
240*cdf0e10cSrcweir *************************************************************************/
241*cdf0e10cSrcweir 
242*cdf0e10cSrcweir sal_uIntPtr UniqueIndex::GetIndex( const void* p ) const
243*cdf0e10cSrcweir {
244*cdf0e10cSrcweir     // Wird ein NULL-Pointer uebergeben, dann wurde Pointer nicht gefunden
245*cdf0e10cSrcweir     if ( !p )
246*cdf0e10cSrcweir         return UNIQUEINDEX_ENTRY_NOTFOUND;
247*cdf0e10cSrcweir 
248*cdf0e10cSrcweir     sal_uIntPtr nIndex = Container::GetPos( p );
249*cdf0e10cSrcweir 
250*cdf0e10cSrcweir     if ( nIndex != CONTAINER_ENTRY_NOTFOUND )
251*cdf0e10cSrcweir         return nIndex+nStartIndex;
252*cdf0e10cSrcweir     else
253*cdf0e10cSrcweir         return UNIQUEINDEX_ENTRY_NOTFOUND;
254*cdf0e10cSrcweir }
255*cdf0e10cSrcweir 
256*cdf0e10cSrcweir /*************************************************************************
257*cdf0e10cSrcweir |*
258*cdf0e10cSrcweir |*    UniqueIndex::IsIndexValid()
259*cdf0e10cSrcweir |*
260*cdf0e10cSrcweir |*    Beschreibung      UNQIDX.SDW
261*cdf0e10cSrcweir |*    Ersterstellung    TH 24.09.91
262*cdf0e10cSrcweir |*    Letzte Aenderung  TH 24.09.91
263*cdf0e10cSrcweir |*
264*cdf0e10cSrcweir *************************************************************************/
265*cdf0e10cSrcweir 
266*cdf0e10cSrcweir sal_Bool UniqueIndex::IsIndexValid( sal_uIntPtr nIndex ) const
267*cdf0e10cSrcweir {
268*cdf0e10cSrcweir     // Ist Index zulaessig
269*cdf0e10cSrcweir     if ( (nIndex >= nStartIndex) &&
270*cdf0e10cSrcweir          (nIndex < (Container::GetSize()+nStartIndex)) )
271*cdf0e10cSrcweir     {
272*cdf0e10cSrcweir         // Index ist nur zulaessig, wenn Eintrag auch belegt ist
273*cdf0e10cSrcweir         if ( Container::ImpGetObject( nIndex-nStartIndex ) )
274*cdf0e10cSrcweir             return sal_True;
275*cdf0e10cSrcweir         else
276*cdf0e10cSrcweir             return sal_False;
277*cdf0e10cSrcweir     }
278*cdf0e10cSrcweir     else
279*cdf0e10cSrcweir         return sal_False;
280*cdf0e10cSrcweir }
281*cdf0e10cSrcweir 
282*cdf0e10cSrcweir /*************************************************************************
283*cdf0e10cSrcweir |*
284*cdf0e10cSrcweir |*    UniqueIndex::Seek()
285*cdf0e10cSrcweir |*
286*cdf0e10cSrcweir |*    Beschreibung      UNQIDX.SDW
287*cdf0e10cSrcweir |*    Ersterstellung    TH 24.09.91
288*cdf0e10cSrcweir |*    Letzte Aenderung  TH 24.09.91
289*cdf0e10cSrcweir |*
290*cdf0e10cSrcweir *************************************************************************/
291*cdf0e10cSrcweir 
292*cdf0e10cSrcweir void* UniqueIndex::Seek( sal_uIntPtr nIndex )
293*cdf0e10cSrcweir {
294*cdf0e10cSrcweir     // Index-Eintrag als aktuellen setzten, wenn er gueltig ist
295*cdf0e10cSrcweir     if ( IsIndexValid( nIndex ) )
296*cdf0e10cSrcweir         return Container::Seek( nIndex-nStartIndex );
297*cdf0e10cSrcweir     else
298*cdf0e10cSrcweir         return NULL;
299*cdf0e10cSrcweir }
300*cdf0e10cSrcweir 
301*cdf0e10cSrcweir /*************************************************************************
302*cdf0e10cSrcweir |*
303*cdf0e10cSrcweir |*    UniqueIndex::Seek()
304*cdf0e10cSrcweir |*
305*cdf0e10cSrcweir |*    Beschreibung      UNQIDX.SDW
306*cdf0e10cSrcweir |*    Ersterstellung    TH 24.09.91
307*cdf0e10cSrcweir |*    Letzte Aenderung  TH 24.09.91
308*cdf0e10cSrcweir |*
309*cdf0e10cSrcweir *************************************************************************/
310*cdf0e10cSrcweir 
311*cdf0e10cSrcweir void* UniqueIndex::Seek( void* p )
312*cdf0e10cSrcweir {
313*cdf0e10cSrcweir     // Wird ein NULL-Pointer uebergeben, dann wurde Pointer nicht gefunden
314*cdf0e10cSrcweir     if ( !p )
315*cdf0e10cSrcweir         return NULL;
316*cdf0e10cSrcweir 
317*cdf0e10cSrcweir     sal_uIntPtr nIndex = GetIndex( p );
318*cdf0e10cSrcweir 
319*cdf0e10cSrcweir     // Ist Index vorhanden, dann als aktuellen Eintrag setzen
320*cdf0e10cSrcweir     if ( nIndex != UNIQUEINDEX_ENTRY_NOTFOUND )
321*cdf0e10cSrcweir         return Container::Seek( nIndex-nStartIndex );
322*cdf0e10cSrcweir     else
323*cdf0e10cSrcweir         return NULL;
324*cdf0e10cSrcweir }
325*cdf0e10cSrcweir 
326*cdf0e10cSrcweir /*************************************************************************
327*cdf0e10cSrcweir |*
328*cdf0e10cSrcweir |*    UniqueIndex::First()
329*cdf0e10cSrcweir |*
330*cdf0e10cSrcweir |*    Beschreibung      UNQIDX.SDW
331*cdf0e10cSrcweir |*    Ersterstellung    TH 24.09.91
332*cdf0e10cSrcweir |*    Letzte Aenderung  TH 24.09.91
333*cdf0e10cSrcweir |*
334*cdf0e10cSrcweir *************************************************************************/
335*cdf0e10cSrcweir 
336*cdf0e10cSrcweir void* UniqueIndex::First()
337*cdf0e10cSrcweir {
338*cdf0e10cSrcweir     void* p = Container::First();
339*cdf0e10cSrcweir 
340*cdf0e10cSrcweir     while ( !p && (Container::GetCurPos() < (Container::GetSize()-1)) )
341*cdf0e10cSrcweir         p = Container::Next();
342*cdf0e10cSrcweir 
343*cdf0e10cSrcweir     return p;
344*cdf0e10cSrcweir }
345*cdf0e10cSrcweir 
346*cdf0e10cSrcweir /*************************************************************************
347*cdf0e10cSrcweir |*
348*cdf0e10cSrcweir |*    UniqueIndex::Last()
349*cdf0e10cSrcweir |*
350*cdf0e10cSrcweir |*    Beschreibung      UNQIDX.SDW
351*cdf0e10cSrcweir |*    Ersterstellung    TH 24.09.91
352*cdf0e10cSrcweir |*    Letzte Aenderung  TH 24.09.91
353*cdf0e10cSrcweir |*
354*cdf0e10cSrcweir *************************************************************************/
355*cdf0e10cSrcweir 
356*cdf0e10cSrcweir void* UniqueIndex::Last()
357*cdf0e10cSrcweir {
358*cdf0e10cSrcweir     void* p = Container::Last();
359*cdf0e10cSrcweir 
360*cdf0e10cSrcweir     while ( !p && Container::GetCurPos() )
361*cdf0e10cSrcweir         p = Container::Prev();
362*cdf0e10cSrcweir 
363*cdf0e10cSrcweir     return p;
364*cdf0e10cSrcweir }
365*cdf0e10cSrcweir 
366*cdf0e10cSrcweir /*************************************************************************
367*cdf0e10cSrcweir |*
368*cdf0e10cSrcweir |*    UniqueIndex::Next()
369*cdf0e10cSrcweir |*
370*cdf0e10cSrcweir |*    Beschreibung      UNQIDX.SDW
371*cdf0e10cSrcweir |*    Ersterstellung    TH 24.09.91
372*cdf0e10cSrcweir |*    Letzte Aenderung  TH 24.09.91
373*cdf0e10cSrcweir |*
374*cdf0e10cSrcweir *************************************************************************/
375*cdf0e10cSrcweir 
376*cdf0e10cSrcweir void* UniqueIndex::Next()
377*cdf0e10cSrcweir {
378*cdf0e10cSrcweir     void* p = NULL;
379*cdf0e10cSrcweir 
380*cdf0e10cSrcweir     while ( !p && (Container::GetCurPos() < (Container::GetSize()-1)) )
381*cdf0e10cSrcweir         p = Container::Next();
382*cdf0e10cSrcweir 
383*cdf0e10cSrcweir     return p;
384*cdf0e10cSrcweir }
385*cdf0e10cSrcweir 
386*cdf0e10cSrcweir /*************************************************************************
387*cdf0e10cSrcweir |*
388*cdf0e10cSrcweir |*    UniqueIndex::Prev()
389*cdf0e10cSrcweir |*
390*cdf0e10cSrcweir |*    Beschreibung      UNQIDX.SDW
391*cdf0e10cSrcweir |*    Ersterstellung    TH 24.09.91
392*cdf0e10cSrcweir |*    Letzte Aenderung  TH 24.09.91
393*cdf0e10cSrcweir |*
394*cdf0e10cSrcweir *************************************************************************/
395*cdf0e10cSrcweir 
396*cdf0e10cSrcweir void* UniqueIndex::Prev()
397*cdf0e10cSrcweir {
398*cdf0e10cSrcweir     void* p = NULL;
399*cdf0e10cSrcweir 
400*cdf0e10cSrcweir     while ( !p && Container::GetCurPos() )
401*cdf0e10cSrcweir         p = Container::Prev();
402*cdf0e10cSrcweir 
403*cdf0e10cSrcweir     return p;
404*cdf0e10cSrcweir }
405*cdf0e10cSrcweir 
406*cdf0e10cSrcweir /*************************************************************************
407*cdf0e10cSrcweir |*
408*cdf0e10cSrcweir |*    UniqueIndex::operator =()
409*cdf0e10cSrcweir |*
410*cdf0e10cSrcweir |*    Beschreibung      UNQIDX.SDW
411*cdf0e10cSrcweir |*    Ersterstellung    TH 24.09.91
412*cdf0e10cSrcweir |*    Letzte Aenderung  TH 24.09.91
413*cdf0e10cSrcweir |*
414*cdf0e10cSrcweir *************************************************************************/
415*cdf0e10cSrcweir 
416*cdf0e10cSrcweir UniqueIndex& UniqueIndex::operator =( const UniqueIndex& rIdx )
417*cdf0e10cSrcweir {
418*cdf0e10cSrcweir     // Neue Werte zuweisen
419*cdf0e10cSrcweir     Container::operator =( rIdx );
420*cdf0e10cSrcweir     nReSize     = rIdx.nReSize;
421*cdf0e10cSrcweir     nStartIndex = rIdx.nStartIndex;
422*cdf0e10cSrcweir     nUniqIndex  = rIdx.nUniqIndex;
423*cdf0e10cSrcweir     nCount      = rIdx.nCount;
424*cdf0e10cSrcweir     return *this;
425*cdf0e10cSrcweir }
426*cdf0e10cSrcweir 
427*cdf0e10cSrcweir /*************************************************************************
428*cdf0e10cSrcweir |*
429*cdf0e10cSrcweir |*    UniqueIndex::operator ==()
430*cdf0e10cSrcweir |*
431*cdf0e10cSrcweir |*    Beschreibung      UNQIDX.SDW
432*cdf0e10cSrcweir |*    Ersterstellung    TH 24.09.91
433*cdf0e10cSrcweir |*    Letzte Aenderung  TH 24.09.91
434*cdf0e10cSrcweir |*
435*cdf0e10cSrcweir *************************************************************************/
436*cdf0e10cSrcweir 
437*cdf0e10cSrcweir sal_Bool UniqueIndex::operator ==( const UniqueIndex& rIdx ) const
438*cdf0e10cSrcweir {
439*cdf0e10cSrcweir     // Neue Werte zuweisen
440*cdf0e10cSrcweir     if ( (nStartIndex == rIdx.nStartIndex) &&
441*cdf0e10cSrcweir          (nCount      == rIdx.nCount)      &&
442*cdf0e10cSrcweir          (Container::operator ==( rIdx )) )
443*cdf0e10cSrcweir         return sal_True;
444*cdf0e10cSrcweir     else
445*cdf0e10cSrcweir         return sal_False;
446*cdf0e10cSrcweir }
447*cdf0e10cSrcweir /*************************************************************************
448*cdf0e10cSrcweir |*
449*cdf0e10cSrcweir |*    UniqueIdContainer::UniqueIdContainer ()
450*cdf0e10cSrcweir |*
451*cdf0e10cSrcweir |*    Beschreibung      UNQIDX.SDW
452*cdf0e10cSrcweir |*    Ersterstellung    MM 29.04.96
453*cdf0e10cSrcweir |*    Letzte Aenderung  MM 29.04.96
454*cdf0e10cSrcweir |*
455*cdf0e10cSrcweir *************************************************************************/
456*cdf0e10cSrcweir 
457*cdf0e10cSrcweir UniqueIdContainer::UniqueIdContainer( const UniqueIdContainer& rObj )
458*cdf0e10cSrcweir 	: UniqueIndex( rObj )
459*cdf0e10cSrcweir 	, nCollectCount( rObj.nCollectCount )
460*cdf0e10cSrcweir {
461*cdf0e10cSrcweir     sal_uIntPtr nCur = GetCurIndex();
462*cdf0e10cSrcweir 
463*cdf0e10cSrcweir     ImpUniqueId * pEle = (ImpUniqueId *)First();
464*cdf0e10cSrcweir     while( pEle )
465*cdf0e10cSrcweir     {
466*cdf0e10cSrcweir         pEle->nRefCount++;
467*cdf0e10cSrcweir         pEle = (ImpUniqueId *)Next();
468*cdf0e10cSrcweir     }
469*cdf0e10cSrcweir     Seek( nCur );
470*cdf0e10cSrcweir }
471*cdf0e10cSrcweir 
472*cdf0e10cSrcweir /*************************************************************************
473*cdf0e10cSrcweir |*
474*cdf0e10cSrcweir |*    UniqueIdContainer::operator = ()
475*cdf0e10cSrcweir |*
476*cdf0e10cSrcweir |*    Beschreibung      UNQIDX.SDW
477*cdf0e10cSrcweir |*    Ersterstellung    MM 01.08.94
478*cdf0e10cSrcweir |*    Letzte Aenderung  MM 01.08.94
479*cdf0e10cSrcweir |*
480*cdf0e10cSrcweir *************************************************************************/
481*cdf0e10cSrcweir 
482*cdf0e10cSrcweir UniqueIdContainer& UniqueIdContainer::operator = ( const UniqueIdContainer & rObj )
483*cdf0e10cSrcweir {
484*cdf0e10cSrcweir     UniqueIndex::operator = ( rObj );
485*cdf0e10cSrcweir 	nCollectCount = rObj.nCollectCount;
486*cdf0e10cSrcweir 
487*cdf0e10cSrcweir     sal_uIntPtr nCur = GetCurIndex();
488*cdf0e10cSrcweir 
489*cdf0e10cSrcweir     ImpUniqueId * pEle = (ImpUniqueId *)First();
490*cdf0e10cSrcweir     while( pEle )
491*cdf0e10cSrcweir     {
492*cdf0e10cSrcweir         pEle->nRefCount++;
493*cdf0e10cSrcweir         pEle = (ImpUniqueId *)Next();
494*cdf0e10cSrcweir     }
495*cdf0e10cSrcweir     Seek( nCur );
496*cdf0e10cSrcweir     return *this;
497*cdf0e10cSrcweir }
498*cdf0e10cSrcweir 
499*cdf0e10cSrcweir /*************************************************************************
500*cdf0e10cSrcweir |*
501*cdf0e10cSrcweir |*    UniqueIdContainer::Clear()
502*cdf0e10cSrcweir |*
503*cdf0e10cSrcweir |*    Beschreibung      UNQIDX.SDW
504*cdf0e10cSrcweir |*    Ersterstellung    MM 01.08.94
505*cdf0e10cSrcweir |*    Letzte Aenderung  MM 01.08.94
506*cdf0e10cSrcweir |*
507*cdf0e10cSrcweir *************************************************************************/
508*cdf0e10cSrcweir 
509*cdf0e10cSrcweir void UniqueIdContainer::Clear( sal_Bool bAll )
510*cdf0e10cSrcweir {
511*cdf0e10cSrcweir     sal_uInt16 nFree = bAll ? 0xFFFF : 1;
512*cdf0e10cSrcweir 
513*cdf0e10cSrcweir     ImpUniqueId* pId = (ImpUniqueId*)Last();
514*cdf0e10cSrcweir     sal_Bool bLast = sal_True;
515*cdf0e10cSrcweir     while ( pId )
516*cdf0e10cSrcweir     {
517*cdf0e10cSrcweir         if ( pId->nRefCount <= nFree )
518*cdf0e10cSrcweir         {
519*cdf0e10cSrcweir             ((ImpUniqueId *)Remove( pId->nId ))->Release();
520*cdf0e10cSrcweir             if( bLast )
521*cdf0e10cSrcweir                 pId = (ImpUniqueId *)Last();
522*cdf0e10cSrcweir             else
523*cdf0e10cSrcweir                 pId = (ImpUniqueId *)Prev();
524*cdf0e10cSrcweir         }
525*cdf0e10cSrcweir         else
526*cdf0e10cSrcweir         {
527*cdf0e10cSrcweir             pId = (ImpUniqueId *)Prev();
528*cdf0e10cSrcweir             bLast = sal_False;
529*cdf0e10cSrcweir         }
530*cdf0e10cSrcweir     }
531*cdf0e10cSrcweir }
532*cdf0e10cSrcweir 
533*cdf0e10cSrcweir /*************************************************************************
534*cdf0e10cSrcweir |*
535*cdf0e10cSrcweir |*    UniqueIdContainer::CreateId()
536*cdf0e10cSrcweir |*
537*cdf0e10cSrcweir |*    Beschreibung      UNQIDX.SDW
538*cdf0e10cSrcweir |*    Ersterstellung    MM 01.08.94
539*cdf0e10cSrcweir |*    Letzte Aenderung  MM 01.08.94
540*cdf0e10cSrcweir |*
541*cdf0e10cSrcweir *************************************************************************/
542*cdf0e10cSrcweir 
543*cdf0e10cSrcweir UniqueItemId UniqueIdContainer::CreateId()
544*cdf0e10cSrcweir {
545*cdf0e10cSrcweir     if( nCollectCount > 50 )
546*cdf0e10cSrcweir     { // aufraeumen
547*cdf0e10cSrcweir         Clear( sal_False );
548*cdf0e10cSrcweir         nCollectCount = 0;
549*cdf0e10cSrcweir     }
550*cdf0e10cSrcweir     nCollectCount++;
551*cdf0e10cSrcweir 
552*cdf0e10cSrcweir     ImpUniqueId * pId = new ImpUniqueId;
553*cdf0e10cSrcweir     pId->nRefCount = 1;
554*cdf0e10cSrcweir     pId->nId = Insert( pId );
555*cdf0e10cSrcweir     return UniqueItemId( pId );
556*cdf0e10cSrcweir }
557*cdf0e10cSrcweir 
558*cdf0e10cSrcweir /*************************************************************************
559*cdf0e10cSrcweir |*
560*cdf0e10cSrcweir |*    UniqueIdContainer::CreateIdProt()
561*cdf0e10cSrcweir |*
562*cdf0e10cSrcweir |*    Beschreibung      UNQIDX.SDW
563*cdf0e10cSrcweir |*    Ersterstellung    MM 01.08.94
564*cdf0e10cSrcweir |*    Letzte Aenderung  MM 01.08.94
565*cdf0e10cSrcweir |*
566*cdf0e10cSrcweir *************************************************************************/
567*cdf0e10cSrcweir 
568*cdf0e10cSrcweir UniqueItemId UniqueIdContainer::CreateFreeId( sal_uIntPtr nId )
569*cdf0e10cSrcweir {
570*cdf0e10cSrcweir     // Einfach erzeugen, fuer abgeleitete Klasse
571*cdf0e10cSrcweir     ImpUniqueId * pId = new ImpUniqueId;
572*cdf0e10cSrcweir     pId->nRefCount = 0;
573*cdf0e10cSrcweir     pId->nId = nId;
574*cdf0e10cSrcweir     return UniqueItemId( pId );
575*cdf0e10cSrcweir }
576*cdf0e10cSrcweir 
577*cdf0e10cSrcweir /*************************************************************************
578*cdf0e10cSrcweir |*
579*cdf0e10cSrcweir |*    UniqueIdContainer::CreateIdProt()
580*cdf0e10cSrcweir |*
581*cdf0e10cSrcweir |*    Beschreibung      UNQIDX.SDW
582*cdf0e10cSrcweir |*    Ersterstellung    MM 01.08.94
583*cdf0e10cSrcweir |*    Letzte Aenderung  MM 01.08.94
584*cdf0e10cSrcweir |*
585*cdf0e10cSrcweir *************************************************************************/
586*cdf0e10cSrcweir 
587*cdf0e10cSrcweir UniqueItemId UniqueIdContainer::CreateIdProt( sal_uIntPtr nId )
588*cdf0e10cSrcweir {
589*cdf0e10cSrcweir     if ( IsIndexValid( nId ) )
590*cdf0e10cSrcweir         return UniqueItemId( (ImpUniqueId *)Get( nId ) );
591*cdf0e10cSrcweir 
592*cdf0e10cSrcweir     ImpUniqueId * pId;
593*cdf0e10cSrcweir     do
594*cdf0e10cSrcweir     {
595*cdf0e10cSrcweir         pId = new ImpUniqueId;
596*cdf0e10cSrcweir         pId->nRefCount = 1;
597*cdf0e10cSrcweir         pId->nId = Insert( pId );
598*cdf0e10cSrcweir     }
599*cdf0e10cSrcweir     while( pId->nId != nId );
600*cdf0e10cSrcweir     return UniqueItemId( pId );
601*cdf0e10cSrcweir }
602