8 #include "../misc/utils.h"
16 handleOne(RLEEncoder& encoder, pair_type& run, usint position)
24 if(position == run.first + run.second)
29 encoder.setRun(run.first, run.second);
35 handleRun(RLEEncoder& encoder, pair_type& run, pair_type& next, usint limit)
39 run.first = next.first;
40 run.second = std::min(limit - run.first, next.second);
41 next.first += run.second;
42 next.second -= run.second;
46 if(next.first == run.first + run.second)
48 usint cont = std::min(limit - next.first, next.second);
55 encoder.setRun(run.first, run.second);
56 run.first = next.first;
57 run.second = std::min(limit - run.first, next.second);;
58 next.first += run.second;
59 next.second -= run.second;
63 mergeVectors(RLEVector* first, RLEVector* second, usint* positions, usint n, usint size, usint block_size)
65 if((first == 0 && second == 0) || positions == 0) { return 0; }
71 first_run = pair_type(size, 0);
72 first_finished = true;
76 first_run = first->selectRun(0, size);
78 first_finished = false;
88 second_bit = second->select(0);
91 RLEEncoder encoder(block_size);
92 pair_type run = pair_type(size, 0);
93 for(usint i = 0; i < n; i++, first_run.first++)
95 while(!first_finished && first_run.first < positions[i])
97 handleRun(encoder, run, first_run, positions[i]);
98 if(first_run.second == 0)
102 first_run = first->selectNextRun(size);
103 first_run.first += i;
108 first_finished = true;
113 if(i == second_bit) // positions[i] is one
115 handleOne(encoder, run, positions[i]);
116 second_bit = second->selectNext();
118 else // positions[i] is zero
122 encoder.setRun(run.first, run.second);
128 while(!first_finished)
130 handleRun(encoder, run, first_run, size);
133 first_run = first->selectNextRun(size);
134 first_run.first += n;
142 encoder.setRun(run.first, run.second);
145 delete first; delete second;
146 return new RLEVector(encoder, size);
149 //--------------------------------------------------------------------------
152 mergeVectors(DeltaVector* first, DeltaVector* second, usint* positions, usint n, usint size, usint block_size)
154 if((first == 0 && second == 0) || positions == 0) { return 0; }
161 first_finished = true;
165 first_bit = first->select(0);
166 first_finished = false;
176 second_bit = second->select(0);
179 DeltaEncoder encoder(block_size);
180 for(usint i = 0; i < n; i++, first_bit++)
182 while(!first_finished && first_bit < positions[i])
184 encoder.setBit(first_bit);
187 first_bit = first->selectNext() + i;
191 first_finished = true;
195 if(i == second_bit) // positions[i] is one
197 encoder.setBit(positions[i]);
198 second_bit = second->selectNext();
202 while(!first_finished)
204 encoder.setBit(first_bit);
205 if(!first->hasNext()) { break; }
206 first_bit = first->selectNext() + n;
209 delete first; delete second;
210 return new DeltaVector(encoder, size);