////////////////////////////////////////////////////////////
//
//     	Declaration of a class
//	AFifo
//
//      Copyright 2001 Alexander Liss
//
//
////////////////////////////////////////////////////////////

#ifndef __FIFO_H__
#define __FIFO_H__

#include "AMutex.h"

	// AFifo
	// default size limit - 10000

template<class T>
class AFifo
{
AFifo(const AFifo& );
AFifo& operator=(const AFifo& );
public:

	AFifo(int limit=10000);
	~AFifo();
	
	int set_limit(int limit)
	{if(limit<2) return 1; size_limit=limit; return 0;}
	
	// returns zero on success
	int push(const T& );
	int pop(T& );
	
private:


	struct Node
	{ 
		T value;
		Node *next;	
		Node(const T& z):value(z),next(0){}
	};

	AMutex mutex;
	int size_limit,size;
	Node *start, *end;
};


#endif