#include "IQueue.h"
#include "concurrentqueue/concurrentqueue.h"
#include <iostream>

using namespace moodycamel;

template <class T>
class MoodyCamelQueue : public IQueue<T>
{
    private:
        ConcurrentQueue<T> queueInstance;

    public:
        
        virtual void Enqueue(T elementToQueue)
        {
            queueInstance.enqueue(elementToQueue);
        }

        virtual T Dequeue()
        {
            T frontElement;

            if(queueInstance.try_dequeue(frontElement))
            {
                return frontElement;
            }

	        return NULL;
        }

        virtual IQueue<T>* GetInstance()
        {
            return new MoodyCamelQueue<T>();
        }
};