From 955d4e00adc9f39ab93bf21f07506eb75b013c70 Mon Sep 17 00:00:00 2001 From: Michael Krelin Date: Mon, 05 Jul 2004 01:53:09 +0000 Subject: initial commit into svn repository git-svn-id: http://svn.klever.net/kin/T42/trunk@1 fe716a7a-6dde-0310-88d9-d003556173a8 --- (limited to 'shared-code/BitSet.h') diff --git a/shared-code/BitSet.h b/shared-code/BitSet.h new file mode 100644 index 0000000..cf36e3b --- a/dev/null +++ b/shared-code/BitSet.h @@ -0,0 +1,105 @@ +#ifndef __BITSET_H +#define __BITSET_H + +namespace Klever { + +class CBitSet : public CObject { +public: + CWordArray m_Bits; + ULONG m_BitsInSet; + enum { + bitsPerWord = sizeof(WORD)*8 + }; + + CBitSet(ULONG size = 0) : m_BitsInSet(0) { SetSize(size); } + CBitSet(CBitSet& o) : m_BitsInSet(0) { CopyFrom(o); } + + void SetSize(ULONG size,BOOL bFillOnes=FALSE) { + UINT os = m_Bits.GetSize(); + UINT ns = (size+bitsPerWord-1)/bitsPerWord; + if(os==ns){ + if(os){ + if(bFillOnes) + m_Bits[m_BitsInSet/bitsPerWord]|=(~(WORD)0)<<(m_BitsInSet%bitsPerWord); + else + m_Bits[m_BitsInSet/bitsPerWord]&=~((~(WORD)0)<<(m_BitsInSet%bitsPerWord)); + } + m_BitsInSet=size; + }else{ + // *?* ASSERT((!os) || (((os-1)*bitsPerWord)<=m_BitsInSet && m_BitsInSet<(os*bitsPerWord))); + if(os=0;i--) + m_Bits[i]=~m_Bits[i]; + } + CBitSet& operator&=(CBitSet& o) { + if(o.m_BitsInSet=0;i--) + m_Bits[i]&=o.m_Bits[i]; + return *this; + } + CBitSet& operator|=(CBitSet& o) { + if(o.m_BitsInSet>m_BitsInSet) + SetSize(o.m_BitsInSet); + for(int i=o.m_Bits.GetUpperBound();i>=0;i--) + m_Bits[i]|=o.m_Bits[i]; + return *this; + } + CBitSet& operator=(CBitSet& o) { + CopyFrom(o); + return *this; + } + void CopyFrom(CBitSet& o) { + m_BitsInSet=o.m_BitsInSet; + m_Bits.Copy(o.m_Bits); + } + void Serialize(CArchive& ar) { + if(ar.IsStoring()){ + ar << m_BitsInSet; + m_Bits.Serialize(ar); + }else{ + ar >> m_BitsInSet; + m_Bits.Serialize(ar); + } + } +}; + +}; + +#endif // __BITSET_H -- cgit v0.9.0.2