template <typename Object>
NodeSequence<Object>::Position NodeSequence<Object>::
atRank(int rank) const // position of rank
throw(BoundaryViolationException) {
NodePtr v;
checkRank(rank);
if (rank <= size()/2) { // scan forward from head
v = header->next;
for (int i = 0; i < rank; i++)
v = v->next;
}
else { // scan back from tail
v = trailer->prev;
for (int i = 1; i < size()-rank; i++)
v = v->prev;
}
return Position(v);
}
template <typename Object>
int NodeSequence<Object>::
rankOf(const Position &p) const // get rank of position
throw(InvalidPositionException) {
NodePtr v = first();
int i = 0;
while (v != trailer) { // search for p.node
if (p.node == v) return i; // found it here
v = v->next; // else advance
i++;
} // did not find it?
throw InvalidPositionException("Position not found");
}