#include "linked_list.h" template llist::llist () { this->length = 0; this->cur = this->head = new llink; this->tail = new llink; head->after = tail; tail->before = head; } 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 void llist::push(T* val) { auto l = new llink(val); l->after = FIRST(this); FIRST(this) = l; l->after->before = l; l->before = this->head; ++this->length; // TODO do I want to change that? this->cur = l; } 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. */ // free(other->head); // free(other->tail); 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 << ')'; // }