@@ -23,7 +23,7 @@ namespace succinct {
23
23
public:
24
24
25
25
typedef std::vector<uint64_t > bits_type;
26
-
26
+
27
27
bit_vector_builder (uint64_t size = 0 , bool init = 0 )
28
28
: m_size(size)
29
29
{
@@ -36,11 +36,11 @@ namespace succinct {
36
36
}
37
37
}
38
38
}
39
-
39
+
40
40
void reserve (uint64_t size) {
41
41
m_bits.reserve (detail::words_for (size));
42
42
}
43
-
43
+
44
44
inline void push_back (bool b) {
45
45
uint64_t pos_in_word = m_size % 64 ;
46
46
if (pos_in_word == 0 ) {
@@ -61,8 +61,8 @@ namespace succinct {
61
61
}
62
62
63
63
inline void append_bits (uint64_t bits, size_t len) {
64
- assert (len == 64 || (bits >> len) == 0 ); // check there are no spurious bits
65
- if (!len) return ;
64
+ assert (len == 64 || (bits >> len) == 0 ); // check there are no spurious bits
65
+ if (!len) return ;
66
66
uint64_t pos_in_word = m_size % 64 ;
67
67
m_size += len;
68
68
if (pos_in_word == 0 ) {
@@ -85,7 +85,7 @@ namespace succinct {
85
85
}
86
86
}
87
87
88
- inline void one_extend (uint64_t n)
88
+ inline void one_extend (uint64_t n)
89
89
{
90
90
while (n >= 64 ) {
91
91
append_bits (uint64_t (-1 ), 64 );
@@ -95,7 +95,7 @@ namespace succinct {
95
95
append_bits (uint64_t (-1 ) >> (64 - n), n);
96
96
}
97
97
}
98
-
98
+
99
99
void append (bit_vector_builder const & rhs)
100
100
{
101
101
uint64_t remaining = rhs.size ();
@@ -109,31 +109,31 @@ namespace succinct {
109
109
}
110
110
}
111
111
112
- // reverse in place
113
- void reverse ()
114
- {
115
- uint64_t shift = 64 - (size () % 64 );
116
-
117
- uint64_t remainder = 0 ;
118
- for (size_t i = 0 ; i < m_bits.size (); ++i) {
119
- uint64_t cur_word;
120
- if (shift != 64 ) { // this should be hoisted out
121
- cur_word = remainder | (m_bits[i] << shift);
122
- remainder = m_bits[i] >> (64 - shift);
123
- } else {
124
- cur_word = m_bits[i];
125
- }
126
- m_bits[i] = broadword::reverse_bits (cur_word);
127
- }
128
- assert (remainder == 0 );
129
- std::reverse (m_bits.begin (), m_bits.end ());
130
- }
112
+ // reverse in place
113
+ void reverse ()
114
+ {
115
+ uint64_t shift = 64 - (size () % 64 );
116
+
117
+ uint64_t remainder = 0 ;
118
+ for (size_t i = 0 ; i < m_bits.size (); ++i) {
119
+ uint64_t cur_word;
120
+ if (shift != 64 ) { // this should be hoisted out
121
+ cur_word = remainder | (m_bits[i] << shift);
122
+ remainder = m_bits[i] >> (64 - shift);
123
+ } else {
124
+ cur_word = m_bits[i];
125
+ }
126
+ m_bits[i] = broadword::reverse_bits (cur_word);
127
+ }
128
+ assert (remainder == 0 );
129
+ std::reverse (m_bits.begin (), m_bits.end ());
130
+ }
131
131
132
132
bits_type& move_bits () {
133
133
assert (detail::words_for (m_size) == m_bits.size ());
134
134
return m_bits;
135
135
}
136
-
136
+
137
137
uint64_t size () const {
138
138
return m_size;
139
139
}
@@ -143,17 +143,17 @@ namespace succinct {
143
143
m_bits.swap (other.m_bits );
144
144
std::swap (m_size, other.m_size );
145
145
std::swap (m_cur_word, other.m_cur_word );
146
- }
146
+ }
147
147
148
148
private:
149
149
bits_type m_bits;
150
150
uint64_t m_size;
151
151
uint64_t * m_cur_word;
152
152
};
153
-
153
+
154
154
class bit_vector {
155
155
public:
156
- bit_vector ()
156
+ bit_vector ()
157
157
: m_size(0 )
158
158
{}
159
159
@@ -188,19 +188,19 @@ namespace succinct {
188
188
m_size = from->size ();
189
189
m_bits.steal (from->move_bits ());
190
190
}
191
-
191
+
192
192
template <typename Visitor>
193
193
void map (Visitor& visit) {
194
194
visit
195
195
(m_size, " m_size" )
196
196
(m_bits, " m_bits" );
197
197
}
198
-
198
+
199
199
void swap (bit_vector& other) {
200
200
std::swap (other.m_size , m_size);
201
201
other.m_bits .swap (m_bits);
202
202
}
203
-
203
+
204
204
inline size_t size () const {
205
205
return m_size;
206
206
}
@@ -228,18 +228,18 @@ namespace succinct {
228
228
}
229
229
}
230
230
231
- // same as get_bits(pos, 64) but it can extend further size(), padding with zeros
232
- inline uint64_t get_word (uint64_t pos) const
233
- {
234
- assert (pos < size ());
231
+ // same as get_bits(pos, 64) but it can extend further size(), padding with zeros
232
+ inline uint64_t get_word (uint64_t pos) const
233
+ {
234
+ assert (pos < size ());
235
235
uint64_t block = pos / 64 ;
236
236
uint64_t shift = pos % 64 ;
237
- uint64_t word = m_bits[block] >> shift;
238
- if (shift && block + 1 < m_bits.size ()) {
239
- word |= m_bits[block + 1 ] << (64 - shift);
240
- }
241
- return word;
242
- }
237
+ uint64_t word = m_bits[block] >> shift;
238
+ if (shift && block + 1 < m_bits.size ()) {
239
+ word |= m_bits[block + 1 ] << (64 - shift);
240
+ }
241
+ return word;
242
+ }
243
243
244
244
inline uint64_t predecessor0 (uint64_t pos) const {
245
245
assert (pos < m_size);
@@ -301,17 +301,17 @@ namespace succinct {
301
301
return block * 64 + ret;
302
302
}
303
303
304
- mapper::mappable_vector<uint64_t > const & data () const
305
- {
306
- return m_bits;
307
- }
304
+ mapper::mappable_vector<uint64_t > const & data () const
305
+ {
306
+ return m_bits;
307
+ }
308
308
309
309
struct enumerator {
310
310
enumerator ()
311
311
: m_bv(0 )
312
312
, m_pos(uint64_t (-1 ))
313
313
{}
314
-
314
+
315
315
enumerator (bit_vector const & bv, size_t pos)
316
316
: m_bv(&bv)
317
317
, m_pos(pos)
@@ -356,19 +356,19 @@ namespace succinct {
356
356
m_avail = 0 ;
357
357
fill_buf ();
358
358
}
359
-
359
+
360
360
uint64_t l = broadword::lsb (m_buf);
361
361
m_buf >>= l;
362
362
m_buf >>= 1 ;
363
363
m_avail -= l + 1 ;
364
364
m_pos += l + 1 ;
365
365
return zs + l;
366
366
}
367
-
368
- inline uint64_t position () const
369
- {
370
- return m_pos;
371
- }
367
+
368
+ inline uint64_t position () const
369
+ {
370
+ return m_pos;
371
+ }
372
372
373
373
private:
374
374
@@ -400,16 +400,16 @@ namespace succinct {
400
400
uint64_t pos_in_word = pos % 64 ;
401
401
m_buf &= uint64_t (-1 ) << pos_in_word;
402
402
}
403
-
403
+
404
404
uint64_t next ()
405
405
{
406
406
unsigned long pos_in_word;
407
407
while (!broadword::lsb (m_buf, pos_in_word)) {
408
408
m_buf = m_data[++m_word_idx];
409
409
}
410
-
410
+
411
411
m_buf &= m_buf - 1 ; // clear LSB
412
- return m_word_idx * 64 + pos_in_word;
412
+ return m_word_idx * 64 + pos_in_word;
413
413
}
414
414
415
415
private:
@@ -422,5 +422,5 @@ namespace succinct {
422
422
size_t m_size;
423
423
mapper::mappable_vector<uint64_t > m_bits;
424
424
};
425
-
425
+
426
426
}
0 commit comments