1 /*************************************************************************
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
5 * Copyright 2008 by Sun Microsystems, Inc.
7 * OpenOffice.org - a multi-platform office productivity suite
9 * $RCSfile: unqidx.cxx,v $
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
)
52 nStartIndex
= _nStartIndex
;
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
) :
70 nReSize
= rIdx
.nReSize
;
71 nStartIndex
= rIdx
.nStartIndex
;
72 nUniqIndex
= rIdx
.nUniqIndex
;
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
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
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
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
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
);
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
184 // Ist Index zulaessig
185 if ( IsIndexValid( nIndex
) )
187 // Index-Eintrag ersetzen und alten zurueckgeben
188 return Container::Replace( p
, nIndex
-nStartIndex
);
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
);
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
;
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
249 return UNIQUEINDEX_ENTRY_NOTFOUND
;
251 ULONG nIndex
= Container::GetPos( p
);
253 if ( nIndex
!= CONTAINER_ENTRY_NOTFOUND
)
254 return nIndex
+nStartIndex
;
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
) )
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
);
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
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
);
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();
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();
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()
383 while ( !p
&& (Container::GetCurPos() < (Container::GetSize()-1)) )
384 p
= Container::Next();
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()
403 while ( !p
&& Container::GetCurPos() )
404 p
= Container::Prev();
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
;
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
)) )
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();
470 pEle
= (ImpUniqueId
*)Next();
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();
496 pEle
= (ImpUniqueId
*)Next();
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();
520 if ( pId
->nRefCount
<= nFree
)
522 ((ImpUniqueId
*)Remove( pId
->nId
))->Release();
524 pId
= (ImpUniqueId
*)Last();
526 pId
= (ImpUniqueId
*)Prev();
530 pId
= (ImpUniqueId
*)Prev();
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 )
555 ImpUniqueId
* pId
= new ImpUniqueId
;
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
;
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
) );
598 pId
= new ImpUniqueId
;
600 pId
->nId
= Insert( pId
);
602 while( pId
->nId
!= nId
);
603 return UniqueItemId( pId
);