#include <iostream>
using namespace std;
template <typename T>
class Queue
{
public:
Queue()
{
_front = _rear = new QueueItem();
}
~Queue()
{
QueueItem *cur = _front;
while (cur != nullptr)
{
_front = _front->_next;
delete cur;
cur = _front;
}
}
void push(const T &val)
{
QueueItem *item = new QueueItem(val);
_rear->_next = item;
_rear = item;;
}
void pop()
{
if (empty())
{
return;
}
QueueItem *first = _front->_next;
_front->_next = first->_next;
if (_front->_next == nullptr)
{
_rear = _front;
}
delete first;
}
T front()const
{
return _front->next__data;
}
bool empty()
{
return _front == _rear;
}
private:
struct QueueItem
{
QueueItem(T data = T()) :_data(data), _next(nullptr) {}
void* operator new(size_t size)
{
if (_itempool == nullptr)
{
_itempool = (QueueItem*)new char[sizeof(QueueItem)*POOL_ITEM_SIZE];
QueueItem *p = _itempool;
for (; p < _itempool + POOL_ITEM_SIZE - 1; ++p)
{
p->_next = p + 1;
}
p->_next = nullptr;
}
QueueItem *p = _itempool;
_itempool = _itempool->_next;
return p;
}
void operator delete(void *ptr)
{
QueueItem *p = (QueueItem*)ptr;
p->_next = _itempool;
_itempool = p;
}
static const int POOL_ITEM_SIZE = 100000;
static QueueItem *_itempool;
T _data;
QueueItem *_next;
};
QueueItem *_front;
QueueItem *_rear;
};
template <typename T>
typename Queue<T>::QueueItem *Queue<T>::QueueItem::_itempool = nullptr;
int main()
{
Queue<int> que;
for (int i = 0; i < 20; i++)
{
que.push(i);
que.pop();
}
cout << que.empty() << endl;
return 0;
}