34 return firstBlockIndex;
37 return firstBlockIndex + posns.size() - 1;
39 int firstValue()
const {
42 int lastValue()
const {
47 void add(
int from,
Double p) {
48 posns.push_back(from);
53 copy(from.posns.begin(), from.posns.end(), back_inserter(posns));
54 factor *= from.factor;
57 int operator[] (
int b)
const {
58 return posns[b - firstBlockIndex];
68 Position targetPosAt(
int offset)
const {
69 return Position(last(), (offset +1 - lastValue())/3);
93 throw ProjectError(
"invalid iterator end() dereferenced");
100 throw ProjectError(
"invalid iterator end() dereferenced");
105 return node==other.node;
112 return node!=other.node;
115 node = node->next_by_first;
119 node = node->previous_by_first;
127 node = node->next_by_first;
128 delete node->previous_by_first;
142 if (node->previous_by_first->item == 0)
143 throw ProjectError(
"invalid iterator rend() dereferenced");
145 return *(node->previous_by_first->item);
149 if (node->previous_by_first->item == 0)
150 throw ProjectError(
"invalid iterator rend() dereferenced");
152 return node->previous_by_first->item;
155 node = node->previous_by_first;
159 node = node->previous_by_first;
163 node = node->next_by_first;
167 node = node->next_by_first;
168 return iterator(node->previous_by_first);
171 delete node->previous_by_first;
179 node = node->next_by_last;
183 node = node->next_by_last;
184 return iterator(node->previous_by_last);
187 node = node->previous_by_last;
195 node = node->next_by_last;
196 delete node->previous_by_last;
206 previous_by_first(this),
208 previous_by_last(this),
211 if (previous_by_first !=
this || next_by_first !=
this || previous_by_last !=
this)
219 insert_this(by_first, by_last);
221 HitSequenceNode(
int b,
int i,
const Double& p,
222 HitSequenceNode* by_first,
223 HitSequenceNode* by_last) :
224 item(new HitSequence(b,i,p))
226 insert_this(by_first, by_last);
234 void insert_this(HitSequenceNode* by_first,
235 HitSequenceNode* by_last) {
236 previous_by_first = by_first->previous_by_first;
237 next_by_first = by_first;
239 previous_by_last = by_last->previous_by_last;
240 next_by_last = by_last;
242 by_first->previous_by_first
243 = previous_by_first->next_by_first
244 = by_last->previous_by_last
245 = previous_by_last->next_by_last
249 previous_by_first->next_by_first = next_by_first;
250 next_by_first->previous_by_first = previous_by_first;
251 previous_by_last->next_by_last = next_by_last;
252 next_by_last->previous_by_last = previous_by_last;
257 this == previous_by_first->next_by_first &&
258 this == next_by_first->previous_by_first &&
259 this == previous_by_last->next_by_last &&
260 this == next_by_last->previous_by_last;
265 friend iterator createNode(
const HitSequence& hs, iterator it, iterator lit) {
266 return new HitSequenceNode(hs, it.node, lit.node);
268 friend iterator createNode(
int b,
int i,
const Double& p, iterator it, iterator lit) {
269 return new HitSequenceNode(b, i, p, it.node, lit.node);
274 HitSequenceNode* previous_by_first;
275 HitSequenceNode* next_by_first;
276 HitSequenceNode* previous_by_last;
277 HitSequenceNode* next_by_last;
371 void addSingle(
int b,
int offset,
const Double& val) {
372 createNode(b, offset, val, end(b), lbegin(b));
374 void addSingleFront(
int b,
int offset,
const Double& val) {
375 createNode(b, offset, val, begin(b), lend(b));
381 for (
unsigned b=0; b<lists.size(); b++)
385 for (
unsigned b=0; b<lists.size(); b++)
394 void reset(
int size) {
397 generate_n(lists.begin(), size, &newlist);
401 generate(lists.begin(), lists.end(), &newlist);
406 return list(b).begin();
409 return list(b).end();
412 return list(b).rbegin();
415 return list(b).rend();
418 return list(b).lbegin();
421 return list(b).lend();
426 if (lists[b]->inconsistent())
432 vector<HitSequenceList*> lists;