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 #ifndef _INDEX_HXX 24 #define _INDEX_HXX 25 26 #include <limits.h> 27 #include <tools/solar.h> 28 #include <tools/rtti.hxx> // for RTTI of SwIndexReg 29 #include <tools/string.hxx> // for xub_StrLen 30 #include <swdllapi.h> 31 32 #define INVALID_INDEX STRING_NOTFOUND 33 34 // Maximale Anzahl von Indizies im IndexArray (zum Abtesten auf Ueberlaeufe) 35 class SwIndex; 36 class SwIndexReg; 37 struct SwPosition; 38 39 #ifndef DBG_UTIL 40 #define INLINE inline 41 #else 42 #define INLINE 43 #endif 44 45 class SW_DLLPUBLIC SwIndex 46 { 47 friend class SwIndexReg; 48 49 #ifdef DBG_UTIL 50 static int nSerial; 51 int MySerial; 52 #endif 53 54 xub_StrLen nIndex; 55 SwIndexReg* pArray; 56 SwIndex *pNext, *pPrev; 57 58 SwIndex& ChgValue( const SwIndex& rIdx, xub_StrLen nNewValue ); 59 void Remove(); // Ausketten 60 61 public: 62 explicit SwIndex(SwIndexReg *const pReg, xub_StrLen const nIdx = 0); 63 SwIndex( const SwIndex & ); 64 SwIndex( const SwIndex &, short nDiff ); 65 ~SwIndex() { Remove(); } 66 67 INLINE xub_StrLen operator++(); 68 INLINE xub_StrLen operator--(); 69 #ifndef CFRONT 70 INLINE xub_StrLen operator++(int); 71 INLINE xub_StrLen operator--(int); 72 #endif 73 74 INLINE xub_StrLen operator+=( xub_StrLen ); 75 INLINE xub_StrLen operator-=( xub_StrLen ); 76 INLINE xub_StrLen operator+=( const SwIndex& ); 77 INLINE xub_StrLen operator-=( const SwIndex& ); 78 79 INLINE sal_Bool operator<( const SwIndex& ) const; 80 INLINE sal_Bool operator<=( const SwIndex& ) const; 81 INLINE sal_Bool operator>( const SwIndex& ) const; 82 INLINE sal_Bool operator>=( const SwIndex& ) const; 83 sal_Bool operator==( const SwIndex& rSwIndex ) const 84 { return (nIndex == rSwIndex.nIndex) && (pArray == rSwIndex.pArray); } 85 86 sal_Bool operator!=( const SwIndex& rSwIndex ) const 87 { return (nIndex != rSwIndex.nIndex) || (pArray != rSwIndex.pArray); } 88 89 sal_Bool operator<( xub_StrLen nWert ) const { return nIndex < nWert; } 90 sal_Bool operator<=( xub_StrLen nWert ) const { return nIndex <= nWert; } 91 sal_Bool operator>( xub_StrLen nWert ) const { return nIndex > nWert; } 92 sal_Bool operator>=( xub_StrLen nWert ) const { return nIndex >= nWert; } 93 sal_Bool operator==( xub_StrLen nWert ) const { return nIndex == nWert; } 94 sal_Bool operator!=( xub_StrLen nWert ) const { return nIndex != nWert; } 95 96 INLINE SwIndex& operator=( xub_StrLen ); 97 SwIndex& operator=( const SwIndex & ); 98 99 // gebe den Wert vom Index als xub_StrLen zurueck 100 xub_StrLen GetIndex() const { return nIndex; } 101 102 // ermoeglicht Zuweisungen ohne Erzeugen eines temporaeren 103 // Objektes 104 SwIndex &Assign(SwIndexReg *,xub_StrLen); 105 106 // Herausgabe des Pointers auf das IndexArray, 107 // (fuers RTTI am SwIndexReg) 108 const SwIndexReg* GetIdxReg() const { return pArray; } 109 }; 110 111 #undef INLINE 112 113 class SwIndexReg 114 { 115 friend class SwIndex; 116 friend bool lcl_PosOk(const SwPosition & aPos); 117 118 const SwIndex *pFirst, *pLast, *pMiddle; 119 120 // ein globales Array, in das Indizies verschoben werden, die mal 121 // temporaer "ausgelagert" werden muessen; oder die zum Zeitpunkt des 122 // anlegens kein gueltiges Array kennen (SwPaM/SwPosition!) 123 friend void _InitCore(); 124 friend void _FinitCore(); 125 static SwIndexReg* pEmptyIndexArray; 126 127 protected: 128 virtual void Update( SwIndex const & rPos, const xub_StrLen nChangeLen, 129 const bool bNegative = false, const bool bDelete = false ); 130 131 void ChkArr(); 132 133 sal_Bool HasAnyIndex() const { return 0 != pFirst; } 134 135 public: 136 SwIndexReg(); 137 virtual ~SwIndexReg(); 138 139 // rtti, abgeleitete moegens gleichtun oder nicht. Wenn sie es gleichtun 140 // kann ueber das SwIndexReg typsicher gecastet werden. 141 TYPEINFO(); 142 143 void MoveTo( SwIndexReg& rArr ); 144 }; 145 146 #ifndef DBG_UTIL 147 148 inline xub_StrLen SwIndex::operator++() 149 { 150 return ChgValue( *this, nIndex+1 ).nIndex; 151 } 152 inline xub_StrLen SwIndex::operator--() 153 { 154 return ChgValue( *this, nIndex-1 ).nIndex; 155 } 156 #ifndef CFRONT 157 inline xub_StrLen SwIndex::operator++(int) 158 { 159 xub_StrLen nOldIndex = nIndex; 160 ChgValue( *this, nIndex+1 ); 161 return nOldIndex; 162 } 163 inline xub_StrLen SwIndex::operator--(int) 164 { 165 xub_StrLen nOldIndex = nIndex; 166 ChgValue( *this, nIndex-1 ); 167 return nOldIndex; 168 } 169 #endif 170 171 inline xub_StrLen SwIndex::operator+=( xub_StrLen nWert ) 172 { 173 return ChgValue( *this, nIndex + nWert ).nIndex; 174 } 175 inline xub_StrLen SwIndex::operator-=( xub_StrLen nWert ) 176 { 177 return ChgValue( *this, nIndex - nWert ).nIndex; 178 } 179 inline xub_StrLen SwIndex::operator+=( const SwIndex& rIndex ) 180 { 181 return ChgValue( *this, nIndex + rIndex.nIndex ).nIndex; 182 } 183 inline xub_StrLen SwIndex::operator-=( const SwIndex& rIndex ) 184 { 185 return ChgValue( *this, nIndex - rIndex.nIndex ).nIndex; 186 } 187 188 inline sal_Bool SwIndex::operator<( const SwIndex& rIndex ) const 189 { 190 return nIndex < rIndex.nIndex; 191 } 192 inline sal_Bool SwIndex::operator<=( const SwIndex& rIndex ) const 193 { 194 return nIndex <= rIndex.nIndex; 195 } 196 inline sal_Bool SwIndex::operator>( const SwIndex& rIndex ) const 197 { 198 return nIndex > rIndex.nIndex; 199 } 200 inline sal_Bool SwIndex::operator>=( const SwIndex& rIndex ) const 201 { 202 return nIndex >= rIndex.nIndex; 203 } 204 inline SwIndex& SwIndex::operator=( xub_StrLen nWert ) 205 { 206 if( nIndex != nWert ) 207 ChgValue( *this, nWert ); 208 return *this; 209 } 210 211 #endif // PRODUCT 212 213 #endif 214