source: OGRE/trunk/ogrenew/Tools/LightwaveConverter/include/BitArray.h @ 692

Revision 692, 2.6 KB checked in by mattausch, 18 years ago (diff)

adding ogre 1.2 and dependencies

Line 
1#ifndef _BITARRAY_H_
2#define _BITARRAY_H_
3
4class BitArray
5{
6private:
7/** The number of bits in this array
8        */
9        unsigned long arraysize;
10        /** The number of unsigned longs for storing at least arraysize bits
11        */
12        unsigned long bitlongs;
13        /** The array of unsigned longs containing the bits
14        */
15        unsigned long *bits;
16public:
17/** Constructors.
18    */
19        BitArray(unsigned long newsize);
20        BitArray(const BitArray& b);
21       
22        BitArray(unsigned long newsize, bool setclear);
23        BitArray(unsigned long newsize, unsigned long *newbits);
24       
25    /** Destructor.
26    */
27        ~BitArray();
28       
29        BitArray& operator =(const BitArray& b);
30        BitArray operator ~(void);
31        BitArray& operator ^=(const BitArray& b);
32        BitArray& operator &=(const BitArray& b);
33        BitArray& operator |=(const BitArray& b);
34        BitArray operator ^(const BitArray& b);
35        BitArray operator &(const BitArray& b);
36        BitArray operator |(const BitArray& b);
37       
38        /** Test to see if a single bit is set.
39        */
40        inline bool bitSet(unsigned long index) const
41        {
42                return bits[(index>>5)] >> (index & 0x0000001f) & 0x00000001;
43        }
44        /** Clear all bits in this array.
45        */
46        inline void clear(void)
47        {
48                fillBitArray(0x00000000);
49        }
50        /** Clear a single bit.
51        */
52        inline void clearBit(unsigned long index)
53        {
54                bits[index >> 5] &= ~(0x00000001 << (index & 0x0000001f));
55        }
56        /** fill with a 32-bit pattern.
57        */
58        inline void fillBitArray(unsigned long pattern)
59        {
60                for (unsigned long i=0; i < bitlongs; bits[i++]=pattern);
61        }
62
63        /** flip a single bit.
64        */
65        inline void flipBit(unsigned long index)
66        {
67                if (bitSet(index))
68                        clearBit(index);
69                else
70                        setBit(index);
71        };
72
73        /** Returns index of next set bit in array (wraps around)
74    */
75        inline long getNextSet(unsigned long index)
76        {
77                unsigned long i;
78                for (i=index+1;i<arraysize;i++) if (bitSet(i)) return i;
79                for (i=0;i<index-1;i++) if (bitSet(i)) return i;
80                return -1;
81        }
82       
83        /** Returns index of previous set bit in array (wraps around)
84    */
85        inline long getPreviousSet(unsigned long index)
86        {
87                unsigned long i;
88                if (index != 0)
89                {
90                        for (i=index-1;i>0;i--) if (bitSet(i)) return i;
91                        if (bitSet(0)) return 0;
92                }
93                for (i=arraysize-1;i>index;i--) if (bitSet(i)) return i;
94                return -1;
95        }
96       
97        /** Set all bits in this array.
98        */
99        inline void set(void)
100        {
101                fillBitArray(0xffffffff);
102        }
103       
104        /** Set a single bit.
105        */
106        inline void setBit(unsigned long index)
107        {
108                bits[index >> 5] |= 0x00000001 << (index & 0x0000001f);
109        }
110       
111        /** return the number of bits in this bit array..
112        */
113        inline unsigned long size(void)
114        {
115                return arraysize;
116        }
117};
118
119#endif // _BITARRAY_H_
120
Note: See TracBrowser for help on using the repository browser.