16 using BitArrayDeque =
typename stool::NaiveBitVector<MAX_BIT_SIZE>;
23 using BitVectorContainerIterator =
typename BitArrayDeque::NaiveBitVectorIterator;
29 for (uint64_t x : _items)
36 for (uint64_t i = 0; i < _items.size(); i++)
38 this->push_back(_items[i]);
44 std::swap(this->bits, item.bits);
48 return this->bits.size();
50 uint64_t size_in_bytes(
bool only_extra_bytes)
const
52 return this->bits.size_in_bytes(only_extra_bytes);
54 uint64_t unused_size_in_bytes()
const
56 return this->bits.unused_size_in_bytes();
59 uint64_t at(uint64_t pos)
const
61 return this->bits.at(pos);
65 throw std::runtime_error(
"Error: BitVectorContainer");
72 static std::string name()
74 return "BitVectorContainer";
76 uint64_t psum(uint64_t i)
const noexcept
78 return this->bits.psum(i);
80 uint64_t psum()
const noexcept
82 return this->bits.psum();
84 int64_t search(uint64_t x)
const noexcept
86 uint64_t v = this->bits.search(x);
90 std::string to_string()
const
92 return this->bits.to_string();
94 std::vector<uint64_t> to_value_vector()
const
96 std::vector<uint64_t> r;
97 for (uint64_t i = 0; i < this->size(); i++)
99 r.push_back(this->at(i));
103 uint64_t to_uint64()
const
105 uint64_t size = this->size();
108 uint64_t value = this->bits.read_64_bit_string();
115 return value >> (64 - size);
124 template <
typename VEC>
125 void to_values(VEC &output_vec)
const
128 output_vec.resize(this->size());
129 for (uint64_t i = 0; i < this->size(); i++)
131 output_vec[i] = this->at(i);
138 void insert(uint64_t pos, uint64_t value)
140 this->bits.insert(pos, value >= 1);
142 void remove(uint64_t pos)
144 assert(this->size() > 0);
145 this->bits.erase(pos);
147 uint64_t to_bit_array(
const std::vector<uint64_t> &new_items, std::array<uint64_t, MAX_BIT_SIZE / 64> &output){
148 uint64_t added_block_size = ((new_items.size()-1) / 64) + 1;
149 for(uint64_t i = 0; i < added_block_size; i++){
152 for(uint64_t i = 0; i < new_items.size(); i++){
155 output[v] |= ((new_items[i] >= 1) ? 1ULL : 0ULL) << (63 - w);
157 return added_block_size;
159 void push_front_many(
const std::vector<uint64_t> &new_items)
161 if(new_items.size() > 0){
162 std::array<uint64_t, MAX_BIT_SIZE / 64> tmp_buffer;
163 uint64_t added_block_size = this->to_bit_array(new_items, tmp_buffer);
166 uint64_t sum1 = this->bits.psum();
168 for(uint64_t i = 0; i < new_items.size(); i++){
169 sum2 += new_items[i] >= 1 ? 1 : 0;
171 uint64_t x_size = this->size();
174 this->bits.push_front64(tmp_buffer, new_items.size(), added_block_size);
177 if(sum1 + sum2 != this->bits.psum()){
178 std::cout << new_items.size() <<
"/" << x_size << std::endl;
179 std::cout << sum1 <<
"/" << sum2 << std::endl;
180 std::cout << this->bits.psum() << std::endl;
182 assert(sum1 + sum2 == this->bits.psum());
187 void push_front(uint64_t new_item)
190 this->bits.push_back64(new_item >= 1);
193 void push_back_many(
const std::vector<uint64_t> &new_items)
196 if(new_items.size() > 0){
197 std::array<uint64_t, MAX_BIT_SIZE / 64> tmp_buffer;
198 uint64_t added_block_size = this->to_bit_array(new_items, tmp_buffer);
199 this->bits.push_back64(tmp_buffer, new_items.size(), added_block_size);
202 void push_back(uint64_t value)
205 this->bits.push_back(value >= 1);
210 assert(this->size() > 0);
211 this->bits.pop_front();
213 std::vector<uint64_t> pop_front_many(uint64_t len)
216 assert(len <= this->size());
217 std::array<uint64_t, MAX_BIT_SIZE / 64> tmp_buffer;
218 this->bits.pop_front(len, tmp_buffer, MAX_BIT_SIZE / 64);
219 std::vector<uint64_t> r;
221 for(uint64_t i = 0; i < len; i++){
224 r.push_back((tmp_buffer[v] >> (63 - w)) & 1);
240 assert(this->size() > 0);
241 this->bits.pop_back();
244 std::vector<uint64_t> pop_back_many(uint64_t len)
247 assert(len <= this->size());
248 std::vector<uint64_t> r;
251 for (uint64_t i = 0; i < len; i++)
253 bool b = this->at(this->size() - 1);
254 r[len - i - 1] = b ? 1 : 0;
260 uint64_t reverse_psum(uint64_t i)
const
262 return this->bits.reverse_psum(i);
265 uint64_t psum(uint64_t i, uint64_t j)
const
267 return this->bits.psum(i, j);
270 void increment(uint64_t i, int64_t delta)
272 this->bits.increment(i, delta);
275 int64_t rank1(uint64_t i)
const
277 return this->bits.rank1(i);
280 int64_t rank0(uint64_t i)
const
282 return i - this->rank1(i);
284 int64_t rank(uint64_t i,
bool b)
const
286 return b ? this->rank1(i) : this->rank0(i);
289 int64_t select(uint64_t i,
bool b)
const
291 return b ? this->select1(i) : this->select0(i);
294 int64_t select1(uint64_t i)
const
296 return this->bits.select1(i);
298 int64_t select0(uint64_t i)
const
300 return this->bits.select0(i);
303 void to_data(std::vector<uint8_t> &output)
const
305 uint64_t byte_size = BitArrayDeque::get_byte_size(this->bits);
306 uint64_t size = this->size();
307 for (uint64_t i = 0; i < byte_size; i++)
311 BitArrayDeque::store_to_bytes(this->bits, output, size);
319 static uint64_t get_byte_size(
const std::vector<BitVectorContainer> &items)
321 uint64_t size =
sizeof(uint64_t);
322 for (
const auto &item : items)
324 size += BitArrayDeque::get_byte_size(item.bits);
328 static void store_to_bytes(
const std::vector<BitVectorContainer> &items, std::vector<uint8_t> &output, uint64_t &pos)
330 uint64_t size = get_byte_size(items);
331 if (pos + size > output.size())
333 output.resize(pos + size);
336 uint64_t items_size = items.size();
337 std::memcpy(output.data() + pos, &items_size,
sizeof(uint64_t));
338 pos +=
sizeof(uint64_t);
340 for (
const auto &item : items)
342 BitArrayDeque::store_to_bytes(item.bits, output, pos);
345 static void store_to_file(
const std::vector<BitVectorContainer> &items, std::ofstream &os)
347 uint64_t items_size = items.size();
348 os.write(
reinterpret_cast<const char *
>(&items_size),
sizeof(uint64_t));
350 for (
const auto &item : items)
352 BitArrayDeque::store_to_file(item.bits, os);
355 static BitVectorContainer load_from_bytes(
const std::vector<uint8_t> &data, uint64_t &pos){
357 r.bits = BitArrayDeque::load_from_bytes(data, pos);
363 r.bits = BitArrayDeque::load_from_file(ifs);
366 static std::vector<BitVectorContainer> load_vector_from_bytes(
const std::vector<uint8_t> &data, uint64_t &pos)
369 std::memcpy(&size, data.data() + pos,
sizeof(uint64_t));
370 pos +=
sizeof(uint64_t);
372 std::vector<BitVectorContainer> output;
374 for (uint64_t i = 0; i < size; i++)
376 output[i] = BitVectorContainer::load_from_bytes(data, pos);
380 static std::vector<BitVectorContainer> load_vector_from_file(std::ifstream &ifs)
383 ifs.read(
reinterpret_cast<char *
>(&size),
sizeof(uint64_t));
385 std::vector<BitVectorContainer> output;
387 for (uint64_t i = 0; i < size; i++)
389 output[i] = BitVectorContainer::load_from_file(ifs);
395 BitVectorContainerIterator begin()
const
397 return this->bits.begin();
399 BitVectorContainerIterator end()
const
401 return this->bits.end();