# HG changeset patch # User Eris Caffee # Date 1434755866 18000 # Node ID eb159ea69f33efbcffdc8464031459fe7af7ec65 # Parent 63df3e6590e27e9624180b0df1ff1eb2922ca704 Updated Queue to have the implementation in the header file. I forgot that templates need the implementation visible to the copmiler in the place where the code is generated - it can't be properly generated if it's in a separate file. diff -r 63df3e6590e2 -r eb159ea69f33 algs4-c++/src/Queue.cpp --- a/algs4-c++/src/Queue.cpp Thu Jun 11 16:30:14 2015 -0500 +++ b/algs4-c++/src/Queue.cpp Fri Jun 19 18:17:46 2015 -0500 @@ -1,129 +1,9 @@ -// g++ -D QUEUE_MAIN -std=c++0x Queue.cpp -// g++ -D QUEUE_MAIN -std=c++11 Queue.cpp +// g++ -std=c++11 Queue.cpp -#include "Queue.hpp" - -#include -#include - #include -template -Queue::Queue( void ) : - N (0), - first (nullptr), - last (nullptr) - { - } - -template -Queue::~Queue( void ) { - assert( N == 0 ); // Catch the potential memory leak. - while ( first ) { - Node *next = first->next; - delete first; - first = next; - } - } - -template -void Queue::enqueue( T &item ) { - Node * node = new Node(); - node->item = item; - node->next = nullptr; - - if ( last ) { - last->next = node; - last = node; - } - else { - last = first = node; - } - - N++; - } - -template -T Queue::dequeue( void ) { - assert( N > 0 ); - - T item = first->item; - - Node *old = first; - first = first->next; - delete old; - N--; - - if ( ! first ) - last = nullptr; - - return item; - } - -template -bool Queue::is_empty( void ) { - return N == 0; - } - -template -size_t Queue::size( void ) { - return N; - } - -template -typename Queue::iterator Queue::begin( void ) { - return Queue::iterator( first ); - } - -template -typename Queue::iterator Queue::end( void ) { - return Queue::iterator( nullptr ); - } - - -//////////////////////////////////////////////////////////////////////////////// - -template -Queue::iterator::iterator( Node *c ) : - curr (c) - { - } - -template -typename Queue::iterator & Queue::iterator::operator++() { - if ( this->curr != nullptr ) { - this->curr = this->curr->next; - } - return *this; - } - -template -typename Queue::iterator Queue::iterator::operator++( int ) { - auto t = Queue::iterator( *this ); - - if ( this->curr != nullptr ) { - this->curr = this->curr->next; - } - return t; - } - -template -T Queue::iterator::operator*() { - return this->curr->item; - } - -template -bool Queue::iterator::operator!=( typename Queue::iterator other ) { - return this->curr != other.curr; - } - - -//////////////////////////////////////////////////////////////////////////////// - -#ifdef QUEUE_MAIN - -#include +#include "Queue.hpp" int main ( int argc, char **argv ) { @@ -156,4 +36,3 @@ } -#endif diff -r 63df3e6590e2 -r eb159ea69f33 algs4-c++/src/Queue.hpp --- a/algs4-c++/src/Queue.hpp Thu Jun 11 16:30:14 2015 -0500 +++ b/algs4-c++/src/Queue.hpp Fri Jun 19 18:17:46 2015 -0500 @@ -1,9 +1,12 @@ +// Linked list based queue after Sedgewick and Wayne, Algorithms 4th ed, Algorithm 1.3 + #ifndef QUEUE_HPP #define QUEUE_HPP #include +#include +#include -// Linked list based queue after Sedgewick and Wayne, Algorithms 4th ed, Algorithm 1.3 template class Queue { @@ -63,6 +66,115 @@ }; +template +Queue::Queue( void ) : + N (0), + first (nullptr), + last (nullptr) + { + } + +template +Queue::~Queue( void ) { + assert( N == 0 ); // Catch the potential memory leak. + while ( first ) { + Node *next = first->next; + delete first; + first = next; + } + } + +template +void Queue::enqueue( T &item ) { + Node * node = new Node(); + node->item = item; + node->next = nullptr; + + if ( last ) { + last->next = node; + last = node; + } + else { + last = first = node; + } + + N++; + } + +template +T Queue::dequeue( void ) { + assert( N > 0 ); + + T item = first->item; + + Node *old = first; + first = first->next; + delete old; + N--; + + if ( ! first ) + last = nullptr; + + return item; + } + +template +bool Queue::is_empty( void ) { + return N == 0; + } + +template +size_t Queue::size( void ) { + return N; + } + +template +typename Queue::iterator Queue::begin( void ) { + return Queue::iterator( first ); + } + +template +typename Queue::iterator Queue::end( void ) { + return Queue::iterator( nullptr ); + } + + +//////////////////////////////////////////////////////////////////////////////// + +template +Queue::iterator::iterator( Node *c ) : + curr (c) + { + } + +template +typename Queue::iterator & Queue::iterator::operator++() { + if ( this->curr != nullptr ) { + this->curr = this->curr->next; + } + return *this; + } + +template +typename Queue::iterator Queue::iterator::operator++( int ) { + auto t = Queue::iterator( *this ); + + if ( this->curr != nullptr ) { + this->curr = this->curr->next; + } + return t; + } + +template +T Queue::iterator::operator*() { + return this->curr->item; + } + +template +bool Queue::iterator::operator!=( typename Queue::iterator other ) { + return this->curr != other.curr; + } + #endif