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