Initial commit.
Change-Id: I53f8c2f96fe4ce2f7855e950a38e812286c6c9de
diff --git a/src/Queue.h b/src/Queue.h
new file mode 100644
index 0000000..854851e
--- /dev/null
+++ b/src/Queue.h
@@ -0,0 +1,60 @@
+//
+// Copyright (c) 2013 Juan Palacios juan.palacios.puyana@gmail.com
+// Subject to the BSD 2-Clause License
+// - see < http://opensource.org/licenses/BSD-2-Clause>
+//
+
+#ifndef CONCURRENT_QUEUE_
+#define CONCURRENT_QUEUE_
+
+#include <queue>
+#include <thread>
+#include <mutex>
+#include <condition_variable>
+
+template <typename T>
+class Queue
+{
+ public:
+
+ T pop()
+ {
+ std::unique_lock<std::mutex> mlock(mutex_);
+ while (queue_.empty())
+ {
+ cond_.wait(mlock);
+ }
+ auto val = queue_.front();
+ queue_.pop();
+ return val;
+ }
+
+ void pop(T& item)
+ {
+ std::unique_lock<std::mutex> mlock(mutex_);
+ while (queue_.empty())
+ {
+ cond_.wait(mlock);
+ }
+ item = queue_.front();
+ queue_.pop();
+ }
+
+ void push(const T& item)
+ {
+ std::unique_lock<std::mutex> mlock(mutex_);
+ queue_.push(item);
+ mlock.unlock();
+ cond_.notify_one();
+ }
+ Queue()=default;
+ Queue(const Queue&) = delete; // disable copying
+ Queue& operator=(const Queue&) = delete; // disable assignment
+
+ private:
+ std::queue<T> queue_;
+ std::mutex mutex_;
+ std::condition_variable cond_;
+};
+
+#endif