xref: /AOO41X/main/sw/inc/index.hxx (revision 0aabba3ab117bd1ebf1560f23f52dfa1a54fd4c7)
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