xref: /aosp_15_r20/external/antlr/runtime/Cpp/include/antlr3bitset.inl (revision 16467b971bd3e2009fad32dd79016f2c7e421deb)
1*16467b97STreehugger RobotANTLR_BEGIN_NAMESPACE()
2*16467b97STreehugger Robot
3*16467b97STreehugger Robottemplate <class ImplTraits>
4*16467b97STreehugger RobotANTLR_INLINE BitsetList<ImplTraits>::BitsetList()
5*16467b97STreehugger Robot{
6*16467b97STreehugger Robot	m_bits = NULL;
7*16467b97STreehugger Robot	m_length  = 0;
8*16467b97STreehugger Robot}
9*16467b97STreehugger Robot
10*16467b97STreehugger Robottemplate <class ImplTraits>
11*16467b97STreehugger RobotANTLR_INLINE BitsetList<ImplTraits>::BitsetList( ANTLR_BITWORD* bits, ANTLR_UINT32 length )
12*16467b97STreehugger Robot{
13*16467b97STreehugger Robot	m_bits = bits;
14*16467b97STreehugger Robot	m_length  = length;
15*16467b97STreehugger Robot}
16*16467b97STreehugger Robot
17*16467b97STreehugger Robottemplate <class ImplTraits>
18*16467b97STreehugger RobotANTLR_INLINE ANTLR_BITWORD* BitsetList<ImplTraits>::get_bits() const
19*16467b97STreehugger Robot{
20*16467b97STreehugger Robot	return m_bits;
21*16467b97STreehugger Robot}
22*16467b97STreehugger Robot
23*16467b97STreehugger Robottemplate <class ImplTraits>
24*16467b97STreehugger RobotANTLR_INLINE ANTLR_UINT32 BitsetList<ImplTraits>::get_length() const
25*16467b97STreehugger Robot{
26*16467b97STreehugger Robot	return m_length;
27*16467b97STreehugger Robot}
28*16467b97STreehugger Robot
29*16467b97STreehugger Robottemplate <class ImplTraits>
30*16467b97STreehugger RobotANTLR_INLINE void BitsetList<ImplTraits>::set_bits( ANTLR_BITWORD* bits )
31*16467b97STreehugger Robot{
32*16467b97STreehugger Robot	m_bits = bits;
33*16467b97STreehugger Robot}
34*16467b97STreehugger Robot
35*16467b97STreehugger Robottemplate <class ImplTraits>
36*16467b97STreehugger RobotANTLR_INLINE void BitsetList<ImplTraits>::set_length( ANTLR_UINT32 length )
37*16467b97STreehugger Robot{
38*16467b97STreehugger Robot	m_length = length;
39*16467b97STreehugger Robot}
40*16467b97STreehugger Robot
41*16467b97STreehugger Robottemplate <class ImplTraits>
42*16467b97STreehugger Robottypename BitsetList<ImplTraits>::BitsetType* BitsetList<ImplTraits>::bitsetLoad()
43*16467b97STreehugger Robot{
44*16467b97STreehugger Robot	// Allocate memory for the bitset structure itself
45*16467b97STreehugger Robot	// the input parameter is the bit number (0 based)
46*16467b97STreehugger Robot	// to include in the bitset, so we need at at least
47*16467b97STreehugger Robot	// bit + 1 bits. If any arguments indicate a
48*16467b97STreehugger Robot	// a bit higher than the default number of bits (0 means default size)
49*16467b97STreehugger Robot	// then Add() will take care
50*16467b97STreehugger Robot	// of it.
51*16467b97STreehugger Robot	//
52*16467b97STreehugger Robot	BitsetType* bitset  = new BitsetType();
53*16467b97STreehugger Robot
54*16467b97STreehugger Robot	if	(this != NULL)
55*16467b97STreehugger Robot	{
56*16467b97STreehugger Robot		// Now we can add the element bits into the set
57*16467b97STreehugger Robot		//
58*16467b97STreehugger Robot		ANTLR_UINT32 count=0;
59*16467b97STreehugger Robot		while (count < m_length)
60*16467b97STreehugger Robot		{
61*16467b97STreehugger Robot			if( bitset->get_blist().get_length() <= count)
62*16467b97STreehugger Robot				bitset->grow(count+1);
63*16467b97STreehugger Robot
64*16467b97STreehugger Robot			typename ImplTraits::BitsetListType& blist = bitset->get_blist();
65*16467b97STreehugger Robot			blist.m_bits[count] = *(m_bits+count);
66*16467b97STreehugger Robot			count++;
67*16467b97STreehugger Robot		}
68*16467b97STreehugger Robot	}
69*16467b97STreehugger Robot
70*16467b97STreehugger Robot	// return the new bitset
71*16467b97STreehugger Robot	//
72*16467b97STreehugger Robot	return  bitset;
73*16467b97STreehugger Robot}
74*16467b97STreehugger Robot
75*16467b97STreehugger Robottemplate <class ImplTraits>
76*16467b97STreehugger Robottypename BitsetList<ImplTraits>::BitsetType* BitsetList<ImplTraits>::bitsetCopy()
77*16467b97STreehugger Robot{
78*16467b97STreehugger Robot	BitsetType*  bitset;
79*16467b97STreehugger Robot	ANTLR_UINT32 numElements = m_length;
80*16467b97STreehugger Robot
81*16467b97STreehugger Robot    // Avoid memory thrashing at the expense of a few more bytes
82*16467b97STreehugger Robot    //
83*16467b97STreehugger Robot    if	(numElements < 8)
84*16467b97STreehugger Robot		numElements = 8;
85*16467b97STreehugger Robot
86*16467b97STreehugger Robot    // Allocate memory for the bitset structure itself
87*16467b97STreehugger Robot    //
88*16467b97STreehugger Robot    bitset  = new Bitset<ImplTraits>(numElements);
89*16467b97STreehugger Robot	memcpy(bitset->get_blist().get_bits(), m_bits, numElements * sizeof(ANTLR_BITWORD));
90*16467b97STreehugger Robot
91*16467b97STreehugger Robot    // All seems good
92*16467b97STreehugger Robot    //
93*16467b97STreehugger Robot    return  bitset;
94*16467b97STreehugger Robot}
95*16467b97STreehugger Robot
96*16467b97STreehugger Robottemplate <class ImplTraits>
97*16467b97STreehugger RobotBitset<ImplTraits>::Bitset( ANTLR_UINT32 numBits )
98*16467b97STreehugger Robot{
99*16467b97STreehugger Robot	// Avoid memory thrashing at the up front expense of a few bytes
100*16467b97STreehugger Robot	if	(numBits < (8 * ANTLR_BITSET_BITS))
101*16467b97STreehugger Robot		numBits = 8 * ANTLR_BITSET_BITS;
102*16467b97STreehugger Robot
103*16467b97STreehugger Robot	// No we need to allocate the memory for the number of bits asked for
104*16467b97STreehugger Robot	// in multiples of ANTLR3_UINT64.
105*16467b97STreehugger Robot	//
106*16467b97STreehugger Robot	ANTLR_UINT32 numelements	= ((numBits -1) >> ANTLR_BITSET_LOG_BITS) + 1;
107*16467b97STreehugger Robot
108*16467b97STreehugger Robot	m_blist.set_bits( (ANTLR_BITWORD*) AllocPolicyType::alloc0(numelements * sizeof(ANTLR_BITWORD)));
109*16467b97STreehugger Robot
110*16467b97STreehugger Robot	m_blist.set_length( numelements );
111*16467b97STreehugger Robot}
112*16467b97STreehugger Robot
113*16467b97STreehugger Robottemplate <class ImplTraits>
114*16467b97STreehugger RobotBitset<ImplTraits>::Bitset( const Bitset& bitset )
115*16467b97STreehugger Robot	:m_blist(bitset.m_blist)
116*16467b97STreehugger Robot{
117*16467b97STreehugger Robot}
118*16467b97STreehugger Robot
119*16467b97STreehugger Robottemplate <class ImplTraits>
120*16467b97STreehugger RobotANTLR_INLINE Bitset<ImplTraits>*  Bitset<ImplTraits>::clone() const
121*16467b97STreehugger Robot{
122*16467b97STreehugger Robot	Bitset*  bitset;
123*16467b97STreehugger Robot
124*16467b97STreehugger Robot    // Allocate memory for the bitset structure itself
125*16467b97STreehugger Robot    //
126*16467b97STreehugger Robot    bitset  = new Bitset( ANTLR_BITSET_BITS * m_blist.get_length() );
127*16467b97STreehugger Robot
128*16467b97STreehugger Robot    // Install the actual bits in the source set
129*16467b97STreehugger Robot    //
130*16467b97STreehugger Robot    memcpy(bitset->m_blist.get_bits(), m_blist.get_bits(),
131*16467b97STreehugger Robot				m_blist.get_length() * sizeof(ANTLR_BITWORD) );
132*16467b97STreehugger Robot
133*16467b97STreehugger Robot    // All seems good
134*16467b97STreehugger Robot    //
135*16467b97STreehugger Robot    return  bitset;
136*16467b97STreehugger Robot}
137*16467b97STreehugger Robot
138*16467b97STreehugger Robottemplate <class ImplTraits>
139*16467b97STreehugger RobotBitset<ImplTraits>*  Bitset<ImplTraits>::bor(Bitset* bitset2)
140*16467b97STreehugger Robot{
141*16467b97STreehugger Robot	Bitset*  bitset;
142*16467b97STreehugger Robot
143*16467b97STreehugger Robot    if	(this == NULL)
144*16467b97STreehugger Robot		return bitset2->clone();
145*16467b97STreehugger Robot
146*16467b97STreehugger Robot    if	(bitset2 == NULL)
147*16467b97STreehugger Robot		return	this->clone();
148*16467b97STreehugger Robot
149*16467b97STreehugger Robot    // Allocate memory for the newly ordered bitset structure itself.
150*16467b97STreehugger Robot    //
151*16467b97STreehugger Robot    bitset  = this->clone();
152*16467b97STreehugger Robot    bitset->bitsetORInPlace(bitset2);
153*16467b97STreehugger Robot    return  bitset;
154*16467b97STreehugger Robot}
155*16467b97STreehugger Robot
156*16467b97STreehugger Robottemplate <class ImplTraits>
157*16467b97STreehugger Robotvoid	 Bitset<ImplTraits>::borInPlace(Bitset* bitset2)
158*16467b97STreehugger Robot{
159*16467b97STreehugger Robot	ANTLR_UINT32   minimum;
160*16467b97STreehugger Robot
161*16467b97STreehugger Robot    if	(bitset2 == NULL)
162*16467b97STreehugger Robot		return;
163*16467b97STreehugger Robot
164*16467b97STreehugger Robot	// First make sure that the target bitset is big enough
165*16467b97STreehugger Robot    // for the new bits to be ored in.
166*16467b97STreehugger Robot    //
167*16467b97STreehugger Robot    if	( m_blist.get_length() < bitset2->m_blist.get_length() )
168*16467b97STreehugger Robot		this->growToInclude( bitset2->m_blist.get_length() * sizeof(ANTLR_BITWORD) );
169*16467b97STreehugger Robot
170*16467b97STreehugger Robot    // Or the miniimum number of bits after any resizing went on
171*16467b97STreehugger Robot    //
172*16467b97STreehugger Robot    if	( m_blist.get_length() < bitset2->m_blist.get_length() )
173*16467b97STreehugger Robot		minimum = m_blist.get_length();
174*16467b97STreehugger Robot	else
175*16467b97STreehugger Robot		minimum = bitset2->m_blist.get_length();
176*16467b97STreehugger Robot
177*16467b97STreehugger Robot	ANTLR_BITWORD* bits1 = m_blist.get_bits();
178*16467b97STreehugger Robot	ANTLR_BITWORD* bits2 = bitset2->m_blist.get_bits();
179*16467b97STreehugger Robot	for	(ANTLR_UINT32 i = minimum; i > 0; i--)
180*16467b97STreehugger Robot		bits1[i-1] |= bits2[i-1];
181*16467b97STreehugger Robot}
182*16467b97STreehugger Robot
183*16467b97STreehugger Robottemplate <class ImplTraits>
184*16467b97STreehugger RobotANTLR_UINT32 Bitset<ImplTraits>::size() const
185*16467b97STreehugger Robot{
186*16467b97STreehugger Robot    ANTLR_UINT32   degree;
187*16467b97STreehugger Robot    ANTLR_INT32   i;
188*16467b97STreehugger Robot    ANTLR_INT8    bit;
189*16467b97STreehugger Robot
190*16467b97STreehugger Robot    // TODO: Come back to this, it may be faster to & with 0x01
191*16467b97STreehugger Robot    // then shift right a copy of the 4 bits, than shift left a constant of 1.
192*16467b97STreehugger Robot    // But then again, the optimizer might just work this out
193*16467b97STreehugger Robot    // anyway.
194*16467b97STreehugger Robot    //
195*16467b97STreehugger Robot    degree  = 0;
196*16467b97STreehugger Robot	ANTLR_BITWORD* bits = m_blist.get_bits();
197*16467b97STreehugger Robot    for	(i = m_blist.get_length() - 1; i>= 0; i--)
198*16467b97STreehugger Robot    {
199*16467b97STreehugger Robot		if  (bits[i] != 0)
200*16467b97STreehugger Robot		{
201*16467b97STreehugger Robot			for(bit = ANTLR_BITSET_BITS - 1; bit >= 0; bit--)
202*16467b97STreehugger Robot			{
203*16467b97STreehugger Robot				if((bits[i] & (((ANTLR_BITWORD)1) << bit)) != 0)
204*16467b97STreehugger Robot				{
205*16467b97STreehugger Robot					degree++;
206*16467b97STreehugger Robot				}
207*16467b97STreehugger Robot			}
208*16467b97STreehugger Robot		}
209*16467b97STreehugger Robot    }
210*16467b97STreehugger Robot    return degree;
211*16467b97STreehugger Robot}
212*16467b97STreehugger Robot
213*16467b97STreehugger Robottemplate <class ImplTraits>
214*16467b97STreehugger RobotANTLR_INLINE void	Bitset<ImplTraits>::add(ANTLR_INT32 bit)
215*16467b97STreehugger Robot{
216*16467b97STreehugger Robot	ANTLR_UINT32   word = Bitset::WordNumber(bit);
217*16467b97STreehugger Robot
218*16467b97STreehugger Robot    if	(word	>= m_blist.get_length() )
219*16467b97STreehugger Robot		this->growToInclude(bit);
220*16467b97STreehugger Robot
221*16467b97STreehugger Robot	ANTLR_BITWORD* bits = m_blist.get_bits();
222*16467b97STreehugger Robot	bits[word] |= Bitset::BitMask(bit);
223*16467b97STreehugger Robot}
224*16467b97STreehugger Robot
225*16467b97STreehugger Robottemplate <class ImplTraits>
226*16467b97STreehugger Robotvoid	Bitset<ImplTraits>::grow(ANTLR_INT32 newSize)
227*16467b97STreehugger Robot{
228*16467b97STreehugger Robot	ANTLR_BITWORD*   newBits;
229*16467b97STreehugger Robot
230*16467b97STreehugger Robot    // Space for newly sized bitset - TODO: come back to this and use realloc?, it may
231*16467b97STreehugger Robot    // be more efficient...
232*16467b97STreehugger Robot    //
233*16467b97STreehugger Robot    newBits =  (ANTLR_BITWORD*) AllocPolicyType::alloc0(newSize * sizeof(ANTLR_BITWORD) );
234*16467b97STreehugger Robot    if	( m_blist.get_bits() != NULL)
235*16467b97STreehugger Robot    {
236*16467b97STreehugger Robot		// Copy existing bits
237*16467b97STreehugger Robot		//
238*16467b97STreehugger Robot		memcpy( newBits, m_blist.get_bits(), m_blist.get_length() * sizeof(ANTLR_BITWORD) );
239*16467b97STreehugger Robot
240*16467b97STreehugger Robot		// Out with the old bits... de de de derrr
241*16467b97STreehugger Robot		//
242*16467b97STreehugger Robot		AllocPolicyType::free( m_blist.get_bits() );
243*16467b97STreehugger Robot    }
244*16467b97STreehugger Robot
245*16467b97STreehugger Robot    // In with the new bits... keerrrang.
246*16467b97STreehugger Robot    //
247*16467b97STreehugger Robot    m_blist.set_bits(newBits);
248*16467b97STreehugger Robot    m_blist.set_length(newSize);
249*16467b97STreehugger Robot}
250*16467b97STreehugger Robot
251*16467b97STreehugger Robottemplate <class ImplTraits>
252*16467b97STreehugger Robotbool	Bitset<ImplTraits>::equals(Bitset* bitset2) const
253*16467b97STreehugger Robot{
254*16467b97STreehugger Robot    ANTLR_UINT32   minimum;
255*16467b97STreehugger Robot    ANTLR_UINT32   i;
256*16467b97STreehugger Robot
257*16467b97STreehugger Robot    if	(this == NULL || bitset2 == NULL)
258*16467b97STreehugger Robot		return	false;
259*16467b97STreehugger Robot
260*16467b97STreehugger Robot    // Work out the minimum comparison set
261*16467b97STreehugger Robot    //
262*16467b97STreehugger Robot    if	( m_blist.get_length() < bitset2->m_blist.get_length() )
263*16467b97STreehugger Robot		minimum = m_blist.get_length();
264*16467b97STreehugger Robot    else
265*16467b97STreehugger Robot		minimum = bitset2->m_blist.get_length();
266*16467b97STreehugger Robot
267*16467b97STreehugger Robot    // Make sure explict in common bits are equal
268*16467b97STreehugger Robot    //
269*16467b97STreehugger Robot    for	(i = minimum - 1; i < minimum ; i--)
270*16467b97STreehugger Robot    {
271*16467b97STreehugger Robot		ANTLR_BITWORD* bits1 = m_blist.get_bits();
272*16467b97STreehugger Robot		ANTLR_BITWORD* bits2 = bitset2->m_blist.get_bits();
273*16467b97STreehugger Robot		if  ( bits1[i] != bits2[i])
274*16467b97STreehugger Robot			return false;
275*16467b97STreehugger Robot    }
276*16467b97STreehugger Robot
277*16467b97STreehugger Robot    // Now make sure the bits of the larger set are all turned
278*16467b97STreehugger Robot    // off.
279*16467b97STreehugger Robot    //
280*16467b97STreehugger Robot    if	( m_blist.get_length() > minimum)
281*16467b97STreehugger Robot    {
282*16467b97STreehugger Robot		for (i = minimum ; i < m_blist.get_length(); i++)
283*16467b97STreehugger Robot		{
284*16467b97STreehugger Robot			ANTLR_BITWORD* bits = m_blist.get_bits();
285*16467b97STreehugger Robot			if(bits[i] != 0)
286*16467b97STreehugger Robot				return false;
287*16467b97STreehugger Robot		}
288*16467b97STreehugger Robot    }
289*16467b97STreehugger Robot    else if (bitset2->m_blist.get_length() > minimum)
290*16467b97STreehugger Robot    {
291*16467b97STreehugger Robot		ANTLR_BITWORD* bits = m_blist.get_bits();
292*16467b97STreehugger Robot		for (i = minimum; i < bitset2->m_blist.get_length(); i++)
293*16467b97STreehugger Robot		{
294*16467b97STreehugger Robot			if	( bits[i] != 0 )
295*16467b97STreehugger Robot				return	false;
296*16467b97STreehugger Robot		}
297*16467b97STreehugger Robot    }
298*16467b97STreehugger Robot
299*16467b97STreehugger Robot    return  true;
300*16467b97STreehugger Robot}
301*16467b97STreehugger Robot
302*16467b97STreehugger Robottemplate <class ImplTraits>
303*16467b97STreehugger Robotbool	Bitset<ImplTraits>::isMember(ANTLR_UINT32 bit) const
304*16467b97STreehugger Robot{
305*16467b97STreehugger Robot    ANTLR_UINT32    wordNo = Bitset::WordNumber(bit);
306*16467b97STreehugger Robot
307*16467b97STreehugger Robot    if	(wordNo >= m_blist.get_length())
308*16467b97STreehugger Robot		return false;
309*16467b97STreehugger Robot
310*16467b97STreehugger Robot	ANTLR_BITWORD* bits = m_blist.get_bits();
311*16467b97STreehugger Robot    if	( (bits[wordNo] & Bitset::BitMask(bit)) == 0)
312*16467b97STreehugger Robot		return false;
313*16467b97STreehugger Robot    else
314*16467b97STreehugger Robot		return true;
315*16467b97STreehugger Robot}
316*16467b97STreehugger Robot
317*16467b97STreehugger Robottemplate <class ImplTraits>
318*16467b97STreehugger RobotANTLR_INLINE ANTLR_UINT32 Bitset<ImplTraits>::numBits() const
319*16467b97STreehugger Robot{
320*16467b97STreehugger Robot	return  m_blist.get_length() << ANTLR_BITSET_LOG_BITS;
321*16467b97STreehugger Robot}
322*16467b97STreehugger Robot
323*16467b97STreehugger Robottemplate <class ImplTraits>
324*16467b97STreehugger RobotANTLR_INLINE typename ImplTraits::BitsetListType& Bitset<ImplTraits>::get_blist()
325*16467b97STreehugger Robot{
326*16467b97STreehugger Robot	return m_blist;
327*16467b97STreehugger Robot}
328*16467b97STreehugger Robot
329*16467b97STreehugger Robottemplate <class ImplTraits>
330*16467b97STreehugger RobotANTLR_INLINE void Bitset<ImplTraits>::remove(ANTLR_UINT32 bit)
331*16467b97STreehugger Robot{
332*16467b97STreehugger Robot    ANTLR_UINT32    wordNo = Bitset::WordNumber(bit);
333*16467b97STreehugger Robot
334*16467b97STreehugger Robot    if	(wordNo < m_blist.get_length())
335*16467b97STreehugger Robot	{
336*16467b97STreehugger Robot		ANTLR_BITWORD* bits = m_blist.get_bits();
337*16467b97STreehugger Robot		bits[wordNo] &= ~(Bitset::BitMask(bit));
338*16467b97STreehugger Robot	}
339*16467b97STreehugger Robot}
340*16467b97STreehugger Robot
341*16467b97STreehugger Robottemplate <class ImplTraits>
342*16467b97STreehugger RobotANTLR_INLINE bool Bitset<ImplTraits>::isNilNode() const
343*16467b97STreehugger Robot{
344*16467b97STreehugger Robot	ANTLR_UINT32    i;
345*16467b97STreehugger Robot	ANTLR_BITWORD* bits = m_blist.get_bits();
346*16467b97STreehugger Robot	for	(i = m_blist.get_length() -1 ; i < m_blist.get_length(); i--)
347*16467b97STreehugger Robot	{
348*16467b97STreehugger Robot		if(bits[i] != 0)
349*16467b97STreehugger Robot			return false;
350*16467b97STreehugger Robot	}
351*16467b97STreehugger Robot	return  true;
352*16467b97STreehugger Robot}
353*16467b97STreehugger Robot
354*16467b97STreehugger Robottemplate <class ImplTraits>
355*16467b97STreehugger RobotANTLR_INT32* Bitset<ImplTraits>::toIntList() const
356*16467b97STreehugger Robot{
357*16467b97STreehugger Robot	ANTLR_UINT32   numInts;	    // How many integers we will need
358*16467b97STreehugger Robot    ANTLR_UINT32   numBits;	    // How many bits are in the set
359*16467b97STreehugger Robot    ANTLR_UINT32   i;
360*16467b97STreehugger Robot    ANTLR_UINT32   index;
361*16467b97STreehugger Robot
362*16467b97STreehugger Robot    ANTLR_INT32*  intList;
363*16467b97STreehugger Robot
364*16467b97STreehugger Robot    numInts = this->size() + 1;
365*16467b97STreehugger Robot    numBits = this->numBits();
366*16467b97STreehugger Robot
367*16467b97STreehugger Robot    intList = (ANTLR_INT32*) AllocPolicyType::alloc(numInts * sizeof(ANTLR_INT32));
368*16467b97STreehugger Robot
369*16467b97STreehugger Robot    intList[0] = numInts;
370*16467b97STreehugger Robot
371*16467b97STreehugger Robot    // Enumerate the bits that are turned on
372*16467b97STreehugger Robot    //
373*16467b97STreehugger Robot    for	(i = 0, index = 1; i<numBits; i++)
374*16467b97STreehugger Robot    {
375*16467b97STreehugger Robot		if  (this->isMember(i) == true)
376*16467b97STreehugger Robot			intList[index++]    = i;
377*16467b97STreehugger Robot    }
378*16467b97STreehugger Robot
379*16467b97STreehugger Robot    // Result set
380*16467b97STreehugger Robot    //
381*16467b97STreehugger Robot    return  intList;
382*16467b97STreehugger Robot}
383*16467b97STreehugger Robot
384*16467b97STreehugger Robottemplate <class ImplTraits>
385*16467b97STreehugger RobotANTLR_INLINE Bitset<ImplTraits>::~Bitset()
386*16467b97STreehugger Robot{
387*16467b97STreehugger Robot	if	(m_blist.get_bits() != NULL)
388*16467b97STreehugger Robot		AllocPolicyType::free(m_blist.get_bits());
389*16467b97STreehugger Robot    return;
390*16467b97STreehugger Robot}
391*16467b97STreehugger Robot
392*16467b97STreehugger Robottemplate <class ImplTraits>
393*16467b97STreehugger Robotvoid	Bitset<ImplTraits>::growToInclude(ANTLR_INT32 bit)
394*16467b97STreehugger Robot{
395*16467b97STreehugger Robot	ANTLR_UINT32	bl;
396*16467b97STreehugger Robot	ANTLR_UINT32	nw;
397*16467b97STreehugger Robot
398*16467b97STreehugger Robot	bl = (m_blist.get_length() << 1);
399*16467b97STreehugger Robot	nw = Bitset::NumWordsToHold(bit);
400*16467b97STreehugger Robot
401*16467b97STreehugger Robot	if	(bl > nw)
402*16467b97STreehugger Robot		this->grow(bl);
403*16467b97STreehugger Robot	else
404*16467b97STreehugger Robot		this->grow(nw);
405*16467b97STreehugger Robot}
406*16467b97STreehugger Robot
407*16467b97STreehugger Robottemplate <class ImplTraits>
408*16467b97STreehugger RobotANTLR_INLINE ANTLR_UINT64	Bitset<ImplTraits>::BitMask(ANTLR_UINT32 bitNumber)
409*16467b97STreehugger Robot{
410*16467b97STreehugger Robot	return  ((ANTLR_UINT64)1) << (bitNumber & (ANTLR_BITSET_MOD_MASK));
411*16467b97STreehugger Robot}
412*16467b97STreehugger Robot
413*16467b97STreehugger Robottemplate <class ImplTraits>
414*16467b97STreehugger RobotANTLR_INLINE ANTLR_UINT32	Bitset<ImplTraits>::NumWordsToHold(ANTLR_UINT32 bit)
415*16467b97STreehugger Robot{
416*16467b97STreehugger Robot	return  (bit >> ANTLR_BITSET_LOG_BITS) + 1;
417*16467b97STreehugger Robot}
418*16467b97STreehugger Robot
419*16467b97STreehugger Robottemplate <class ImplTraits>
420*16467b97STreehugger RobotANTLR_INLINE ANTLR_UINT32	Bitset<ImplTraits>::WordNumber(ANTLR_UINT32 bit)
421*16467b97STreehugger Robot{
422*16467b97STreehugger Robot	return  bit >> ANTLR_BITSET_LOG_BITS;
423*16467b97STreehugger Robot}
424*16467b97STreehugger Robot
425*16467b97STreehugger Robottemplate <class ImplTraits>
426*16467b97STreehugger Robotvoid Bitset<ImplTraits>::bitsetORInPlace(Bitset* bitset2)
427*16467b97STreehugger Robot{
428*16467b97STreehugger Robot	ANTLR_UINT32   minimum;
429*16467b97STreehugger Robot    ANTLR_UINT32   i;
430*16467b97STreehugger Robot
431*16467b97STreehugger Robot    if	(bitset2 == NULL)
432*16467b97STreehugger Robot		return;
433*16467b97STreehugger Robot
434*16467b97STreehugger Robot    // First make sure that the target bitset is big enough
435*16467b97STreehugger Robot    // for the new bits to be ored in.
436*16467b97STreehugger Robot    //
437*16467b97STreehugger Robot    if	( m_blist.get_length() < bitset2->m_blist.get_length() )
438*16467b97STreehugger Robot		this->growToInclude( bitset2->m_blist.get_length() * sizeof(ANTLR_BITWORD) );
439*16467b97STreehugger Robot
440*16467b97STreehugger Robot    // Or the miniimum number of bits after any resizing went on
441*16467b97STreehugger Robot    //
442*16467b97STreehugger Robot    if	( m_blist.get_length() < bitset2->m_blist.get_length() )
443*16467b97STreehugger Robot		minimum = m_blist.get_length();
444*16467b97STreehugger Robot	else
445*16467b97STreehugger Robot		minimum = bitset2->m_blist.get_length();
446*16467b97STreehugger Robot
447*16467b97STreehugger Robot	ANTLR_BITWORD* bits1 = m_blist.get_bits();
448*16467b97STreehugger Robot	ANTLR_BITWORD* bits2 = bitset2->m_blist.get_bits();
449*16467b97STreehugger Robot    for	(i = minimum; i > 0; i--)
450*16467b97STreehugger Robot		bits1[i-1] |= bits2[i-1];
451*16467b97STreehugger Robot}
452*16467b97STreehugger Robot
453*16467b97STreehugger Robottemplate <class ImplTraits>
454*16467b97STreehugger RobotBitset<ImplTraits>* Bitset<ImplTraits>::BitsetOf(ANTLR_INT32 bit)
455*16467b97STreehugger Robot{
456*16467b97STreehugger Robot	// Allocate memory for the bitset structure itself
457*16467b97STreehugger Robot    // the input parameter is the bit number (0 based)
458*16467b97STreehugger Robot    // to include in the bitset, so we need at at least
459*16467b97STreehugger Robot    // bit + 1 bits. If any arguments indicate a
460*16467b97STreehugger Robot    // a bit higher than the default number of bits (0 menas default size)
461*16467b97STreehugger Robot    // then Add() will take care
462*16467b97STreehugger Robot    // of it.
463*16467b97STreehugger Robot    //
464*16467b97STreehugger Robot	Bitset<ImplTraits>* bitset = new Bitset<ImplTraits>(0);
465*16467b97STreehugger Robot	bitset->add(bit);
466*16467b97STreehugger Robot	return bitset;
467*16467b97STreehugger Robot}
468*16467b97STreehugger Robot
469*16467b97STreehugger Robottemplate <class ImplTraits>
470*16467b97STreehugger RobotBitset<ImplTraits>* Bitset<ImplTraits>::BitsetOf(ANTLR_INT32 bit1, ANTLR_INT32 bit2)
471*16467b97STreehugger Robot{
472*16467b97STreehugger Robot	Bitset<ImplTraits>* bitset = Bitset<ImplTraits>::BitsetOf(bit1);
473*16467b97STreehugger Robot	bitset->add(bit2);
474*16467b97STreehugger Robot	return bitset;
475*16467b97STreehugger Robot}
476*16467b97STreehugger Robot
477*16467b97STreehugger Robot//static
478*16467b97STreehugger Robottemplate <class ImplTraits>
479*16467b97STreehugger RobotBitset<ImplTraits>* Bitset<ImplTraits>::BitsetFromList(const IntListType& list)
480*16467b97STreehugger Robot{
481*16467b97STreehugger Robot	// We have no idea what exactly is in the list
482*16467b97STreehugger Robot    // so create a default bitset and then just add stuff
483*16467b97STreehugger Robot    // as we enumerate.
484*16467b97STreehugger Robot    //
485*16467b97STreehugger Robot    Bitset<ImplTraits>* bitset  = new Bitset<ImplTraits>(0);
486*16467b97STreehugger Robot	for( int i = 0; i < list.size(); ++i )
487*16467b97STreehugger Robot		bitset->add( list[i] );
488*16467b97STreehugger Robot
489*16467b97STreehugger Robot	return bitset;
490*16467b97STreehugger Robot}
491*16467b97STreehugger Robot
492*16467b97STreehugger RobotANTLR_END_NAMESPACE()
493