// ---------------------------------------------------------------------------- // // llist.hpp // // Author: Sameer Nene // Date: 05/24/96 // Version: 0.1 // Modification History: // Bugs: // // ---------------------------------------------------------------------------- #ifndef LLIST_INCLUDED #define LLIST_INCLUDED //#include // forward class declarations template class LListIter; template class LListManip; template class LLink { // Private members Type d_data; LLink *d_next_p; // Links cannot be copied or assigned LLink(const LLink&); LLink& operator=(const LLink&); // Public members public: // Construct & Destroy inline LLink(LLink **addLinkPtr, const Type &data); ~LLink() {} // Modifiers inline void setData(const Type &data); inline void setNext(LLink *link); inline LLink*& getNextRef(); // generally a bad practice // Accessors inline Type& getData(); inline LLink* getNext() const; }; template class LList { // Private members int d_length; LLink *d_head_p; // Friends friend LListIter; friend LListManip; // Public members public: // Construct & Destroy LList(); LList(const LList&); ~LList(); // Modifiers LList& operator=(const LList &list); LList& operator+=(const Type &i); LList& operator+=(const LList &list); LList& prepend(const Type &i); LList& prepend(const LList &list); // Accessors int length() const; }; //template ostream& operator<<(ostream& o, const LList& list); template class LListIter { // Private Data LLink *d_current_p; // Public Members public: // Construct and Destroy inline LListIter(const LList &list); inline LListIter(const LListIter &iter); ~LListIter() {} // Modifiers inline LListIter& operator=(const LListIter &iter); inline void operator++(); // Accessors inline operator const void* () const; inline Type& operator()() const; }; template class LListManip { // Private Data LList *d_list_p; LLink **d_current_p; // Links cannot be copied or assigned LListManip(const LListManip &manip); LListManip& operator=(const LListManip &manip); // Public Members public: // Construct and Destroy inline LListManip(LList *list); ~LListManip() {} // Modifiers inline void operator++(); inline void insert (const Type &data); inline void remove (); // Accessors inline operator const void *() const; inline Type& operator()() const; }; template LLink::LLink(LLink **addLinkPtr, const Type &data) : d_next_p(*addLinkPtr), d_data(data) { *addLinkPtr = this; } template void LLink::setData(const Type &data) { d_data = data; } template void LLink::setNext(LLink *link) { d_next_p = link; } template LLink*& LLink::getNextRef() { return d_next_p; } template Type& LLink::getData() { return d_data; } template LLink* LLink::getNext() const { return d_next_p; } template LList::LList() : d_head_p(0), d_length(0) { } template LList::LList(const LList& list) : d_head_p(0) { LListManip m(this); LListIter l(list); while(l) { m.insert(l()); ++l; ++m; } } template LList::~LList() { LListManip m(this); while(m != 0) m.remove(); } template LList& LList::operator=(const LList& list) { LListManip m(this); LListIter l(list); if(this != &list) { while(m) m.remove(); while(l) { m.insert(l()); ++l; ++m; } } return *this; } template LList& LList::operator+=(const Type &i) { LListManip m(this); while(m) ++m; m.insert(i); return *this; } template LList& LList::operator+=(const LList& list) { unsigned i, s; LListIter l(list); LListManip m(this); while(m) ++m; s = list.d_length; for(i = 0; i < s; ++i) { m.insert(l()); ++m; ++l; } return *this; } template LList& LList::prepend(const Type &i) { LListManip m(this); m.insert(i); return *this; } template LList& LList::prepend(const LList &list) { LListIter l(list); LListManip m(this); while(l) { m.insert(l()); ++m; ++l; } return *this; } template int LList::length() const { return d_length; } //template ostream& operator<<(ostream &o, const LList& list) //{ // LListIter l(list); // // o << "[ "; // while(l != 0) { // o << l(); // o << " "; // ++l; // } // return o << "]"; //} template LListIter::LListIter(const LList &list) : d_current_p(list.d_head_p) { } template LListIter::LListIter(const LListIter &iter) : d_current_p(iter.d_current_p) { } template LListIter& LListIter::operator=(const LListIter &iter) { d_current_p = iter.d_current_p; return *this; } template void LListIter::operator++() { d_current_p = d_current_p -> getNext(); } template Type& LListIter::operator()() const { return d_current_p -> getData(); } template LListIter::operator const void* () const { return d_current_p; } template LListManip::LListManip(LList *list) : d_current_p(&(list -> d_head_p)), d_list_p(list) { } template void LListManip::operator++() { d_current_p = &((*d_current_p) -> getNextRef()); } template void LListManip::insert(const Type &data) { new LLink(d_current_p, data); ++(d_list_p -> d_length); } template void LListManip::remove() { LLink *t = *d_current_p; *d_current_p = (*d_current_p) -> getNext(); delete t; --(d_list_p -> d_length); } template LListManip::operator const void* () const { return *d_current_p; } template Type& LListManip::operator()() const { return (*d_current_p) -> getData(); } #endif