#include "mylinks.h"

// Implementation follows

void mylinkage::set_prev(mylinkage * L)
{
  prev = L;
}

void mylinkage::set_next(mylinkage* L)
{
  next = L;
}

mylinkage * mylinkage::succ()
{
   return next;
}

mylinkage * mylinkage::pred()
{
	return prev;
}

mylink * Collection::out()
{
	mylinkage * L;

	if (L=next)
	{
	next = L->succ();
	next->set_prev(this);
	   L->set_prev(NULL);
	  L->set_next(NULL);
   }
	return (mylink*) L;
}

void Collection::out_of(mylink * g)
{
	  mylink * l1;
	  l1 = out();
	  while (l1 != g)
		{
		    l1->append(this);
	    l1 = out();
	}
    }

void Collection::add_before(mylinkage* L,mylink* M)
{
    M->set_next(L);
    L->pred()->set_next(M);
    M->set_prev(L->pred());
    L->set_prev(M);
}

int Collection::empty(){return next==this;}

mylinkage::mylinkage()
{
  prev = NULL;
  next = NULL;
}

mylink* Collection::first()
{
	if(this==next) return NULL;
	return (mylink*)next;
}

mylink* Collection::last()
{
	if(this==next) return NULL;
	return (mylink*)prev;
}
	
Collection::Collection()
{
   next = this;
   prev = this;
}

void Collection::append(mylink * l)
{
	if(empty()) l->into(this);
	else
	{
		l->set_next(this);
		l->set_prev(last());
		last()->set_next(l);
		prev = l;
	}
}

void mylink::into(Collection * Q)
{
	 next = Q->succ();
	 Q->succ()->set_prev(this);
	 Q->set_next(this);
	 prev = Q;
}

void mylink::append(Collection * Q)
{
	if(Q->empty()) into(Q);
	else
	{
		next = Q;
		Q->pred()->set_next(this);
		prev = Q->pred();
		Q->set_prev(this);
	}
}

mylink* mylink::out()
{
    pred()->set_next(succ());
    succ()->set_prev(pred());
    prev = NULL;
    next = NULL;
    return this;
}

