16 std::vector<std::vector<BIT_SEQUENCE>> bits_seq;
17 std::vector<int64_t> char_rank_vec;
18 std::vector<uint8_t> alphabet;
24 this->alphabet.clear();
42 std::vector<bool> bits;
63 this->bits_seq[
h][i].swap(
dbs);
64 if (
h + 1 < rank_bit_size)
68 std::vector<uint8_t>
left;
84 std::vector<uint8_t>
right;
114 this->char_rank_vec.
swap(
item.char_rank_vec);
116 std::swap(this->rank_bit_size,
item.rank_bit_size);
126 this->bits_seq[i][j].clear();
130 this->bits_seq.clear();
131 this->char_rank_vec.clear();
132 this->alphabet.clear();
136 void set_alphabet(
const std::vector<uint8_t> &
_alphabet)
142 this->alphabet.push_back(
c);
144 std::sort(this->alphabet.begin(),
this->alphabet.end());
146 this->char_rank_vec.resize(256, -1);
149 this->char_rank_vec[alphabet[i]] = i;
151 this->rank_bit_size = stool::LSBByte::get_code_length(alphabet.size() - 1);
153 for (
uint64_t i = 0; i < rank_bit_size; i++)
155 this->bits_seq.push_back(std::vector<BIT_SEQUENCE>());
172 return this->alphabet.
size();
181 this->bits_seq[i][j].
clear();
188 if (!this->has_empty_alphabet())
190 return this->bits_seq[0][0].
size();
199 return this->bits_seq.
size();
209 for (
uint64_t i = 0; i < this->rank_bit_size; i++)
211 bool b = stool::LSBByte::get_bit(
c_rank, this->rank_bit_size - 1 - i);
212 this->bits_seq[i][
pos].push_back(
b ? 1 : 0);
222 bool b1 = stool::LSBByte::get_bit(
c_rank, this->rank_bit_size - 1);
233 for (
uint64_t i = 1; i < this->rank_bit_size; i++)
235 bool bx = stool::LSBByte::get_bit(
c_rank, this->rank_bit_size - 1 - i);
237 if (
nth >= this->bits_seq[i][
next].size())
240 throw std::range_error(
"Error: DynamicSequence::rank_sub()");
276 while (
h < (
int64_t)this->rank_bit_size)
304 bool hbit = stool::LSBByte::get_bit(
c_rank, this->rank_bit_size -
h - 1);
308 j = (j * 2) + (
hbit ? 1 : 0);
313 throw std::range_error(
"Error: DynamicSequence::insert(nth, c_rank)");
318 bool has_empty_alphabet()
const
320 return this->rank_bit_size == 0;
324 if (!this->has_empty_alphabet())
330 if (
c_rank == -1 || i == 0)
336 return this->rank_sub(i - 1,
c_rank);
347 if (!this->has_empty_alphabet())
359 return this->select_sub(i + 1,
c_rank);
367 void push_many(
const std::vector<uint8_t> &
str)
376 assert(!this->has_empty_alphabet());
377 if (!this->has_empty_alphabet())
383 throw std::runtime_error(
"Error: DynamicSequence::push_back()");
387 this->push_back_sub(
c_rank);
392 throw std::runtime_error(
"Error: DynamicSequence::push_back()");
397 assert(!this->has_empty_alphabet());
398 if (!this->has_empty_alphabet())
408 j = (j * 2) + (
b ? 1 : 0);
414 throw std::range_error(
"Error: DynamicSequence::get_nth_char_rank(nth)");
419 throw std::range_error(
"Error: DynamicSequence::get_nth_char_rank(nth)");
424 assert(!this->has_empty_alphabet());
425 if (!this->has_empty_alphabet())
427 return this->alphabet[this->get_nth_char_rank(
nth)];
431 throw std::range_error(
"Error: DynamicSequence::at(nth)");
447 j = (j * 2) + (
b ? 1 : 0);
452 throw std::range_error(
"Error: DynamicSequence::remove(nth)");
458 assert(!this->has_empty_alphabet());
459 if (!this->has_empty_alphabet())
465 throw std::runtime_error(
"Error: DynamicSequence::insert(nth, c)");
474 throw std::runtime_error(
"Error: DynamicSequence::insert(nth, c)");
477 std::string to_string()
const
481 for (
uint64_t i = 0; i < this->size(); i++)
487 std::vector<uint8_t> to_uint8_str()
const
489 std::vector<uint8_t>
s;
491 for (
uint64_t i = 0; i < this->size(); i++)
499 return this->char_rank_vec[
c];
504 std::cout <<
"================DynamicSequence==================" << std::endl;
505 stool::DebugPrinter::print_characters(this->alphabet,
"Alphabet");
506 stool::DebugPrinter::print_integers(this->char_rank_vec,
"Char_rank_vec");
507 std::cout <<
"Rank_bit_size: " << this->rank_bit_size << std::endl;
509 for (
uint64_t i = 0; i < this->rank_bit_size; i++)
511 std::cout <<
"level: " << i <<
" / count: " << this->bits_seq[i].
size() << std::endl;
514 std::cout << this->bits_seq[i][j].to_string() << std::endl;
517 std::cout <<
"==================================" << std::endl;
525 uint64_t get_smallest_character_in_alphabet()
const
527 assert(this->alphabet.size() > 0);
528 return this->alphabet[0];
542 return this->bits_seq[this->bits_seq.size() - 1][idx].count_c(
b);
551 for (
auto &
it :
item.bits_seq)
571 for (
auto &
it :
r.bits_seq)
594 void print_statistics(
int message_paragraph = stool::Message::SHOW_MESSAGE)
const
596 std::cout << stool::Message::get_paragraph_string(
message_paragraph) <<
"Statistics(DynamicWaveletTree):" << std::endl;
597 std::cout << stool::Message::get_paragraph_string(
message_paragraph + 1) <<
"Alphabet size: " << this->alphabet.
size() << std::endl;
598 std::cout << stool::Message::get_paragraph_string(
message_paragraph + 1) <<
"Text length: " << this->size() << std::endl;
599 std::cout << stool::Message::get_paragraph_string(
message_paragraph + 1) <<
"Estimated memory usage: " << this->size_in_bytes() <<
" bytes" << std::endl;
600 std::cout << stool::Message::get_paragraph_string(
message_paragraph) <<
"[END]" << std::endl;
602 std::vector<std::string> get_memory_usage_info(
int message_paragraph = stool::Message::SHOW_MESSAGE)
const
604 std::vector<std::string>
r;
605 r.
push_back(stool::Message::get_paragraph_string(
message_paragraph) +
"=DynamicWaveletTree: " + std::to_string(this->size_in_bytes()) +
" bytes =");
631 std::cout << stool::Message::get_paragraph_string(
message_paragraph) <<
"Content(DynamicWaveletTree):" << std::endl;
632 std::cout << stool::Message::get_paragraph_string(
message_paragraph+1) <<
"String: " << this->to_string() << std::endl;
633 std::cout << stool::Message::get_paragraph_string(
message_paragraph) <<
"[END]" << std::endl;
636 void print_memory_usage(
int message_paragraph = stool::Message::SHOW_MESSAGE)
const
639 for (std::string &
s :
log)
641 std::cout <<
s << std::endl;