//------------------------------------------------------------
// $Id: mySLQueue.h,v 1.2.2.1 2000/06/14 15:00:10 yamauchi Exp $
//------------------------------------------------------------
// queue class
//   このクラスは、gnu の  SLQueue と同じ。ただし、gnu の方はまだ gen
//   class として実装されており、template ではないので、そのうち実装さ
//   れれば、使用しなくなる。 
//	平成８年２月１７日(土)
//	Copyright (C) 1996--1998 YAMAUCHI Hitoshi 山内 斉
//------------------------------------------------------------
#ifndef _mySLQueue_h
#define _mySLQueue_h 1

#include "SLList.h"

template < class T >
class mySLQueue : private SLList < T >{
private:
    mySLQueue(const mySLQueue < T > & rhs);
    const mySLQueue < T > operator=(const mySLQueue < T > & rhs);

protected:
    int		mQueueLen;

public:
    mySLQueue(void) : SLList< T >() { this->mQueueLen = 0; }
    virtual ~mySLQueue(void){ SLList< T >::clear();		}
    int  empty(void)	{ return(SLList< T >::empty());	} // 0 if empty
    int  full(void)	{ return(0);			} // never full
    int  length(void)	{ return(this->mQueueLen);	} // length of queue
    void enq(const T& x)				  // enqueue
    {
	this->mQueueLen++;
	SLList< T >::append(x);
    } 
    T    deq(void)					  // dequeue
    {
	this->mQueueLen--;
	return(SLList< T >::remove_front());
    }
    T&	 front(void)	{ return(SLList< T >::front());	} // ret front not deq
    void del_front(void)				  // delete front
    {
	this->mQueueLen--;
	SLList< T >::del_front();
    } 
    void clear(void)		 			  // clear all elements
    {
	this->mQueueLen = 0;
	SLList< T >::clear();
    }
};

#endif
