#include namespace omega { template List_Iterator::List_Iterator(List &l) : List_Element_Iterator(l.contents) {} template List_Iterator::List_Iterator(const List &l) : List_Element_Iterator(l.contents) {} template List_Iterator::List_Iterator() : List_Element_Iterator(0) {} template Iterator *List::new_iterator() { return new List_Iterator(*this); } template const T &List::operator[](int i) const { assert(i > 0 && "Subscript out of bounds"); List_Iterator p(*this); while(--i > 0 && p) p++; if (p) return *p; else return *((T *)0); } template T &List::operator[](int i) { assert(i > 0 && "Subscript out of bounds"); List_Iterator p(*this); while(--i > 0 && p) p++; if (p) return *p; else return *((T *)0); } template int List::index(const T &item) const { List_Iterator p(*this); int i = 1; while(p && *p != item) { p++; i++; } if (p) return i; else return 0; } template int List::size() const { int i = 0; List_Element * p = contents; while (p) { p = p->tail; i++; } return i; } template T &List::front() const { return contents->head; } template T List::remove_front() { List_Element *frunt = contents; contents = contents->tail; T fruntT = frunt->head; frunt->tail = 0; delete frunt; return fruntT; } template void List::prepend(const T &item) { contents = new List_Element(item, contents); } template void List::append(const T &item) { *(end()) = new List_Element(item, 0); } template void List::ins_after(List_Iterator i, const T &item) { #if ! defined NDEBUG for (List_Element *e = contents; e != &(i.element()); e=e->tail) { assert(e); } #endif i.element().tail = new List_Element(item, i.element().tail); } template void List::del_front() { List_Element *e = contents; contents = contents->tail; e->tail = 0; delete e; } template void List::del_after(List_Iterator i) { #if ! defined NDEBUG for (List_Element *e0 = contents; e0 != &(i.element()); e0=e0->tail) { assert(e0); } #endif List_Element *e = i.element().tail; i.element().tail = e->tail; e->tail = 0; delete e; } template void List::clear() { delete contents; contents = 0; } template void List::join(List &consumed) { List_Element *e = consumed.contents; consumed.contents = 0; *(end()) = e; } } // namespace