X-Git-Url: http://git.nguyen.vg/gitweb/?a=blobdiff_plain;f=incbwt%2Fbits%2Fvectors.cpp;h=23a5a8a068c62a042902afab9fc80e5deeaee747;hb=13e254b7c0ee22dffbc7c3125cee0408f9b375da;hp=417688f2b56c74d439f08697455b847693f8dba6;hpb=e4b6bdc7cc2a1372e4d4dae50acac55cebcc7e9b;p=SXSI%2FTextCollection.git diff --git a/incbwt/bits/vectors.cpp b/incbwt/bits/vectors.cpp index 417688f..23a5a8a 100644 --- a/incbwt/bits/vectors.cpp +++ b/incbwt/bits/vectors.cpp @@ -64,6 +64,9 @@ mergeVectors(RLEVector* first, RLEVector* second, usint* positions, usint n, usi { if((first == 0 && second == 0) || positions == 0) { return 0; } + RLEVector::Iterator* first_iter = 0; + RLEVector::Iterator* second_iter = 0; + pair_type first_run; bool first_finished; if(first == 0) @@ -73,7 +76,8 @@ mergeVectors(RLEVector* first, RLEVector* second, usint* positions, usint n, usi } else { - first_run = first->selectRun(0, size); + first_iter = new RLEVector::Iterator(*first); + first_run = first_iter->selectRun(0, size); first_run.second++; first_finished = false; } @@ -85,7 +89,8 @@ mergeVectors(RLEVector* first, RLEVector* second, usint* positions, usint n, usi } else { - second_bit = second->select(0); + second_iter = new RLEVector::Iterator(*second); + second_bit = second_iter->select(0); } RLEEncoder encoder(block_size); @@ -97,9 +102,9 @@ mergeVectors(RLEVector* first, RLEVector* second, usint* positions, usint n, usi handleRun(encoder, run, first_run, positions[i]); if(first_run.second == 0) { - if(first->hasNext()) + if(first_iter->hasNext()) { - first_run = first->selectNextRun(size); + first_run = first_iter->selectNextRun(size); first_run.first += i; first_run.second++; } @@ -113,7 +118,7 @@ mergeVectors(RLEVector* first, RLEVector* second, usint* positions, usint n, usi if(i == second_bit) // positions[i] is one { handleOne(encoder, run, positions[i]); - second_bit = second->selectNext(); + second_bit = second_iter->selectNext(); } else // positions[i] is zero { @@ -128,9 +133,9 @@ mergeVectors(RLEVector* first, RLEVector* second, usint* positions, usint n, usi while(!first_finished) { handleRun(encoder, run, first_run, size); - if(first->hasNext()) + if(first_iter->hasNext()) { - first_run = first->selectNextRun(size); + first_run = first_iter->selectNextRun(size); first_run.first += n; first_run.second++; } @@ -142,6 +147,7 @@ mergeVectors(RLEVector* first, RLEVector* second, usint* positions, usint n, usi encoder.setRun(run.first, run.second); } + delete first_iter; delete second_iter; delete first; delete second; return new RLEVector(encoder, size); } @@ -153,6 +159,9 @@ mergeVectors(DeltaVector* first, DeltaVector* second, usint* positions, usint n, { if((first == 0 && second == 0) || positions == 0) { return 0; } + DeltaVector::Iterator* first_iter = 0; + DeltaVector::Iterator* second_iter = 0; + usint first_bit; bool first_finished; if(first == 0) @@ -162,7 +171,8 @@ mergeVectors(DeltaVector* first, DeltaVector* second, usint* positions, usint n, } else { - first_bit = first->select(0); + first_iter = new DeltaVector::Iterator(*first); + first_bit = first_iter->select(0); first_finished = false; } @@ -173,7 +183,8 @@ mergeVectors(DeltaVector* first, DeltaVector* second, usint* positions, usint n, } else { - second_bit = second->select(0); + second_iter = new DeltaVector::Iterator(*second); + second_bit = second_iter->select(0); } DeltaEncoder encoder(block_size); @@ -182,9 +193,9 @@ mergeVectors(DeltaVector* first, DeltaVector* second, usint* positions, usint n, while(!first_finished && first_bit < positions[i]) { encoder.setBit(first_bit); - if(first->hasNext()) + if(first_iter->hasNext()) { - first_bit = first->selectNext() + i; + first_bit = first_iter->selectNext() + i; } else { @@ -195,17 +206,18 @@ mergeVectors(DeltaVector* first, DeltaVector* second, usint* positions, usint n, if(i == second_bit) // positions[i] is one { encoder.setBit(positions[i]); - second_bit = second->selectNext(); + second_bit = second_iter->selectNext(); } } while(!first_finished) { encoder.setBit(first_bit); - if(!first->hasNext()) { break; } - first_bit = first->selectNext() + n; + if(!first_iter->hasNext()) { break; } + first_bit = first_iter->selectNext() + n; } + delete first_iter; delete second_iter; delete first; delete second; return new DeltaVector(encoder, size); }