1 /************************************************************** 2 * 3 * Licensed to the Apache Software Foundation (ASF) under one 4 * or more contributor license agreements. See the NOTICE file 5 * distributed with this work for additional information 6 * regarding copyright ownership. The ASF licenses this file 7 * to you under the Apache License, Version 2.0 (the 8 * "License"); you may not use this file except in compliance 9 * with the License. You may obtain a copy of the License at 10 * 11 * http://www.apache.org/licenses/LICENSE-2.0 12 * 13 * Unless required by applicable law or agreed to in writing, 14 * software distributed under the License is distributed on an 15 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 16 * KIND, either express or implied. See the License for the 17 * specific language governing permissions and limitations 18 * under the License. 19 * 20 *************************************************************/ 21 22 23 24 #ifndef _IMPCONT_HXX 25 #define _IMPCONT_HXX 26 27 #include <tools/tools.h> 28 #include <tools/contnr.hxx> 29 30 typedef void* PVOID; 31 32 // ---------- 33 // - CBlock - 34 // ---------- 35 36 class CBlock 37 { 38 private: 39 CBlock* pPrev; // Vorheriger Block 40 CBlock* pNext; // Naechster Block 41 sal_uInt16 nSize; // Groesse des Blocks 42 sal_uInt16 nCount; // Anzahl Pointer 43 void** pNodes; // Pointer auf die Daten 44 45 #if defined DBG_UTIL 46 static char const * DbgCheckCBlock(void const *); 47 #endif 48 49 public: 50 // Fuer List-Container 51 CBlock( sal_uInt16 nSize, CBlock* pPrev, CBlock* pNext ); 52 // Fuer Array-Container 53 CBlock( sal_uInt16 nSize, CBlock* pPrev ); 54 // Copy-Ctor 55 CBlock( const CBlock& r, CBlock* pPrev ); 56 ~CBlock(); 57 58 void Insert( void* p, sal_uInt16 nIndex, sal_uInt16 nReSize ); 59 CBlock* Split( void* p, sal_uInt16 nIndex, sal_uInt16 nReSize ); 60 void* Remove( sal_uInt16 nIndex, sal_uInt16 nReSize ); 61 void* Replace( void* pNew, sal_uInt16 nIndex ); 62 63 void** GetNodes() const { return pNodes; } 64 void** GetObjectPtr( sal_uInt16 nIndex ); 65 void* GetObject( sal_uInt16 nIndex ) const; 66 67 void SetSize( sal_uInt16 nNewSize ); 68 69 sal_uInt16 GetSize() const { return nCount; } 70 sal_uInt16 Count() const { return nCount; } 71 void SetPrevBlock( CBlock* p ) { pPrev = p; } 72 void SetNextBlock( CBlock* p ) { pNext = p; } 73 CBlock* GetPrevBlock() const { return pPrev; } 74 CBlock* GetNextBlock() const { return pNext; } 75 void Reset() { nCount = 0; } 76 77 private: 78 CBlock( const CBlock& r ); 79 80 friend class Container; 81 }; 82 83 /************************************************************************* 84 |* 85 |* CBlock::GetObject() 86 |* 87 |* Beschreibung Gibt einen Pointer aus dem Block zurueck 88 |* Ersterstellung TH 17.09.91 89 |* Letzte Aenderung TH 17.09.91 90 |* 91 *************************************************************************/ 92 93 inline void* CBlock::GetObject( sal_uInt16 nIndex ) const 94 { 95 return pNodes[nIndex]; 96 } 97 98 /************************************************************************* 99 |* 100 |* Container::ImpGetObject() 101 |* 102 |* Beschreibung Wir gehen davon aus, das Pointer in der Regel 103 |* sich im ersten Block befindet und schalten 104 |* deshalb eine Inline-Methode davor 105 |* Ersterstellung TH 02.07.93 106 |* Letzte Aenderung TH 02.07.93 107 |* 108 *************************************************************************/ 109 110 inline void* Container::ImpGetObject( sal_uIntPtr nIndex ) const 111 { 112 if ( pFirstBlock && (nIndex < pFirstBlock->Count()) ) 113 // Item innerhalb des gefundenen Blocks zurueckgeben 114 return pFirstBlock->GetObject( (sal_uInt16)nIndex ); 115 else 116 return GetObject( nIndex ); 117 } 118 119 /************************************************************************* 120 |* 121 |* Container::ImpGetOnlyNodes() 122 |* 123 |* Beschreibung Wenn es nur einen Block gibt, wird davon 124 |* das Daten-Array zurueckgegeben 125 |* Ersterstellung TH 24.01.96 126 |* Letzte Aenderung TH 24.01.96 127 |* 128 *************************************************************************/ 129 130 // #i70651#: Prevent warnings on Mac OS X 131 #ifdef MACOSX 132 #pragma GCC system_header 133 #endif 134 135 inline void** Container::ImpGetOnlyNodes() const 136 { 137 if ( (pFirstBlock == pLastBlock) && pFirstBlock ) 138 return pFirstBlock->GetNodes(); 139 else 140 return NULL; 141 } 142 143 #endif // _IMPCONT_HXX 144