/* list.tcc -- implement List source file of the Flower Library (c) 1997 Han-Wen Nienhuys */ #ifndef LIST_CC #define LIST_CC // instantiate a template: explicit instantiation. #define LIST_INSTANTIATE(a) class List; template class Cursor; \ template class Link #include "list.hh" template List::List (List const&src) { set_empty(); // probably el stupido for (Cursor c (src); c.ok(); c++) bottom().add (c); } template void List::OK() const { int i = size_; Link *lp = top_; while (i--) { assert (lp); lp->OK(); lp = lp->next(); } assert (!lp); i = size_; lp = bottom_; while (i--) { assert (lp); lp->OK(); lp = lp->previous(); } assert (!lp); } template void List::junk_links() { Cursor c (*this); while (c.ok()) c.del(); } template List::~List() { junk_links(); } /** add after after_me. Procedure: \begin{itemize} \item if #after_me# is #ok()#, add after #after_me#, else \item if list !empty simply add to bottom, else \item list is empty: create first \Ref{Link} and initialize #bottom_# and #top_#. \end{itemize} */ template void List::add (T const & thing, Cursor &after_me) { if (!size_) { // not much choice if list is empty bottom_ = top_ = new Link( thing); if (!after_me.ok()) after_me = bottom(); } else { // add at aprioprate place if (!after_me.ok()) after_me = bottom(); Link *p =after_me.pointer(); p->add (thing); if (p == bottom_) // adjust bottom_ if necessary. bottom_ = p->next(); } size_++; } template void List::insert (T const & thing, Cursor &before_me) { if (!size_) { bottom_ = top_ = new Link( thing); if (!before_me.ok()) before_me = top(); } else { if (!before_me.ok()) before_me = top(); Link *p = before_me.pointer() ; p->insert (thing); if (p == top_) top_ = p->previous(); } size_++; } template void List::concatenate (List const&s) { Cursor b (bottom()); for (Cursor c (s); c.ok(); c++) { b.add (c); b++; } } #endif