#include <assert.h>
#include<iostream>
using namespace std;
template<class TYPE>
class FIFO
{
public:
TYPE *pData;
unsigned elements;
FIFO(){ pData=NULL;elements=0;}
FIFO(const FIFO& theOther){pData=NULL;elements=0; *this=theOther;}
void get(TYPE& element);
void put(const TYPE& newElement);
bool isEmpty()const{return (elements==0);}
const FIFO& operator=(const FIFO& theOther);
~FIFO(){delete[] pData;}
};
template<class TYPE>
void FIFO<TYPE>::put(const TYPE & newElement)
{
TYPE* pTemp=new TYPE[elements+1];
for(unsigned i=0; i<elements;i++)
{
pTemp[i]=pData[i];
}
pTemp[elements]=newElement;
elements++;
delete[] pData;
pData=pTemp;
}
template<class TYPE>
void FIFO<TYPE>::get(TYPE & element)
{
// if(elements==0) return; // Hibakezelés nem kell
element=pData[0];
if(elements==1) // Ha ez volt az utolsó elem
{
delete[] pData;
elements=0;
return;
}
elements --;
TYPE* pTemp=new TYPE[elements];
for(unsigned i=0; i<elements;i++)
{
pTemp[i]=pData[i+1];
}
delete[] pData;
pData=pTemp;
}
template<class TYPE>
const FIFO<TYPE>& FIFO<TYPE>::operator=(const FIFO<TYPE>& theOther)
{
// assert(this!=&theOther); // Hibakezelés nem kell
delete[]pData;
elements=theOther.elements;
if(elements==0)
{
pData=NULL;
}
else
{
pData=new TYPE[elements];
for(unsigned int i=0;i<elements;i++)
{
pData[i]=theOther.pData[i];
}
}
return *this;
}
/*
int main()
{
// Előírt követelmények:
// - Paraméter nélküli konstruktor (new-val, tömbben hozzuk létre)
// - Helyesen muködő operator= (másoljuk az elemeket)
// Az osztály szolgáltatásainak bemutatása.
FIFO<int>f1; f1.put(1); f1.put(2);
FIFO<int>f2(f1); int x; f2.get(x);
FIFO<int>f3; f3=f1; cout<<f3.isEmpty();
return 0;
}
*/