17 stool::NaiveFLCVector<false> keys;
18 stool::NaiveFLCVector<false> pointers;
21 static constexpr uint64_t ___PermutationLeafSize = 252;
36 using iterator_category = std::bidirectional_iterator_tag;
37 using difference_type = std::ptrdiff_t;
42 return _m_deq->at(this->_m_idx);
115 PermutationIterator begin()
const
119 PermutationIterator end()
const
121 return PermutationIterator(
const_cast<PermutationContainer *
>(
this), this->size());
124 uint64_t size()
const
126 return this->pointers.size();
128 uint64_t size_in_bytes(
bool only_extra_bytes)
const
130 if(only_extra_bytes){
131 return this->keys.size_in_bytes(
true) + this->pointers.size_in_bytes(
true);
133 return sizeof(PermutationContainer) + this->keys.size_in_bytes(
true) + this->pointers.size_in_bytes(
true);
136 uint64_t unused_size_in_bytes()
const
138 return this->keys.unused_size_in_bytes() + this->pointers.unused_size_in_bytes();
142 PermutationItem at(uint64_t pos)
const
144 assert(pos < this->keys.size());
145 assert(pos < this->pointers.size());
147 return PermutationItem(this->pointers.at(pos), this->keys[pos]);
151 std::cout << this->to_string() << std::endl;
157 this->pointers.clear();
159 assert(this->keys.size() == this->pointers.size());
161 void swap(PermutationContainer &item)
163 assert(item.keys.size() == item.pointers.size());
165 this->keys.swap(item.keys);
166 this->pointers.swap(item.pointers);
168 assert(this->keys.size() == this->pointers.size());
170 static std::string name()
174 uint64_t psum([[maybe_unused]] uint64_t i)
const noexcept
178 uint64_t psum() const noexcept
182 int64_t search([[maybe_unused]] uint64_t x)
const noexcept
186 int64_t get_index(
const PermutationItem &&item)
const
188 int64_t size = this->pointers.
size();
189 for(int64_t i = 0; i < size; i++){
190 if(this->pointers[i] == item.pointer && this->keys[i] == item.key){
208 std::string to_string()
const
210 assert(this->keys.size() == this->pointers.size());
215 int64_t size = this->pointers.size();
216 for(int64_t i = 0; i < size; i++){
217 s +=
"(" + std::to_string(this->pointers[i]) +
", " + std::to_string(this->keys[i]) +
")";
218 if (i + 1 < (int64_t)this->size())
228 std::vector<PermutationItem> to_value_vector()
const
230 throw std::runtime_error(
"PermutationContainer::NO IMP1");
233 void insert(uint64_t pos, PermutationItem value)
235 this->keys.insert(pos, value.key);
236 this->pointers.insert(pos, value.pointer);
238 assert(this->keys.size() == this->pointers.size());
240 void remove(uint64_t pos)
242 this->keys.remove(pos);
243 this->pointers.remove(pos);
245 assert(this->keys.size() == this->pointers.size());
247 void push_front(
const std::vector<PermutationItem> &new_items)
249 std::vector<uint64_t> tmp_keys;
250 std::vector<uint64_t> tmp_pointers;
251 tmp_keys.resize(new_items.size());
252 tmp_pointers.resize(new_items.size());
254 for (int64_t i = 0; i < (int64_t)new_items.size(); i++)
256 tmp_keys[i] = new_items[i].key;
257 tmp_pointers[i] = new_items[i].pointer;
259 this->keys.push_front(tmp_keys);
260 this->pointers.push_front(tmp_pointers);
270 assert(this->keys.size() == this->pointers.size());
272 void push_front(
const PermutationItem &new_item)
274 this->keys.push_front(new_item.key);
275 this->pointers.push_front(new_item.pointer);
277 assert(this->keys.size() == this->pointers.size());
280 void push_back(
const std::vector<PermutationItem> &new_items)
282 for (
const PermutationItem &item : new_items)
284 this->keys.push_back(item.key);
285 this->pointers.push_back(item.pointer);
288 assert(this->keys.size() == this->pointers.size());
290 void push_back(PermutationItem value)
292 this->keys.push_back(value.key);
293 this->pointers.push_back(value.pointer);
295 assert(this->keys.size() == this->pointers.size());
297 PermutationItem pop_front()
299 uint64_t key = this->keys[0];
300 uint64_t pointer = this->pointers.head();
301 this->keys.pop_front();
302 this->pointers.pop_front();
304 assert(this->keys.size() == this->pointers.size());
305 return PermutationItem(pointer, key);
308 std::vector<PermutationItem> pop_front(uint64_t len)
310 std::vector<PermutationItem> r;
313 for (uint64_t i = 0; i < len; i++)
315 uint64_t key = this->keys[i];
316 uint64_t pointer = this->pointers[i];
317 r[i] = PermutationItem(pointer, key);
319 this->keys.pop_front(len);
320 this->pointers.pop_front(len);
322 assert(this->keys.size() == this->pointers.size());
326 PermutationItem pop_back()
328 assert(this->keys.size() > 0 && this->pointers.size() > 0);
329 uint64_t key = this->keys[this->keys.size() - 1];
330 uint64_t pointer = this->pointers.tail();
331 this->keys.pop_back();
332 this->pointers.pop_back();
334 assert(this->keys.size() == this->pointers.size());
335 return PermutationItem(pointer, key);
338 std::vector<PermutationItem> pop_back(uint64_t len)
340 std::vector<PermutationItem> tmp1;
345 tmp1[k--] = this->pop_back();
348 assert(this->keys.size() == this->pointers.size());
351 uint64_t reverse_psum([[maybe_unused]] uint64_t i)
const
355 uint64_t psum([[maybe_unused]] uint64_t i, [[maybe_unused]] uint64_t j)
const
359 uint8_t get_new_key(uint64_t pointer_to_linked_container)
const
361 std::array<uint64_t, 4> occurrence_flag_array;
362 occurrence_flag_array[0] = 0;
363 occurrence_flag_array[1] = 0;
364 occurrence_flag_array[2] = 0;
365 occurrence_flag_array[3] = 0;
368 int64_t size = this->pointers.size();
369 for(int64_t i = 0; i < size; i++){
370 uint64_t pointer = this->pointers[i];
371 if (pointer == pointer_to_linked_container)
373 uint64_t idx = this->keys[i] / 64;
374 uint64_t geta = idx * 64;
376 occurrence_flag_array[idx] = occurrence_flag_array[idx] | (1LL << (63 - (this->keys[i] - geta)));
381 for (uint64_t i = 0; i < 4; i++)
383 if (occurrence_flag_array[i] != UINT64_MAX)
385 uint64_t code_len = stool::LSBByte::get_code_length(~occurrence_flag_array[i]);
386 return (64 * i) + (64 - code_len);
389 throw std::invalid_argument(
"Error(PermutationIterator::get_new_key)");
392 void update_linked_tree(uint64_t ith, uint64_t leaf_index_of_this_container, uint64_t previous_leaf_index, Tree &linked_tree)
394 PermutationItem item = this->at(ith);
395 assert(item.pointer < linked_tree.get_leaf_container_vector_size());
396 PermutationContainer &container = linked_tree.get_leaf_container(item.pointer);
397 int64_t idx = container.get_index(PermutationItem(previous_leaf_index, item.key));
399 uint8_t new_key = container.get_new_key(leaf_index_of_this_container);
404 assert(idx < (int64_t)container.size());
405 container.pointers.set_value(idx, leaf_index_of_this_container);
406 container.keys.set_value(idx, new_key);
407 this->keys.set_value(ith, new_key);
409 assert(this->keys.size() == this->pointers.size());
411 void set_value(uint64_t ith,
const PermutationItem &&item)
413 assert(ith < this->size());
414 this->keys.set_value(ith, item.key);
415 this->pointers.set_value(ith, item.pointer);
417 assert(this->keys.size() == this->pointers.size());
420 static uint64_t get_byte_size(
const PermutationContainer &item)
422 return NaiveFLCVector<false>::get_byte_size(item.keys) + NaiveFLCVector<false>::get_byte_size(item.pointers);
425 static uint64_t get_byte_size(
const std::vector<PermutationContainer> &items)
427 uint64_t bytes =
sizeof(uint64_t);
428 for (
auto &it : items)
430 bytes += PermutationContainer::get_byte_size(it);
435 static void save(
const PermutationContainer &item, std::vector<uint8_t> &output, uint64_t &pos)
437 NaiveFLCVector<false>::save(item.keys, output, pos);
438 NaiveFLCVector<false>::save(item.pointers, output, pos);
440 static void save(
const PermutationContainer &item, std::ofstream &os)
442 NaiveFLCVector<false>::save(item.keys, os);
443 NaiveFLCVector<false>::save(item.pointers, os);
446 static void save(
const std::vector<PermutationContainer> &items, std::vector<uint8_t> &output, uint64_t &pos)
448 uint64_t size = items.size();
449 std::memcpy(output.data() + pos, &size,
sizeof(size));
452 for (
auto &it : items)
454 PermutationContainer::save(it, output, pos);
457 static void save(
const std::vector<PermutationContainer> &items, std::ofstream &os)
459 uint64_t size = items.size();
460 os.write(
reinterpret_cast<const char *
>(&size),
sizeof(size));
461 for (
auto &it : items)
463 PermutationContainer::save(it, os);
467 static PermutationContainer load(
const std::vector<uint8_t> &data, uint64_t &pos)
469 PermutationContainer r;
470 NaiveFLCVector<false> tmp1 = NaiveFLCVector<false>::load(data, pos);
471 NaiveFLCVector<false> tmp2 = NaiveFLCVector<false>::load(data, pos);
473 r.pointers.swap(tmp2);
477 static PermutationContainer load(std::ifstream &ifs)
479 PermutationContainer r;
480 NaiveFLCVector<false> tmp1 = NaiveFLCVector<false>::load(ifs);
481 NaiveFLCVector<false> tmp2 = NaiveFLCVector<false>::load(ifs);
483 r.pointers.swap(tmp2);
488 static std::vector<PermutationContainer> load_vector(
const std::vector<uint8_t> &data, uint64_t &pos)
491 std::memcpy(&size, data.data() + pos,
sizeof(size));
494 std::vector<PermutationContainer> r;
495 for (uint64_t i = 0; i < size; i++)
497 r.push_back(PermutationContainer::load(data, pos));
501 static std::vector<PermutationContainer> load_vector(std::ifstream &ifs)
504 ifs.read(
reinterpret_cast<char *
>(&size),
sizeof(size));
506 std::vector<PermutationContainer> r;
507 for (uint64_t i = 0; i < size; i++)
509 r.push_back(PermutationContainer::load(ifs));