template <typename Object>
class NodeSequence : public NodeList<Object> {
protected: // utilities
void checkRank(int rank) const // check for valid rank
throw(BoundaryViolationException) {
if (rank < 0 || rank >= sz)
throw BoundaryViolationException("Invalid rank");
}
public:
typedef NodeList<Object>::Position Position;
Position atRank(int rank) const // position of rank
throw(BoundaryViolationException);
int rankOf(const Position& p) const // get rank of element
throw(InvalidPositionException);
Object elemAtRank (int rank) const // element at this rank
throw(BoundaryViolationException) {
checkRank(rank);
return atRank(rank).element();
}
void insertAtRank (int rank, const Object& element) // insert at given rank
throw(BoundaryViolationException) {
if (rank == size()) // no checkRank if last
insertLast(element);
else {
checkRank(rank);
insertBefore( atRank(rank), element );
}
}
void removeAtRank (int rank) // remove from rank
throw(BoundaryViolationException) {
checkRank(rank);
Position p = atRank(rank); // position to remove
remove(p);
}
void replaceAtRank (int rank, const Object& element) // replace at rank
throw(BoundaryViolationException) {
checkRank(rank);
replaceElement( atRank(rank), element );
}
};