issue#11: cds: changed __CDS_ guard prefix to CDSLIB_ for all .h files
[libcds.git] / tests / unit / queue / std_queue.h
1 //$$CDS-header$$
2
3 #ifndef CDSUNIT_QUEUE_STD_QUEUE_H
4 #define CDSUNIT_QUEUE_STD_QUEUE_H
5
6 #include <mutex>    //unique_lock
7 #include <queue>
8 #include <cds/lock/spinlock.h>
9
10 namespace queue {
11
12     template <typename T, class Container, class Lock = cds::lock::Spin >
13     class StdQueue: public std::queue<T, Container >
14     {
15         typedef std::queue<T, Container >   base_class;
16         Lock    m_Locker;
17
18     public:
19         bool enqueue( const T& data )
20         {
21             std::unique_lock<Lock> a(m_Locker);
22
23             base_class::push( data );
24             return true;
25         }
26         bool push( const T& data )  { return enqueue( data ) ; }
27         bool dequeue( T& data )
28         {
29             std::unique_lock<Lock> a(m_Locker);
30             if ( base_class::empty() )
31                 return false;
32
33             data = base_class::front();
34             base_class::pop();
35             return true;
36         }
37         bool pop( T& data )         { return dequeue( data ) ; }
38
39         cds::opt::none statistics() const
40         {
41             return cds::opt::none();
42         }
43     };
44
45     template <typename T, class Lock = cds::lock::Spin >
46     class StdQueue_deque: public StdQueue<T, std::deque<T>, Lock >
47     {};
48
49     template <typename T, class Lock = cds::lock::Spin >
50     class StdQueue_list: public StdQueue<T, std::list<T>, Lock >
51     {};
52 }
53
54 #endif // #ifndef CDSUNIT_QUEUE_STD_QUEUE_H