update dev300-m58
[ooovba.git] / tools / source / memtools / unqidx.cxx
blob359f80afa7dd61ec99b2bf396f8450dc7e712ce2
1 /*************************************************************************
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4 *
5 * Copyright 2008 by Sun Microsystems, Inc.
7 * OpenOffice.org - a multi-platform office productivity suite
9 * $RCSfile: unqidx.cxx,v $
10 * $Revision: 1.6 $
12 * This file is part of OpenOffice.org.
14 * OpenOffice.org is free software: you can redistribute it and/or modify
15 * it under the terms of the GNU Lesser General Public License version 3
16 * only, as published by the Free Software Foundation.
18 * OpenOffice.org is distributed in the hope that it will be useful,
19 * but WITHOUT ANY WARRANTY; without even the implied warranty of
20 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
21 * GNU Lesser General Public License version 3 for more details
22 * (a copy is included in the LICENSE file that accompanied this code).
24 * You should have received a copy of the GNU Lesser General Public License
25 * version 3 along with OpenOffice.org. If not, see
26 * <http://www.openoffice.org/license.html>
27 * for a copy of the LGPLv3 License.
29 ************************************************************************/
31 // MARKER(update_precomp.py): autogen include statement, do not remove
32 #include "precompiled_tools.hxx"
33 #include <impcont.hxx>
34 #include <tools/unqidx.hxx>
35 #include <tools/unqid.hxx>
37 /*************************************************************************
39 |* UniqueIndex::UniqueIndex()
41 |* Beschreibung UNQIDX.SDW
42 |* Ersterstellung TH 24.09.91
43 |* Letzte Aenderung TH 24.09.91
45 *************************************************************************/
47 UniqueIndex::UniqueIndex( ULONG _nStartIndex,
48 ULONG _nInitSize, ULONG _nReSize ) :
49 Container( _nInitSize )
51 nReSize = _nReSize;
52 nStartIndex = _nStartIndex;
53 nUniqIndex = 0;
54 nCount = 0;
57 /*************************************************************************
59 |* UniqueIndex::UniqueIndex()
61 |* Beschreibung UNQIDX.SDW
62 |* Ersterstellung TH 24.09.91
63 |* Letzte Aenderung TH 24.09.91
65 *************************************************************************/
67 UniqueIndex::UniqueIndex( const UniqueIndex& rIdx ) :
68 Container( rIdx )
70 nReSize = rIdx.nReSize;
71 nStartIndex = rIdx.nStartIndex;
72 nUniqIndex = rIdx.nUniqIndex;
73 nCount = rIdx.nCount;
76 /*************************************************************************
78 |* UniqueIndex::Insert()
80 |* Beschreibung UNQIDX.SDW
81 |* Ersterstellung TH 24.09.91
82 |* Letzte Aenderung TH 24.09.91
84 *************************************************************************/
86 ULONG UniqueIndex::Insert( void* p )
88 // NULL-Pointer ist nicht erlaubt
89 if ( !p )
90 return UNIQUEINDEX_ENTRY_NOTFOUND;
92 // Ist Array voll, dann expandieren
93 if ( nCount == Container::GetSize() )
94 SetSize( nCount + nReSize );
96 // Damit UniqIndex nicht ueberlaeuft, wenn Items geloescht wurden
97 nUniqIndex = nUniqIndex % Container::GetSize();
99 // Leeren Eintrag suchen
100 while ( Container::ImpGetObject( nUniqIndex ) != NULL )
101 nUniqIndex = (nUniqIndex+1) % Container::GetSize();
103 // Object im Array speichern
104 Container::Replace( p, nUniqIndex );
106 // Anzahl der Eintraege erhoehen und Index zurueckgeben
107 nCount++;
108 nUniqIndex++;
109 return ( nUniqIndex + nStartIndex - 1 );
112 /*************************************************************************
114 |* UniqueIndex::Insert()
116 |* Beschreibung UNQIDX.SDW
117 |* Ersterstellung MM 21.04.96
118 |* Letzte Aenderung MM 21.04.96
120 *************************************************************************/
122 ULONG UniqueIndex::Insert( ULONG nIndex, void* p )
124 // NULL-Pointer ist nicht erlaubt
125 if ( !p )
126 return UNIQUEINDEX_ENTRY_NOTFOUND;
128 ULONG nContIndex = nIndex - nStartIndex;
129 // Ist Array voll, dann expandieren
130 if ( nContIndex >= Container::GetSize() )
131 SetSize( nContIndex + nReSize );
133 // Object im Array speichern
134 Container::Replace( p, nContIndex );
136 // Anzahl der Eintraege erhoehen und Index zurueckgeben
137 nCount++;
138 return nIndex;
141 /*************************************************************************
143 |* UniqueIndex::Remove()
145 |* Beschreibung UNQIDX.SDW
146 |* Ersterstellung TH 24.09.91
147 |* Letzte Aenderung TH 24.09.91
149 *************************************************************************/
151 void* UniqueIndex::Remove( ULONG nIndex )
153 // Ist Index zulaessig
154 if ( (nIndex >= nStartIndex) &&
155 (nIndex < (Container::GetSize()+nStartIndex)) )
157 // Index-Eintrag als leeren Eintrag setzen und Anzahl der
158 // gespeicherten Indexe erniedriegen, wenn Eintrag belegt war
159 void* p = Container::Replace( NULL, nIndex-nStartIndex );
160 if ( p )
161 nCount--;
162 return p;
164 else
165 return NULL;
168 /*************************************************************************
170 |* UniqueIndex::Replace()
172 |* Beschreibung UNQIDX.SDW
173 |* Ersterstellung TH 24.09.91
174 |* Letzte Aenderung TH 24.09.91
176 *************************************************************************/
178 void* UniqueIndex::Replace( ULONG nIndex, void* p )
180 // NULL-Pointer ist nicht erlaubt
181 if ( !p )
182 return NULL;
184 // Ist Index zulaessig
185 if ( IsIndexValid( nIndex ) )
187 // Index-Eintrag ersetzen und alten zurueckgeben
188 return Container::Replace( p, nIndex-nStartIndex );
190 else
191 return NULL;
194 /*************************************************************************
196 |* UniqueIndex::Get()
198 |* Beschreibung UNQIDX.SDW
199 |* Ersterstellung TH 24.09.91
200 |* Letzte Aenderung TH 24.09.91
202 *************************************************************************/
204 void* UniqueIndex::Get( ULONG nIndex ) const
206 // Ist Index zulaessig
207 if ( (nIndex >= nStartIndex) &&
208 (nIndex < (Container::GetSize()+nStartIndex)) )
209 return Container::ImpGetObject( nIndex-nStartIndex );
210 else
211 return NULL;
214 /*************************************************************************
216 |* UniqueIndex::GetCurIndex()
218 |* Beschreibung UNQIDX.SDW
219 |* Ersterstellung TH 24.09.91
220 |* Letzte Aenderung TH 24.09.91
222 *************************************************************************/
224 ULONG UniqueIndex::GetCurIndex() const
226 ULONG nPos = Container::GetCurPos();
228 // Ist der Current-Index nicht belegt, dann gibt es keinen Current-Index
229 if ( !Container::ImpGetObject( nPos ) )
230 return UNIQUEINDEX_ENTRY_NOTFOUND;
231 else
232 return nPos+nStartIndex;
235 /*************************************************************************
237 |* UniqueIndex::GetIndex()
239 |* Beschreibung UNQIDX.SDW
240 |* Ersterstellung TH 24.09.91
241 |* Letzte Aenderung TH 24.09.91
243 *************************************************************************/
245 ULONG UniqueIndex::GetIndex( const void* p ) const
247 // Wird ein NULL-Pointer uebergeben, dann wurde Pointer nicht gefunden
248 if ( !p )
249 return UNIQUEINDEX_ENTRY_NOTFOUND;
251 ULONG nIndex = Container::GetPos( p );
253 if ( nIndex != CONTAINER_ENTRY_NOTFOUND )
254 return nIndex+nStartIndex;
255 else
256 return UNIQUEINDEX_ENTRY_NOTFOUND;
259 /*************************************************************************
261 |* UniqueIndex::IsIndexValid()
263 |* Beschreibung UNQIDX.SDW
264 |* Ersterstellung TH 24.09.91
265 |* Letzte Aenderung TH 24.09.91
267 *************************************************************************/
269 BOOL UniqueIndex::IsIndexValid( ULONG nIndex ) const
271 // Ist Index zulaessig
272 if ( (nIndex >= nStartIndex) &&
273 (nIndex < (Container::GetSize()+nStartIndex)) )
275 // Index ist nur zulaessig, wenn Eintrag auch belegt ist
276 if ( Container::ImpGetObject( nIndex-nStartIndex ) )
277 return TRUE;
278 else
279 return FALSE;
281 else
282 return FALSE;
285 /*************************************************************************
287 |* UniqueIndex::Seek()
289 |* Beschreibung UNQIDX.SDW
290 |* Ersterstellung TH 24.09.91
291 |* Letzte Aenderung TH 24.09.91
293 *************************************************************************/
295 void* UniqueIndex::Seek( ULONG nIndex )
297 // Index-Eintrag als aktuellen setzten, wenn er gueltig ist
298 if ( IsIndexValid( nIndex ) )
299 return Container::Seek( nIndex-nStartIndex );
300 else
301 return NULL;
304 /*************************************************************************
306 |* UniqueIndex::Seek()
308 |* Beschreibung UNQIDX.SDW
309 |* Ersterstellung TH 24.09.91
310 |* Letzte Aenderung TH 24.09.91
312 *************************************************************************/
314 void* UniqueIndex::Seek( void* p )
316 // Wird ein NULL-Pointer uebergeben, dann wurde Pointer nicht gefunden
317 if ( !p )
318 return NULL;
320 ULONG nIndex = GetIndex( p );
322 // Ist Index vorhanden, dann als aktuellen Eintrag setzen
323 if ( nIndex != UNIQUEINDEX_ENTRY_NOTFOUND )
324 return Container::Seek( nIndex-nStartIndex );
325 else
326 return NULL;
329 /*************************************************************************
331 |* UniqueIndex::First()
333 |* Beschreibung UNQIDX.SDW
334 |* Ersterstellung TH 24.09.91
335 |* Letzte Aenderung TH 24.09.91
337 *************************************************************************/
339 void* UniqueIndex::First()
341 void* p = Container::First();
343 while ( !p && (Container::GetCurPos() < (Container::GetSize()-1)) )
344 p = Container::Next();
346 return p;
349 /*************************************************************************
351 |* UniqueIndex::Last()
353 |* Beschreibung UNQIDX.SDW
354 |* Ersterstellung TH 24.09.91
355 |* Letzte Aenderung TH 24.09.91
357 *************************************************************************/
359 void* UniqueIndex::Last()
361 void* p = Container::Last();
363 while ( !p && Container::GetCurPos() )
364 p = Container::Prev();
366 return p;
369 /*************************************************************************
371 |* UniqueIndex::Next()
373 |* Beschreibung UNQIDX.SDW
374 |* Ersterstellung TH 24.09.91
375 |* Letzte Aenderung TH 24.09.91
377 *************************************************************************/
379 void* UniqueIndex::Next()
381 void* p = NULL;
383 while ( !p && (Container::GetCurPos() < (Container::GetSize()-1)) )
384 p = Container::Next();
386 return p;
389 /*************************************************************************
391 |* UniqueIndex::Prev()
393 |* Beschreibung UNQIDX.SDW
394 |* Ersterstellung TH 24.09.91
395 |* Letzte Aenderung TH 24.09.91
397 *************************************************************************/
399 void* UniqueIndex::Prev()
401 void* p = NULL;
403 while ( !p && Container::GetCurPos() )
404 p = Container::Prev();
406 return p;
409 /*************************************************************************
411 |* UniqueIndex::operator =()
413 |* Beschreibung UNQIDX.SDW
414 |* Ersterstellung TH 24.09.91
415 |* Letzte Aenderung TH 24.09.91
417 *************************************************************************/
419 UniqueIndex& UniqueIndex::operator =( const UniqueIndex& rIdx )
421 // Neue Werte zuweisen
422 Container::operator =( rIdx );
423 nReSize = rIdx.nReSize;
424 nStartIndex = rIdx.nStartIndex;
425 nUniqIndex = rIdx.nUniqIndex;
426 nCount = rIdx.nCount;
427 return *this;
430 /*************************************************************************
432 |* UniqueIndex::operator ==()
434 |* Beschreibung UNQIDX.SDW
435 |* Ersterstellung TH 24.09.91
436 |* Letzte Aenderung TH 24.09.91
438 *************************************************************************/
440 BOOL UniqueIndex::operator ==( const UniqueIndex& rIdx ) const
442 // Neue Werte zuweisen
443 if ( (nStartIndex == rIdx.nStartIndex) &&
444 (nCount == rIdx.nCount) &&
445 (Container::operator ==( rIdx )) )
446 return TRUE;
447 else
448 return FALSE;
450 /*************************************************************************
452 |* UniqueIdContainer::UniqueIdContainer ()
454 |* Beschreibung UNQIDX.SDW
455 |* Ersterstellung MM 29.04.96
456 |* Letzte Aenderung MM 29.04.96
458 *************************************************************************/
460 UniqueIdContainer::UniqueIdContainer( const UniqueIdContainer& rObj )
461 : UniqueIndex( rObj )
462 , nCollectCount( rObj.nCollectCount )
464 ULONG nCur = GetCurIndex();
466 ImpUniqueId * pEle = (ImpUniqueId *)First();
467 while( pEle )
469 pEle->nRefCount++;
470 pEle = (ImpUniqueId *)Next();
472 Seek( nCur );
475 /*************************************************************************
477 |* UniqueIdContainer::operator = ()
479 |* Beschreibung UNQIDX.SDW
480 |* Ersterstellung MM 01.08.94
481 |* Letzte Aenderung MM 01.08.94
483 *************************************************************************/
485 UniqueIdContainer& UniqueIdContainer::operator = ( const UniqueIdContainer & rObj )
487 UniqueIndex::operator = ( rObj );
488 nCollectCount = rObj.nCollectCount;
490 ULONG nCur = GetCurIndex();
492 ImpUniqueId * pEle = (ImpUniqueId *)First();
493 while( pEle )
495 pEle->nRefCount++;
496 pEle = (ImpUniqueId *)Next();
498 Seek( nCur );
499 return *this;
502 /*************************************************************************
504 |* UniqueIdContainer::Clear()
506 |* Beschreibung UNQIDX.SDW
507 |* Ersterstellung MM 01.08.94
508 |* Letzte Aenderung MM 01.08.94
510 *************************************************************************/
512 void UniqueIdContainer::Clear( BOOL bAll )
514 USHORT nFree = bAll ? 0xFFFF : 1;
516 ImpUniqueId* pId = (ImpUniqueId*)Last();
517 BOOL bLast = TRUE;
518 while ( pId )
520 if ( pId->nRefCount <= nFree )
522 ((ImpUniqueId *)Remove( pId->nId ))->Release();
523 if( bLast )
524 pId = (ImpUniqueId *)Last();
525 else
526 pId = (ImpUniqueId *)Prev();
528 else
530 pId = (ImpUniqueId *)Prev();
531 bLast = FALSE;
536 /*************************************************************************
538 |* UniqueIdContainer::CreateId()
540 |* Beschreibung UNQIDX.SDW
541 |* Ersterstellung MM 01.08.94
542 |* Letzte Aenderung MM 01.08.94
544 *************************************************************************/
546 UniqueItemId UniqueIdContainer::CreateId()
548 if( nCollectCount > 50 )
549 { // aufraeumen
550 Clear( FALSE );
551 nCollectCount = 0;
553 nCollectCount++;
555 ImpUniqueId * pId = new ImpUniqueId;
556 pId->nRefCount = 1;
557 pId->nId = Insert( pId );
558 return UniqueItemId( pId );
561 /*************************************************************************
563 |* UniqueIdContainer::CreateIdProt()
565 |* Beschreibung UNQIDX.SDW
566 |* Ersterstellung MM 01.08.94
567 |* Letzte Aenderung MM 01.08.94
569 *************************************************************************/
571 UniqueItemId UniqueIdContainer::CreateFreeId( ULONG nId )
573 // Einfach erzeugen, fuer abgeleitete Klasse
574 ImpUniqueId * pId = new ImpUniqueId;
575 pId->nRefCount = 0;
576 pId->nId = nId;
577 return UniqueItemId( pId );
580 /*************************************************************************
582 |* UniqueIdContainer::CreateIdProt()
584 |* Beschreibung UNQIDX.SDW
585 |* Ersterstellung MM 01.08.94
586 |* Letzte Aenderung MM 01.08.94
588 *************************************************************************/
590 UniqueItemId UniqueIdContainer::CreateIdProt( ULONG nId )
592 if ( IsIndexValid( nId ) )
593 return UniqueItemId( (ImpUniqueId *)Get( nId ) );
595 ImpUniqueId * pId;
598 pId = new ImpUniqueId;
599 pId->nRefCount = 1;
600 pId->nId = Insert( pId );
602 while( pId->nId != nId );
603 return UniqueItemId( pId );