汎用キューヘッダファイルC++

2067 ワード

//	queue.h
#ifndef QUEUE_H_
#define QUEUE_H_

#include 

template
class Queue ;

template
std ::ostream & operator << (std ::ostream & os, const Queue & queue)
{
	os << "< " ;
	QueueItem * scan = queue.m_head ;
	while (scan != NULL)
	{
		os << scan ->m_item << " " ;
		scan = scan ->m_next ;
	}
	os << ">" ;

	return os ;
}

template
std ::istream & operator >> (std ::istream & is, Queue & queue)
{
	T input ;
	while (is >> input)
	{
		queue.push(input) ;
	}
	is.clear() ;

	return is ;
}

template
class QueueItem
{
	friend class Queue ;
	friend std ::ostream & operator <<  (std ::ostream & os, const Queue & queue) ;
	friend std ::istream & operator >>  (std ::istream & is, Queue & queue) ;
private:
	T m_item ;
	QueueItem * m_next ;
	QueueItem (const T & item): m_item(item), m_next(0) {}
} ;

template
class Queue
{
	friend std ::ostream & operator <<  (std ::ostream & os, const Queue & queue) ;
	friend std ::istream & operator >>  (std ::istream & is, Queue & queue) ;
private:
	QueueItem * m_head ;
	QueueItem * m_tail ;
	void m_copyElement (const Queue & queue) ;
	template void m_copyElement (Iter, Iter) ;
	void m_destroy (void) ;
public:
	template Queue (Iter, Iter) ;
	Queue (void): m_head(0), m_tail(0) {}
	Queue (const Queue & queue) ;
	Queue & operator = (const Queue & qeueue) ;
	~Queue (void) ;
	template void assign (Iter, Iter) ;
	bool isEmpty (void) const ;
	T & front (void) ;
	const T & front (void) const ;
	void push (const T & item) ;
	void pop (void) ;
} ;

#include "queue.cpp"

#endif