/* File: sm_queue.C Copyright glh 7/20/93 */ #include "sm_queue.H" template SmQueue::SmQueue(int sz, const T& elm) { assert(sz > 0); size = sz; head = 0; tail = 0; last_op = deque; element = new T[size]; element[0] = elm; } template SmQueue::SmQueue(int sz) { assert(sz > 0); size = sz; head = 0; tail = sz-1; last_op = deque; element = new T[size]; } template SmQueue::SmQueue(const SmQueue& que) { size = que.size; head = que.head; tail = que.tail; last_op = que.last_op; element = new T[size]; for (int i=head; i!=(tail+1)%size; i=(i+1)%size) element[i] = que.element[i]; } template SmQueue& SmQueue::operator=(const SmQueue& que) { if (this != &que) { delete [] element; size = que.size; head = que.head; tail = que.tail; last_op = que.last_op; element = new T[size]; for (int i=head; i!=(tail+1)%size; i=(i+1)%size) element[i] = que.element[i]; } return *this; } template T& SmQueue::Dequeue() { if (head == (tail+1) % size) assert(last_op != deque); last_op = deque; T* temp = new T(element[head]); head = (head+1) % size; return *temp; } template void SmQueue::Enqueue(const T& elm) { if (head == (tail+1) % size) assert(last_op != enque); last_op = enque; tail = (tail+1) % size; element[tail] = elm; } template Boolean SmQueue::Empty() const { if ((head == (tail+1) % size) && last_op == deque) return true; else return false; } template ostream& operator<<(ostream& os, const SmQueue& que) { os << "("; for (int i=que.head; i!=(que.tail+1)%que.size; i=(i+1)%que.size) { os << que.element[i]; if (i != que.tail) os << ","; } os << ")"; return os; }