#ifndef LIST_CC
#define LIST_CC
// instantiate a template: explicit instantiation.
#define L_instantiate(a) template 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