author | Michael Krelin <hacker@klever.net> | 2004-07-05 01:53:09 (UTC) |
---|---|---|
committer | Michael Krelin <hacker@klever.net> | 2004-07-05 01:53:09 (UTC) |
commit | 955d4e00adc9f39ab93bf21f07506eb75b013c70 (patch) (unidiff) | |
tree | 92493a2c9ac206b822e24a9e5a6f6b1589be6afb /shared-code/BitSet.h | |
download | T42-955d4e00adc9f39ab93bf21f07506eb75b013c70.zip T42-955d4e00adc9f39ab93bf21f07506eb75b013c70.tar.gz T42-955d4e00adc9f39ab93bf21f07506eb75b013c70.tar.bz2 |
initial commit into svn repository
git-svn-id: http://svn.klever.net/kin/T42/trunk@1 fe716a7a-6dde-0310-88d9-d003556173a8
-rw-r--r-- | shared-code/BitSet.h | 105 |
1 files changed, 105 insertions, 0 deletions
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 @@ | |||
1 | #ifndef__BITSET_H | ||
2 | #define __BITSET_H | ||
3 | |||
4 | namespace Klever { | ||
5 | |||
6 | class CBitSet: public CObject { | ||
7 | public: | ||
8 | CWordArray m_Bits; | ||
9 | ULONG m_BitsInSet; | ||
10 | enum{ | ||
11 | bitsPerWord = sizeof(WORD)*8 | ||
12 | }; | ||
13 | |||
14 | CBitSet(ULONG size = 0) : m_BitsInSet(0) { SetSize(size); } | ||
15 | CBitSet(CBitSet& o) : m_BitsInSet(0) { CopyFrom(o); } | ||
16 | |||
17 | void SetSize(ULONG size,BOOL bFillOnes=FALSE) { | ||
18 | UINT os = m_Bits.GetSize(); | ||
19 | UINT ns = (size+bitsPerWord-1)/bitsPerWord; | ||
20 | if(os==ns){ | ||
21 | if(os){ | ||
22 | if(bFillOnes) | ||
23 | m_Bits[m_BitsInSet/bitsPerWord]|=(~(WORD)0)<<(m_BitsInSet%bitsPerWord); | ||
24 | else | ||
25 | m_Bits[m_BitsInSet/bitsPerWord]&=~((~(WORD)0)<<(m_BitsInSet%bitsPerWord)); | ||
26 | } | ||
27 | m_BitsInSet=size; | ||
28 | }else{ | ||
29 | // *?* ASSERT((!os) || (((os-1)*bitsPerWord)<=m_BitsInSet && m_BitsInSet<(os*bitsPerWord))); | ||
30 | if(os<ns){ | ||
31 | m_Bits.SetSize(ns); | ||
32 | if(bFillOnes) | ||
33 | m_Bits[m_BitsInSet/bitsPerWord]|=(~(WORD)0)<<(m_BitsInSet%bitsPerWord); | ||
34 | else | ||
35 | m_Bits[m_BitsInSet/bitsPerWord]&=~((~(WORD)0)<<(m_BitsInSet%bitsPerWord)); | ||
36 | WORD* ws = m_Bits.GetData(); | ||
37 | ASSERT(ws); | ||
38 | memset(&ws[os],bFillOnes?0xFF:0,(ns-os)*sizeof(WORD)); | ||
39 | m_BitsInSet=size; | ||
40 | }else{ | ||
41 | m_Bits.SetSize(ns); | ||
42 | m_BitsInSet=size; | ||
43 | } | ||
44 | } | ||
45 | } | ||
46 | BOOL BitSet(UINT bit,BOOL bGrow=TRUE) { return SetBit(bit,TRUE,bGrow); } | ||
47 | BOOL BitClear(UINT bit,BOOL bGrow=TRUE) { return SetBit(bit,FALSE,bGrow); } | ||
48 | BOOL SetBit(UINT bit,BOOL state,BOOL bGrow=TRUE) { | ||
49 | if(m_BitsInSet<=bit){ | ||
50 | if(!bGrow) | ||
51 | return FALSE; | ||
52 | SetSize(bit+1); | ||
53 | } | ||
54 | WORD mask = ((WORD)1)<<(bit%bitsPerWord); | ||
55 | if(state) | ||
56 | m_Bits[bit/bitsPerWord]|=mask; | ||
57 | else | ||
58 | m_Bits[bit/bitsPerWord]&=~mask; | ||
59 | return TRUE; | ||
60 | } | ||
61 | BOOL IsSet(UINT bit) { | ||
62 | if(m_BitsInSet<=bit) | ||
63 | return FALSE; | ||
64 | return (m_Bits[bit/bitsPerWord]&(((WORD)1)<<(bit%bitsPerWord)))!=0; | ||
65 | } | ||
66 | void Invert() { | ||
67 | for(int i=m_Bits.GetUpperBound();i>=0;i--) | ||
68 | m_Bits[i]=~m_Bits[i]; | ||
69 | } | ||
70 | CBitSet& operator&=(CBitSet& o) { | ||
71 | if(o.m_BitsInSet<m_BitsInSet) | ||
72 | SetSize(o.m_BitsInSet); | ||
73 | for(int i=m_Bits.GetUpperBound();i>=0;i--) | ||
74 | m_Bits[i]&=o.m_Bits[i]; | ||
75 | return *this; | ||
76 | } | ||
77 | CBitSet& operator|=(CBitSet& o) { | ||
78 | if(o.m_BitsInSet>m_BitsInSet) | ||
79 | SetSize(o.m_BitsInSet); | ||
80 | for(int i=o.m_Bits.GetUpperBound();i>=0;i--) | ||
81 | m_Bits[i]|=o.m_Bits[i]; | ||
82 | return *this; | ||
83 | } | ||
84 | CBitSet& operator=(CBitSet& o) { | ||
85 | CopyFrom(o); | ||
86 | return *this; | ||
87 | } | ||
88 | void CopyFrom(CBitSet& o) { | ||
89 | m_BitsInSet=o.m_BitsInSet; | ||
90 | m_Bits.Copy(o.m_Bits); | ||
91 | } | ||
92 | void Serialize(CArchive& ar) { | ||
93 | if(ar.IsStoring()){ | ||
94 | ar << m_BitsInSet; | ||
95 | m_Bits.Serialize(ar); | ||
96 | }else{ | ||
97 | ar >> m_BitsInSet; | ||
98 | m_Bits.Serialize(ar); | ||
99 | } | ||
100 | } | ||
101 | }; | ||
102 | |||
103 | }; | ||
104 | |||
105 | #endif // __BITSET_H | ||