#pragma interface #ifndef _LIST_H_ #define _LIST_H_ // list: internal building block template class list_node { public: list_node* next; list_node* prev; T element; list_node(); list_node(const T&); }; // list iterator is an interface to list node // with the usual pointer syntax template class list_iterator { protected: list_node* node; public: list_iterator(list_node* = (list_node*)0); int has_more_elements(); T& operator*(); T* operator->(); T& operator++(); T& operator--(); T& operator++(int); T& operator--(int); int operator==(const list_iterator&); int operator!=(const list_iterator&); T& operator[](int); list_iterator operator+(int); list_iterator operator-(int); list_node* getNode(); void invalidate(); }; // list class // operations: // insert_before(iterator,element) // insert_before(iterator,list) // insert_after(iterator,element) // insert_after(iterator,list) // sort // access: // iterator first // iterator last // template class list { protected: list_node* _first; list_node* _last; int size; void destroy(list_node*,list_node*); void copy(list_node*,list_node*,list_node*, list_node*,const list); bool (*less)(const T&,const T&); void split(list&,list&,const T&); public: void insert_before(list_iterator,const T&); void insert_after(list_iterator,const T&); void insert_before(list_iterator,const list&); void insert_after(list_iterator,const list&); void remove(list_iterator&); list_iterator first(); list_iterator last(); int length() const; void set_comparison(bool (*)(const T&,const T&)); list(bool (*)(const T&,const T&) = 0); list(const list&); list& operator=(const list&); virtual ~list(); void sort(); }; #endif