@@ -130,13 +130,13 @@ class SequenceIDNodePool {
130
130
* Each page records the sequence excatly ends with the prefix tokens stored in page. In other word,
131
131
* all sequences locate in the boundary of each page, or the end of each page.
132
132
*/
133
- struct RedixPage {
133
+ struct RadixPage {
134
134
/* ! \brief The parent page. */
135
- RedixPage * parent;
135
+ RadixPage * parent;
136
136
/* ! \brief The first child page. */
137
- RedixPage * first_child;
137
+ RadixPage * first_child;
138
138
/* ! \brief The sibling page shareing the same parent page. */
139
- RedixPage * next_sibiling;
139
+ RadixPage * next_sibiling;
140
140
/* ! \brief The head of sequence ID linked list. */
141
141
SequenceIDNode* seq_ids;
142
142
/* ! \brief The capacity of maximum stored prefix tokens. */
@@ -146,7 +146,7 @@ struct RedixPage {
146
146
/* ! \brief The length of stored prefix tokens. The legal value is of [0, capacity). */
147
147
size_t length;
148
148
/* ! \brief The offset of first prefix token in memory layout. */
149
- static constexpr int kDataOffset = (sizeof (RedixPage *) * 3 + sizeof (SequenceIDNode*) +
149
+ static constexpr int kDataOffset = (sizeof (RadixPage *) * 3 + sizeof (SequenceIDNode*) +
150
150
sizeof (size_t ) * 3 + sizeof (int32_t ) - 1 ) /
151
151
sizeof (int32_t );
152
152
@@ -242,7 +242,7 @@ struct RedixPage {
242
242
std::vector<int64_t > FindAllChildSequence () {
243
243
std::vector<int64_t > output = GetLocalSequence ();
244
244
if (first_child) {
245
- first_child->Iterate ([&output](const RedixPage * page) {
245
+ first_child->Iterate ([&output](const RadixPage * page) {
246
246
for (SequenceIDNode* node = page->seq_ids ; node; node = node->next ) {
247
247
output.push_back (node->id );
248
248
}
@@ -267,10 +267,10 @@ struct RedixPage {
267
267
* \return The page whose next_sibling is current page, or nullptr if current is the fisrt_child
268
268
* of its parent page.
269
269
*/
270
- RedixPage * GetLastSibling () {
270
+ RadixPage * GetLastSibling () {
271
271
if (parent == nullptr ) return nullptr ;
272
272
if (parent->first_child == this ) return nullptr ;
273
- for (RedixPage * child = parent->first_child ; child; child = child->next_sibiling ) {
273
+ for (RadixPage * child = parent->first_child ; child; child = child->next_sibiling ) {
274
274
if (child->next_sibiling == this ) return child;
275
275
}
276
276
return nullptr ;
@@ -280,17 +280,17 @@ struct RedixPage {
280
280
* \brief Find the child indexed by first token.
281
281
* \return The child page started with first token, or nullptr if no such child page.
282
282
*/
283
- RedixPage * FindChild (int64_t first_token) {
283
+ RadixPage * FindChild (int64_t first_token) {
284
284
int32_t casted = first_token;
285
285
// Iterate all child radix pages, as the child radix pages are stored unorderly.
286
- for (RedixPage * child = first_child; child; child = child->next_sibiling ) {
286
+ for (RadixPage * child = first_child; child; child = child->next_sibiling ) {
287
287
if ((*child)[0 ] == casted) return child;
288
288
}
289
289
return nullptr ;
290
290
}
291
291
292
292
/* ! \brief Insert a new child page. */
293
- void InsertChild (RedixPage * child) {
293
+ void InsertChild (RadixPage * child) {
294
294
child->parent = this ;
295
295
child->next_sibiling = first_child;
296
296
first_child = child;
@@ -300,7 +300,7 @@ struct RedixPage {
300
300
* \brief Remove a child page.
301
301
* \throw Error if page to be removed is not child page.
302
302
*/
303
- void RemoveChild (RedixPage * child) {
303
+ void RemoveChild (RadixPage * child) {
304
304
CHECK (child->parent == this );
305
305
if (first_child == child) {
306
306
first_child = child->next_sibiling ;
@@ -362,14 +362,14 @@ class RadixPagePool {
362
362
* If there is no available page, it will allocate a new radix page block.
363
363
* \return The allocated radix page.
364
364
*/
365
- RedixPage * Allocate () {
365
+ RadixPage * Allocate () {
366
366
if (free_page_indices_.empty ()) {
367
367
NewPageBlock_ ();
368
368
CHECK (!free_page_indices_.empty ());
369
369
}
370
370
int id = free_page_indices_.back ();
371
371
free_page_indices_.pop_back ();
372
- RedixPage * page = pages_[id];
372
+ RadixPage * page = pages_[id];
373
373
used_pages_[page] = id;
374
374
page->parent = page->first_child = page->next_sibiling = nullptr ;
375
375
page->capacity = kPageCapacity_ ;
@@ -382,7 +382,7 @@ class RadixPagePool {
382
382
* \brief Free a radix page to pool.
383
383
* \param page The radix page to free.
384
384
*/
385
- void Free (RedixPage * page) {
385
+ void Free (RadixPage * page) {
386
386
CHECK_EQ (page->seq_ids , nullptr );
387
387
CHECK (used_pages_.find (page) != used_pages_.end ());
388
388
free_page_indices_.push_back (used_pages_[page]);
@@ -423,17 +423,17 @@ class RadixPagePool {
423
423
/* ! \brief The page capacity of each paged radix tree page. */
424
424
static constexpr size_t kPageCapacity_ = 64 ;
425
425
/* ! \brief The page size of each paged radix tree page. */
426
- static constexpr size_t kPageSize_ = kPageCapacity_ + RedixPage ::kDataOffset ;
426
+ static constexpr size_t kPageSize_ = kPageCapacity_ + RadixPage ::kDataOffset ;
427
427
/* ! \brief The raw paged radix tree page block pool,
428
428
each element is a raw paged radix tree page array. */
429
429
std::vector<int32_t *> page_blocks_;
430
430
/* ! \brief The paged radix tree page pool,
431
431
each element is a raw paged radix tree page pointer. */
432
- std::vector<RedixPage *> pages_;
432
+ std::vector<RadixPage *> pages_;
433
433
/* ! \brief The indices of free paged radix page in page pool. */
434
434
std::vector<size_t > free_page_indices_;
435
435
/* ! \brief The map from used paged radix tree page to its index in page pool. */
436
- std::unordered_map<RedixPage *, size_t > used_pages_;
436
+ std::unordered_map<RadixPage *, size_t > used_pages_;
437
437
438
438
/* ! \brief Allocate a new page pool block. */
439
439
void NewPageBlock_ () {
@@ -442,7 +442,7 @@ class RadixPagePool {
442
442
pages_.reserve (pages_.size () + kPageBlockSize_ );
443
443
free_page_indices_.reserve (free_page_indices_.size () + kPageBlockSize_ );
444
444
for (size_t i = 0 ; i < kPageBlockSize_ ; ++i) {
445
- pages_.push_back (reinterpret_cast <RedixPage *>(page_blocks_.back () + i * kPageSize_ ));
445
+ pages_.push_back (reinterpret_cast <RadixPage *>(page_blocks_.back () + i * kPageSize_ ));
446
446
free_page_indices_.push_back (i + page_id_offset);
447
447
}
448
448
}
@@ -456,19 +456,19 @@ class RadixPagePool {
456
456
class PagedRadixTreeImpl : public PagedRadixTreeObj {
457
457
public:
458
458
/* ! \brief The map from sequence to paged radix tree node it is stored. */
459
- std::unordered_map<int32_t , RedixPage *> seq2page;
459
+ std::unordered_map<int32_t , RadixPage *> seq2page;
460
460
/* ! \brief The sequence ID node pool. */
461
461
SequenceIDNodePool* seq_id_node_pool = nullptr ;
462
462
/* ! \brief The radix page pool. */
463
463
RadixPagePool* radix_page_pool = nullptr ;
464
464
/* ! \brief The root page of paged radix tree. */
465
- RedixPage * root = nullptr ;
465
+ RadixPage * root = nullptr ;
466
466
467
467
explicit PagedRadixTreeImpl () {
468
468
seq_id_node_pool = new SequenceIDNodePool ();
469
469
radix_page_pool = new RadixPagePool ();
470
470
471
- root = reinterpret_cast <RedixPage *>(new int32_t [RedixPage ::kDataOffset ]);
471
+ root = reinterpret_cast <RadixPage *>(new int32_t [RadixPage ::kDataOffset ]);
472
472
root->parent = root->first_child = root->next_sibiling = nullptr ;
473
473
root->offset = root->length = root->capacity = 0 ;
474
474
root->seq_ids = nullptr ;
@@ -493,7 +493,7 @@ class PagedRadixTreeImpl : public PagedRadixTreeObj {
493
493
size_t length = GetSequenceLength (seq_id);
494
494
std::vector<int64_t > output (length);
495
495
size_t offset = length;
496
- for (RedixPage * page = seq2page[seq_id]; page; page = page->parent ) {
496
+ for (RadixPage * page = seq2page[seq_id]; page; page = page->parent ) {
497
497
offset -= page->length ;
498
498
for (int i = 0 ; i < page->length ; ++i) {
499
499
output[offset + i] = (*page)[i];
@@ -524,7 +524,7 @@ class PagedRadixTreeImpl : public PagedRadixTreeObj {
524
524
size_t GetSequenceLength (int64_t seq_id) {
525
525
CHECK (seq2page.find (seq_id) != seq2page.end ());
526
526
size_t length = 0 ;
527
- for (RedixPage * page = seq2page[seq_id]; page; page = page->parent ) {
527
+ for (RadixPage * page = seq2page[seq_id]; page; page = page->parent ) {
528
528
length += page->length ;
529
529
}
530
530
return length;
@@ -546,7 +546,7 @@ class PagedRadixTreeImpl : public PagedRadixTreeObj {
546
546
CHECK_GT (forked_offset, 0 );
547
547
size_t length = GetSequenceLength (parent_seq_id);
548
548
CHECK_LE (forked_offset, length);
549
- for (RedixPage * page = seq2page[parent_seq_id]; page; page = page->parent ) {
549
+ for (RadixPage * page = seq2page[parent_seq_id]; page; page = page->parent ) {
550
550
if (forked_offset >= length - page->length ) {
551
551
if (forked_offset < length) {
552
552
// Split radix page if forked position is within page
@@ -582,7 +582,7 @@ class PagedRadixTreeImpl : public PagedRadixTreeObj {
582
582
CHECK (seq2page.find (seq_id) != seq2page.end ());
583
583
const int64_t * suffix = tokens.data ();
584
584
size_t length = tokens.size ();
585
- RedixPage * original_page = seq2page[seq_id];
585
+ RadixPage * original_page = seq2page[seq_id];
586
586
original_page->PopSequence (seq_id_node_pool, seq_id);
587
587
auto [page, offset, in_page_offset] = MatchSequence (original_page, suffix, length);
588
588
if (in_page_offset < page->length ) {
@@ -597,7 +597,7 @@ class PagedRadixTreeImpl : public PagedRadixTreeObj {
597
597
}
598
598
while (offset < length) {
599
599
// Allocate new radix page and extend tokens
600
- RedixPage * new_page = radix_page_pool->Allocate ();
600
+ RadixPage * new_page = radix_page_pool->Allocate ();
601
601
page->InsertChild (new_page);
602
602
page = new_page;
603
603
size_t suffix_length = std::min (page->capacity - page->length , length - offset);
@@ -628,14 +628,14 @@ class PagedRadixTreeImpl : public PagedRadixTreeObj {
628
628
AddSequence (seq_id);
629
629
return ;
630
630
}
631
- RedixPage * page = seq2page[seq_id];
631
+ RadixPage * page = seq2page[seq_id];
632
632
// Remove the sequence temporarily, but keeping the data and starting rolling back.
633
633
page->PopSequence (seq_id_node_pool, seq_id);
634
634
seq2page.erase (seq_id);
635
635
while (page->length <= num_tokens) {
636
636
// Roll back entire page
637
637
num_tokens -= page->length ;
638
- RedixPage * parent = page->parent ;
638
+ RadixPage * parent = page->parent ;
639
639
if (page->seq_ids == nullptr && page->first_child == nullptr ) {
640
640
// The leaf page is removable
641
641
parent->RemoveChild (page);
@@ -666,11 +666,11 @@ class PagedRadixTreeImpl : public PagedRadixTreeObj {
666
666
* \throw Error if sequence ID is not valid.
667
667
*/
668
668
void RemoveSequence (int64_t seq_id) {
669
- RedixPage * page = seq2page[seq_id];
669
+ RadixPage * page = seq2page[seq_id];
670
670
page->PopSequence (seq_id_node_pool, seq_id);
671
671
seq2page.erase (seq_id);
672
672
while (page->parent && !page->seq_ids && !page->first_child ) {
673
- RedixPage * parent = page->parent ;
673
+ RadixPage * parent = page->parent ;
674
674
parent->RemoveChild (page);
675
675
radix_page_pool->Free (page);
676
676
page = parent;
@@ -710,15 +710,15 @@ class PagedRadixTreeImpl : public PagedRadixTreeObj {
710
710
* And the page to be merged should be page->Mergeable().
711
711
* \param page The parent radix tree page.
712
712
*/
713
- void MergePage (RedixPage * page) {
713
+ void MergePage (RadixPage * page) {
714
714
CHECK (page->Mergeable ());
715
- RedixPage * child = page->first_child ;
715
+ RadixPage * child = page->first_child ;
716
716
for (int i = 0 ; i < child->length ; ++i) {
717
717
(*page)[i + page->length ] = (*child)[i];
718
718
}
719
719
page->length += child->length ;
720
720
page->first_child = child->first_child ;
721
- for (RedixPage * p = child->first_child ; p; p = p->next_sibiling ) {
721
+ for (RadixPage * p = child->first_child ; p; p = p->next_sibiling ) {
722
722
p->parent = page;
723
723
}
724
724
page->seq_ids = child->seq_ids ;
@@ -736,12 +736,12 @@ class PagedRadixTreeImpl : public PagedRadixTreeObj {
736
736
* \return The splitted radix tree page. It can be different from the input radix tree page, as
737
737
* there may be implicit radix tree page merge.
738
738
*/
739
- RedixPage * SplitPage (RedixPage * page, size_t offset) {
739
+ RadixPage * SplitPage (RadixPage * page, size_t offset) {
740
740
CHECK_LT (offset, page->length );
741
- RedixPage * child = radix_page_pool->Allocate ();
741
+ RadixPage * child = radix_page_pool->Allocate ();
742
742
child->parent = page;
743
743
child->first_child = page->first_child ;
744
- for (RedixPage * p = page->first_child ; p; p = p->next_sibiling ) {
744
+ for (RadixPage * p = page->first_child ; p; p = p->next_sibiling ) {
745
745
p->parent = child;
746
746
}
747
747
page->first_child = child;
@@ -772,11 +772,11 @@ class PagedRadixTreeImpl : public PagedRadixTreeObj {
772
772
* \param tokens The given tokens to match.
773
773
* \param length The length of given tokens.
774
774
*/
775
- std::tuple<RedixPage *, size_t , size_t > MatchSequence (RedixPage * page, const int64_t * tokens,
775
+ std::tuple<RadixPage *, size_t , size_t > MatchSequence (RadixPage * page, const int64_t * tokens,
776
776
size_t length) {
777
777
size_t offset = 0 ;
778
778
while (offset < length) {
779
- if (RedixPage * child = page->FindChild (tokens[offset])) {
779
+ if (RadixPage * child = page->FindChild (tokens[offset])) {
780
780
// If child page starts with offset-th token, common prefix at least ends with child page
781
781
size_t matched_offset = child->MatchPrefix (tokens + offset, length - offset);
782
782
offset += matched_offset;
0 commit comments