#include // Provides size_t #include // Provides assert #include "link2.h" // Template Version Linked list toolkit template class Queue { public: Queue( ); Queue(const Queue& source); ~Queue( ); // MODIFICATION functions void insert(const Item& entry); Item get_front( ); void operator =(const Queue& source); // CONSTANT functions size_t size( ) const { return count; } bool is_empty( ) const { return (count == 0); } private: Node *front_ptr; // Points to front of queue Node *rear_ptr; // Points to rear of queue size_t count; // Total number of items in the queue }; template Queue::Queue( ) { count = 0; front_ptr = NULL; } template Queue::Queue(const Queue& source) { count = source.count; list_copy(source.front_ptr, front_ptr, rear_ptr); } template Queue::~Queue( ) { list_clear(front_ptr); } template void Queue::operator =(const Queue& source) { if (source.front_ptr == front_ptr) // Handle self-assignment return; list_clear(front_ptr); count = source.count; list_copy(source.front_ptr, front_ptr, rear_ptr); } template void Queue::insert(const Item& entry) { if (is_empty( )) { // Insert first entry list_head_insert(front_ptr, entry); rear_ptr = front_ptr; } else { list_insert(rear_ptr, entry); rear_ptr = rear_ptr->link; } count++; } template Item Queue::get_front( ) { Item answer; assert(!is_empty( )); answer = front_ptr->data; list_head_remove(front_ptr); count--; return answer; }