#include "linked_list.h" template llink::~llink () { this.unlink(); } template void llink::unlink () { if (this->before != nullptr) this->before->after = this->after; if (this->after != nullptr) this->after->before = this->before; } template T& llist::peek() { if (this->empty()) return nullptr; return FIRST(this)->value; } template T& llist::pop() { if (this->empty()) return nullptr; llink* frst = FIRST(this); frst.unlinke(); T& retval = frst->value; --this->length; delete frst; return retval; } template void llist::operator+= (llist& other) { /* Link end of dest onto start of new__. */ LAST(this)->after = FIRST(other); FIRST(other)->before = LAST(this); /* Free the two now not needed end links. */ delete other->head; delete other->tail; /* Update dest with new__ tail ptr. */ this->tail = other->tail; this->length += other->length; } // template // std::ostream& std::operator<<(std::ostream&, llist) { // o << '('; // for (T t : list) { // o << t; // } // o << ')'; // }