-
Notifications
You must be signed in to change notification settings - Fork 19
Expand file tree
/
Copy pathBitVector.cpp
More file actions
112 lines (84 loc) · 1.75 KB
/
Copy pathBitVector.cpp
File metadata and controls
112 lines (84 loc) · 1.75 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
#include <string.h>
#include "BitVector.h"
BitVector::BitVector(): m_data(NULL), m_size(0)
{
}
BitVector::BitVector(const BitVector& v)
{
if (v.m_size == 0)
{
m_data = NULL;
m_size = 0;
}
else
{
m_data = new uint32_t[(v.m_size + 31) / 32];
m_size = v.m_size;
memcpy(m_data, v.m_data, (m_size + 7) / 8);
}
}
BitVector::~BitVector()
{
if (m_data)
delete[] m_data;
}
BitVector& BitVector::operator=(const BitVector& v)
{
if (v.m_size != m_size)
Reset(v.m_size, false);
memcpy(m_data, v.m_data, (m_size + 7) / 8);
return *this;
}
bool BitVector::operator==(const BitVector& v)
{
if (v.m_size != m_size)
return false;
return memcmp(m_data, v.m_data, (m_size + 7) / 8) == 0;
}
bool BitVector::operator!=(const BitVector& v)
{
return !operator==(v);
}
void BitVector::Reset(size_t size, bool value)
{
if (m_size != size)
{
if (m_data)
delete[] m_data;
m_data = new uint32_t[(size + 31) / 32];
m_size = size;
}
memset(m_data, value ? 0xff : 0, (size + 7) / 8);
if ((m_size & 31) != 0)
m_data[(m_size - 1) / 32] &= (1 << (m_size & 31)) - 1;
}
bool BitVector::GetBit(size_t bit) const
{
return (m_data[bit / 32] & (1 << (bit & 31))) != 0;
}
void BitVector::SetBit(size_t bit, bool value)
{
if (value)
m_data[bit / 32] |= 1 << (bit & 31);
else
m_data[bit / 32] &= ~(1 << (bit & 31));
}
size_t BitVector::GetSize() const
{
return m_size;
}
void BitVector::Union(const BitVector& v)
{
for (size_t i = 0; i < (m_size + 31) / 32; i++)
m_data[i] |= v.m_data[i];
}
void BitVector::Intersection(const BitVector& v)
{
for (size_t i = 0; i < (m_size + 31) / 32; i++)
m_data[i] &= v.m_data[i];
}
void BitVector::Difference(const BitVector& v)
{
for (size_t i = 0; i < (m_size + 31) / 32; i++)
m_data[i] &= ~v.m_data[i];
}