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