#pragma implementation #include "list.h" template list_node::list_node():next((list_node*)0), prev((list_node*)0) { }; template list_node::list_node(const T& e):next((list_node*)0), prev((list_node*)0),element(e) { }; template list_iterator::list_iterator(list_node* n):node(n) {} template int list_iterator::has_more_elements() { return node != (list_node*)0; }; template T* list_iterator::operator->() { return &(node->element); }; template T& list_iterator::operator*() { return node->element; }; template T& list_iterator::operator++() { node = node->next; return node->element; }; template T& list_iterator::operator++(int) { T& remember = node->element; node = node->next; return remember; }; template T& list_iterator::operator--() { node = node->prev; return node->element; }; template T& list_iterator::operator--(int) { T& remember = node->element; node = node->prev; return remember; }; template list_node* list_iterator::getNode() { return node; }; template void list_iterator::invalidate() { node = (list_node*)0; }; template int list_iterator::operator==(const list_iterator& I) { return I.node == node; }; template int list_iterator::operator!=(const list_iterator& I) { return ! ((*this) == I); }; template T& list_iterator::operator[](int n) { return (*this + n).node->element; }; template list_iterator list_iterator::operator+(int n) { list_iterator I; I.node = this->node; for(int i=0;i list_iterator list_iterator::operator-(int n) { list_iterator I; I.node = this->node; for(int i=0;i void list::destroy(list_node* from,list_node* to) { if (from == (list_node*)0 || to == (list_node*)0) return; list_node* ptr = from, *start = from->prev, *end = to->next; while(ptr != end) { from = ptr->next; delete ptr; size--; ptr = from; } if(start==(list_node*)0) _first = end; else start->next = end; if(end==(list_node*)0) _last = start; else end->prev = start; }; template void list::copy(list_node* at,list_node* at_next,list_node* from, list_node* to,const list) { list_node* ptr = from; if (at == (list_node*)0) { at = new list_node(ptr->element); size++; ptr = ptr->next; _first = at; } while(ptr != to->next) { at->next = new list_node(ptr->element); size++; at->next->prev = at; ptr=ptr->next; at=at->next; } if (at_next==(list_node*)0) _last = at; else { at->next = at_next; at_next->prev = at; } }; template void list:: insert_before(list_iterator I,const T& element) { list_node* node = I.getNode(); if (_first == (list_node*)0) { _first = new list_node(element); size = 1; _last = _first; return; } if (node == (list_node*)0) return; list_node* before = node->prev; size ++; if (before == (list_node*)0) { _first = new list_node(element); _first->next = node; node->prev = _first; return; } before->next = new list_node(element); before->next->next = node; before->next->prev = node->prev; node->prev = before->next; }; template void list::insert_after(list_iterator I,const T& element) { list_node *node = I.getNode(); if (_first == (list_node*)0) { _first = new list_node(element); size = 1; _last = _first; return; } if (node == (list_node*)0) return; list_node* after = node->next; size ++; if (after == (list_node*)0) { _last = new list_node(element); _last->prev = node; node->next = _last; return; } node->next = new list_node(element); node->next->prev = node; node->next->next = after; after->prev = node->next; }; template void list::insert_before(list_iterator I,const list& L){ copy(I.getNode()->prev,I.getNode(),L._first,L._last,L); }; template void list::insert_after(list_iterator I,const list& L){ copy(I.getNode(),I.getNode()->next,L._first,L._last,L); }; template void list::remove(list_iterator& I) { list_node* n = I.getNode(); if (n==(list_node*)0) return; list_node* after = n->next; list_node* before = n->prev; if (before == (list_node*)0) { _first = after; } else { before->next = after; } if (after == (list_node*)0) { _last = before; } else { after->prev = before; } size--; delete n; I.invalidate(); }; template list_iterator list::first() { list_iterator I(_first); return I; }; template list_iterator list::last() { list_iterator I(_last); return I; }; template int list::length() const { return size; }; template void list::set_comparison(bool (*f)(const T&,const T&)) { less = f; }; template list::list(bool (*f)(const T&,const T&)):_first((list_node*)0), _last((list_node*)0),size(0),less(f) { }; template list::list(const list& L):_first((list_node*)0), _last((list_node*)0),size(0) { copy(_first,_last,L._first,L._last,L); }; template list::~list(){ destroy(_first,_last); }; template list& list::operator=(const list& L) { destroy(_first,_last); copy(_first,_last,L._first,L._last,L); return *this; }; template void list::split(list& smaller,list& bigger, const T& v) { if (_first == (list_node*)0) return; while(_first != (list_node*)0) { if (less(*(first()),v)) { smaller.insert_after(smaller.last(),*(first())); } else { bigger.insert_after(bigger.last(),*(first())); } list_iterator tmp = first(); remove(tmp); } } template void list::sort() { if (less==0) return; if (_first == _last) return; list smaller(less); list bigger(less); list_node* first_node = _first; _first = _first->next; _first->prev = (list_node*)0; size--; split(smaller,bigger,first_node->element); smaller.sort(); bigger.sort(); _first = smaller._first; _last = bigger._last; if(smaller._last != (list_node*)0) { smaller._last->next = first_node; first_node->prev = smaller._last; } else { _first = first_node; first_node->prev = (list_node*)0; } if(bigger._first != (list_node*)0) { bigger._first->prev = first_node; first_node->next = bigger._first; } else { _last = first_node; first_node->next = (list_node*)0; } size = bigger.size + smaller.size; // IMPORTANT, PREVENT DESTRUCTOR!!! smaller._last = bigger._last = smaller._first = bigger._first = (list_node*)0; } #include "list_inst.h"