#if ! defined _Simple_List_h #define _Simple_List_h 1 /* * Linked lists with an interface like a bit of libg++'s SLSimple_List class */ #include #include #include #include namespace omega { #define Simple_List Omega_Simple_List #define Simple_List_Iterator Omega_Simple_List_Iterator template class Simple_List_Iterator; // A TEMPORARY HACK - ERROR IF YOU TRY TO USE "INDEX" - FERD template class Simple_List : public Sequence { public: Simple_List(const Simple_List &l) { contents = l.contents ? new List_Element(*l.contents) : 0; } Simple_List() { contents = 0; } virtual ~Simple_List() { delete contents; } Iterator *new_iterator(); const T &operator[](int) const; T &operator[](int); int size() const; int length() const { return size(); } int empty() const { return size() == 0; } T &front() const; // insertion/deletion on a list invalidates any iterators // that are on/after the element added/removed T remove_front(); void prepend(const T &item); void append(const T &item); void del_front(); void clear(); void join(Simple_List &consumed); int index(const T &) const { assert(0&&"ILLEGAL SimpleList operation\n"); return -1; } private: friend class Simple_List_Iterator; List_Element **end() { List_Element **e = &contents; while (*e) e = &((*e)->tail); return e; } List_Element *contents; }; template class Simple_List_Iterator : public List_Element_Iterator { public: Simple_List_Iterator(Simple_List &l); Simple_List_Iterator(const Simple_List &l); Simple_List_Iterator(); private: List_Element &element() { return *this->i; } ; friend class Simple_List; }; } // namespace #define instantiate_Simple_List(T) template class Simple_List; \ template class Simple_List_Iterator; \ instantiate_Only_List_Element(T) \ instantiate_Sequence(T) namespace omega { template Simple_List_Iterator::Simple_List_Iterator(Simple_List &l) : List_Element_Iterator(l.contents) {} template Simple_List_Iterator::Simple_List_Iterator(const Simple_List &l) : List_Element_Iterator(l.contents) {} template Simple_List_Iterator::Simple_List_Iterator() : List_Element_Iterator(0) {} template Iterator *Simple_List::new_iterator() { return new Simple_List_Iterator(*this); } template const T &Simple_List::operator[](int i) const { Simple_List_Iterator p(*this); while(--i > 0 && p) p++; if (p) return *p; else return *((T *)0); } template T &Simple_List::operator[](int i) { Simple_List_Iterator p(*this); while(--i > 0 && p) p++; if (p) return *p; else return *((T *)0); } template int Simple_List::size() const { int i = 0; List_Element * p = contents; while (p) { p = p->tail; i++; } return i; } template T &Simple_List::front() const { return contents->head; } template T Simple_List::remove_front() { List_Element *frunt = contents; contents = contents->tail; T fruntT = frunt->head; frunt->tail = 0; delete frunt; return fruntT; } template void Simple_List::prepend(const T &item) { contents = new List_Element(item, contents); } template void Simple_List::append(const T &item) { *(end()) = new List_Element(item, 0); } template void Simple_List::del_front() { List_Element *e = contents; contents = contents->tail; e->tail = 0; delete e; } template void Simple_List::clear() { delete contents; contents = 0; } template void Simple_List::join(Simple_List &consumed) { List_Element *e = consumed.contents; consumed.contents = 0; *(end()) = e; } } // namespace #endif