xref: /aoo41x/main/sfx2/inc/bitset.hxx (revision cdf0e10c)
1*cdf0e10cSrcweir /*************************************************************************
2*cdf0e10cSrcweir  *
3*cdf0e10cSrcweir  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4*cdf0e10cSrcweir  *
5*cdf0e10cSrcweir  * Copyright 2000, 2010 Oracle and/or its affiliates.
6*cdf0e10cSrcweir  *
7*cdf0e10cSrcweir  * OpenOffice.org - a multi-platform office productivity suite
8*cdf0e10cSrcweir  *
9*cdf0e10cSrcweir  * This file is part of OpenOffice.org.
10*cdf0e10cSrcweir  *
11*cdf0e10cSrcweir  * OpenOffice.org is free software: you can redistribute it and/or modify
12*cdf0e10cSrcweir  * it under the terms of the GNU Lesser General Public License version 3
13*cdf0e10cSrcweir  * only, as published by the Free Software Foundation.
14*cdf0e10cSrcweir  *
15*cdf0e10cSrcweir  * OpenOffice.org is distributed in the hope that it will be useful,
16*cdf0e10cSrcweir  * but WITHOUT ANY WARRANTY; without even the implied warranty of
17*cdf0e10cSrcweir  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18*cdf0e10cSrcweir  * GNU Lesser General Public License version 3 for more details
19*cdf0e10cSrcweir  * (a copy is included in the LICENSE file that accompanied this code).
20*cdf0e10cSrcweir  *
21*cdf0e10cSrcweir  * You should have received a copy of the GNU Lesser General Public License
22*cdf0e10cSrcweir  * version 3 along with OpenOffice.org.  If not, see
23*cdf0e10cSrcweir  * <http://www.openoffice.org/license.html>
24*cdf0e10cSrcweir  * for a copy of the LGPLv3 License.
25*cdf0e10cSrcweir  *
26*cdf0e10cSrcweir  ************************************************************************/
27*cdf0e10cSrcweir #ifndef _SFXBITSET_HXX
28*cdf0e10cSrcweir #define _SFXBITSET_HXX
29*cdf0e10cSrcweir 
30*cdf0e10cSrcweir #include <tools/solar.h>
31*cdf0e10cSrcweir 
32*cdf0e10cSrcweir class Range;
33*cdf0e10cSrcweir 
34*cdf0e10cSrcweir class BitSet
35*cdf0e10cSrcweir {
36*cdf0e10cSrcweir private:
37*cdf0e10cSrcweir 	void CopyFrom( const BitSet& rSet );
38*cdf0e10cSrcweir 	sal_uInt16 nBlocks;
39*cdf0e10cSrcweir 	sal_uInt16 nCount;
40*cdf0e10cSrcweir 	sal_uIntPtr* pBitmap;
41*cdf0e10cSrcweir public:
42*cdf0e10cSrcweir 	BitSet operator<<( sal_uInt16 nOffset ) const;
43*cdf0e10cSrcweir 	BitSet operator>>( sal_uInt16 nOffset ) const;
44*cdf0e10cSrcweir 	static sal_uInt16 CountBits( sal_uIntPtr nBits );
45*cdf0e10cSrcweir 	sal_Bool operator!() const;
46*cdf0e10cSrcweir 	BitSet();
47*cdf0e10cSrcweir 	BitSet( const BitSet& rOrig );
48*cdf0e10cSrcweir 	BitSet( sal_uInt16* pArray, sal_uInt16 nSize );
49*cdf0e10cSrcweir 	~BitSet();
50*cdf0e10cSrcweir 	BitSet( const Range& rRange );
51*cdf0e10cSrcweir 	sal_uInt16 Count() const;
52*cdf0e10cSrcweir 	BitSet& operator=( const BitSet& rOrig );
53*cdf0e10cSrcweir 	BitSet& operator=( sal_uInt16 nBit );
54*cdf0e10cSrcweir 	BitSet operator|( const BitSet& rSet ) const;
55*cdf0e10cSrcweir 	BitSet operator|( sal_uInt16 nBit ) const;
56*cdf0e10cSrcweir 	BitSet& operator|=( const BitSet& rSet );
57*cdf0e10cSrcweir 	BitSet& operator|=( sal_uInt16 nBit );
58*cdf0e10cSrcweir 	BitSet operator-( const BitSet& rSet ) const;
59*cdf0e10cSrcweir 	BitSet operator-( sal_uInt16 nId ) const;
60*cdf0e10cSrcweir 	BitSet& operator-=( const BitSet& rSet );
61*cdf0e10cSrcweir 	BitSet& operator-=( sal_uInt16 nBit );
62*cdf0e10cSrcweir 	BitSet operator&( const BitSet& rSet ) const;
63*cdf0e10cSrcweir 	BitSet& operator&=( const BitSet& rSet );
64*cdf0e10cSrcweir 	BitSet operator^( const BitSet& rSet ) const;
65*cdf0e10cSrcweir 	BitSet operator^( sal_uInt16 nBit ) const;
66*cdf0e10cSrcweir 	BitSet& operator^=( const BitSet& rSet );
67*cdf0e10cSrcweir 	BitSet& operator^=( sal_uInt16 nBit );
68*cdf0e10cSrcweir 	sal_Bool IsRealSubSet( const BitSet& rSet ) const;
69*cdf0e10cSrcweir 	sal_Bool IsSubSet( const BitSet& rSet ) const;
70*cdf0e10cSrcweir 	sal_Bool IsRealSuperSet( const BitSet& rSet ) const;
71*cdf0e10cSrcweir 	sal_Bool Contains( sal_uInt16 nBit ) const;
72*cdf0e10cSrcweir 	sal_Bool IsSuperSet( const BitSet& rSet ) const;
73*cdf0e10cSrcweir 	sal_Bool operator==( const BitSet& rSet ) const;
74*cdf0e10cSrcweir 	sal_Bool operator==( sal_uInt16 nBit ) const;
75*cdf0e10cSrcweir 	sal_Bool operator!=( const BitSet& rSet ) const;
76*cdf0e10cSrcweir 	sal_Bool operator!=( sal_uInt16 nBit ) const;
77*cdf0e10cSrcweir 
78*cdf0e10cSrcweir };
79*cdf0e10cSrcweir //--------------------------------------------------------------------
80*cdf0e10cSrcweir 
81*cdf0e10cSrcweir // returns sal_True if the set is empty
82*cdf0e10cSrcweir 
83*cdf0e10cSrcweir 
84*cdf0e10cSrcweir 
85*cdf0e10cSrcweir inline sal_Bool BitSet::operator!() const
86*cdf0e10cSrcweir {
87*cdf0e10cSrcweir 	return nCount == 0;
88*cdf0e10cSrcweir }
89*cdf0e10cSrcweir //--------------------------------------------------------------------
90*cdf0e10cSrcweir 
91*cdf0e10cSrcweir // returns the number of bits in the bitset
92*cdf0e10cSrcweir 
93*cdf0e10cSrcweir inline sal_uInt16 BitSet::Count() const
94*cdf0e10cSrcweir {
95*cdf0e10cSrcweir 	return nCount;
96*cdf0e10cSrcweir }
97*cdf0e10cSrcweir //--------------------------------------------------------------------
98*cdf0e10cSrcweir 
99*cdf0e10cSrcweir // creates the union of two bitset
100*cdf0e10cSrcweir 
101*cdf0e10cSrcweir inline BitSet BitSet::operator|( const BitSet& rSet ) const
102*cdf0e10cSrcweir {
103*cdf0e10cSrcweir 	return BitSet(*this) |= rSet;
104*cdf0e10cSrcweir }
105*cdf0e10cSrcweir //--------------------------------------------------------------------
106*cdf0e10cSrcweir 
107*cdf0e10cSrcweir // creates the union of a bitset with a single bit
108*cdf0e10cSrcweir 
109*cdf0e10cSrcweir inline BitSet BitSet::operator|( sal_uInt16 nBit ) const
110*cdf0e10cSrcweir {
111*cdf0e10cSrcweir 	return BitSet(*this) |= nBit;
112*cdf0e10cSrcweir }
113*cdf0e10cSrcweir //--------------------------------------------------------------------
114*cdf0e10cSrcweir 
115*cdf0e10cSrcweir // creates the asymetric difference
116*cdf0e10cSrcweir 
117*cdf0e10cSrcweir inline BitSet BitSet::operator-( const BitSet& ) const
118*cdf0e10cSrcweir {
119*cdf0e10cSrcweir 	return BitSet();
120*cdf0e10cSrcweir }
121*cdf0e10cSrcweir //--------------------------------------------------------------------
122*cdf0e10cSrcweir 
123*cdf0e10cSrcweir // creates the asymetric difference with a single bit
124*cdf0e10cSrcweir 
125*cdf0e10cSrcweir 
126*cdf0e10cSrcweir inline BitSet BitSet::operator-( sal_uInt16 ) const
127*cdf0e10cSrcweir {
128*cdf0e10cSrcweir 	return BitSet();
129*cdf0e10cSrcweir }
130*cdf0e10cSrcweir //--------------------------------------------------------------------
131*cdf0e10cSrcweir 
132*cdf0e10cSrcweir // removes the bits contained in rSet
133*cdf0e10cSrcweir 
134*cdf0e10cSrcweir inline BitSet& BitSet::operator-=( const BitSet& )
135*cdf0e10cSrcweir {
136*cdf0e10cSrcweir 	return *this;
137*cdf0e10cSrcweir }
138*cdf0e10cSrcweir //--------------------------------------------------------------------
139*cdf0e10cSrcweir 
140*cdf0e10cSrcweir 
141*cdf0e10cSrcweir // creates the intersection with another bitset
142*cdf0e10cSrcweir 
143*cdf0e10cSrcweir inline BitSet BitSet::operator&( const BitSet& ) const
144*cdf0e10cSrcweir {
145*cdf0e10cSrcweir 	return BitSet();
146*cdf0e10cSrcweir }
147*cdf0e10cSrcweir //--------------------------------------------------------------------
148*cdf0e10cSrcweir 
149*cdf0e10cSrcweir // intersects with another bitset
150*cdf0e10cSrcweir 
151*cdf0e10cSrcweir inline BitSet& BitSet::operator&=( const BitSet& )
152*cdf0e10cSrcweir {
153*cdf0e10cSrcweir 	return *this;
154*cdf0e10cSrcweir }
155*cdf0e10cSrcweir //--------------------------------------------------------------------
156*cdf0e10cSrcweir 
157*cdf0e10cSrcweir // creates the symetric difference with another bitset
158*cdf0e10cSrcweir 
159*cdf0e10cSrcweir inline BitSet BitSet::operator^( const BitSet& ) const
160*cdf0e10cSrcweir {
161*cdf0e10cSrcweir 	return BitSet();
162*cdf0e10cSrcweir }
163*cdf0e10cSrcweir //--------------------------------------------------------------------
164*cdf0e10cSrcweir 
165*cdf0e10cSrcweir // creates the symetric difference with a single bit
166*cdf0e10cSrcweir 
167*cdf0e10cSrcweir inline BitSet BitSet::operator^( sal_uInt16 ) const
168*cdf0e10cSrcweir {
169*cdf0e10cSrcweir 	return BitSet();
170*cdf0e10cSrcweir }
171*cdf0e10cSrcweir //--------------------------------------------------------------------
172*cdf0e10cSrcweir 
173*cdf0e10cSrcweir // builds the symetric difference with another bitset
174*cdf0e10cSrcweir 
175*cdf0e10cSrcweir inline BitSet& BitSet::operator^=( const BitSet& )
176*cdf0e10cSrcweir {
177*cdf0e10cSrcweir 	return *this;
178*cdf0e10cSrcweir }
179*cdf0e10cSrcweir //--------------------------------------------------------------------
180*cdf0e10cSrcweir #ifdef BITSET_READY
181*cdf0e10cSrcweir // builds the symetric difference with a single bit
182*cdf0e10cSrcweir 
183*cdf0e10cSrcweir inline BitSet& BitSet::operator^=( sal_uInt16 )
184*cdf0e10cSrcweir {
185*cdf0e10cSrcweir 	// crash!!!
186*cdf0e10cSrcweir 	return BitSet();
187*cdf0e10cSrcweir }
188*cdf0e10cSrcweir #endif
189*cdf0e10cSrcweir //--------------------------------------------------------------------
190*cdf0e10cSrcweir 
191*cdf0e10cSrcweir // determines if the other bitset is a real superset
192*cdf0e10cSrcweir 
193*cdf0e10cSrcweir inline sal_Bool BitSet::IsRealSubSet( const BitSet& ) const
194*cdf0e10cSrcweir {
195*cdf0e10cSrcweir 	return sal_False;
196*cdf0e10cSrcweir }
197*cdf0e10cSrcweir //--------------------------------------------------------------------
198*cdf0e10cSrcweir 
199*cdf0e10cSrcweir // detsermines if the other bitset is a superset or equal
200*cdf0e10cSrcweir 
201*cdf0e10cSrcweir inline sal_Bool BitSet::IsSubSet( const BitSet& ) const
202*cdf0e10cSrcweir {
203*cdf0e10cSrcweir 	return sal_False;
204*cdf0e10cSrcweir }
205*cdf0e10cSrcweir //--------------------------------------------------------------------
206*cdf0e10cSrcweir 
207*cdf0e10cSrcweir // determines if the other bitset is a real subset
208*cdf0e10cSrcweir 
209*cdf0e10cSrcweir inline sal_Bool BitSet::IsRealSuperSet( const BitSet& ) const
210*cdf0e10cSrcweir {
211*cdf0e10cSrcweir 	return sal_False;
212*cdf0e10cSrcweir }
213*cdf0e10cSrcweir 
214*cdf0e10cSrcweir //--------------------------------------------------------------------
215*cdf0e10cSrcweir 
216*cdf0e10cSrcweir // determines if the other bitset is a subset or equal
217*cdf0e10cSrcweir 
218*cdf0e10cSrcweir inline sal_Bool BitSet::IsSuperSet( const BitSet& ) const
219*cdf0e10cSrcweir {
220*cdf0e10cSrcweir 	return sal_False;
221*cdf0e10cSrcweir }
222*cdf0e10cSrcweir //--------------------------------------------------------------------
223*cdf0e10cSrcweir 
224*cdf0e10cSrcweir // determines if the bit is the only one in the bitset
225*cdf0e10cSrcweir 
226*cdf0e10cSrcweir inline sal_Bool BitSet::operator==( sal_uInt16 ) const
227*cdf0e10cSrcweir {
228*cdf0e10cSrcweir 	return sal_False;
229*cdf0e10cSrcweir }
230*cdf0e10cSrcweir //--------------------------------------------------------------------
231*cdf0e10cSrcweir 
232*cdf0e10cSrcweir // determines if the bitsets aren't equal
233*cdf0e10cSrcweir 
234*cdf0e10cSrcweir inline sal_Bool BitSet::operator!=( const BitSet& rSet ) const
235*cdf0e10cSrcweir {
236*cdf0e10cSrcweir 	return !( *this == rSet );
237*cdf0e10cSrcweir }
238*cdf0e10cSrcweir //--------------------------------------------------------------------
239*cdf0e10cSrcweir 
240*cdf0e10cSrcweir // determines if the bitset doesn't contain only this bit
241*cdf0e10cSrcweir 
242*cdf0e10cSrcweir inline sal_Bool BitSet::operator!=( sal_uInt16 nBit ) const
243*cdf0e10cSrcweir {
244*cdf0e10cSrcweir 	return !( *this == nBit );
245*cdf0e10cSrcweir }
246*cdf0e10cSrcweir //--------------------------------------------------------------------
247*cdf0e10cSrcweir 
248*cdf0e10cSrcweir class IndexBitSet : BitSet
249*cdf0e10cSrcweir {
250*cdf0e10cSrcweir public:
251*cdf0e10cSrcweir   sal_uInt16 GetFreeIndex();
252*cdf0e10cSrcweir   void ReleaseIndex(sal_uInt16 i){*this-=i;}
253*cdf0e10cSrcweir };
254*cdf0e10cSrcweir 
255*cdf0e10cSrcweir 
256*cdf0e10cSrcweir #endif
257*cdf0e10cSrcweir 
258