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