std_queue.h 1.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677
  1. // Copyright (c) 2006-2018 Maxim Khizhinsky
  2. //
  3. // Distributed under the Boost Software License, Version 1.0. (See accompanying
  4. // file LICENSE or copy at http://www.boost.org/LICENSE_1_0.txt)
  5. #ifndef CDSUNIT_QUEUE_STD_QUEUE_H
  6. #define CDSUNIT_QUEUE_STD_QUEUE_H
  7. #include <mutex> //unique_lock
  8. #include <queue>
  9. #include <list>
  10. #include <cds/sync/spinlock.h>
  11. namespace queue {
  12. template <typename T, class Container, class Lock = cds::sync::spin >
  13. class StdQueue: public std::queue<T, Container >
  14. {
  15. typedef std::queue<T, Container > base_class;
  16. mutable Lock m_Locker;
  17. public:
  18. bool enqueue( const T& data )
  19. {
  20. std::unique_lock<Lock> a(m_Locker);
  21. base_class::push( data );
  22. return true;
  23. }
  24. bool push( const T& data )
  25. {
  26. return enqueue( data );
  27. }
  28. bool dequeue( T& data )
  29. {
  30. std::unique_lock<Lock> a(m_Locker);
  31. if ( base_class::empty())
  32. return false;
  33. data = base_class::front();
  34. base_class::pop();
  35. return true;
  36. }
  37. bool pop( T& data )
  38. {
  39. return dequeue( data );
  40. }
  41. bool empty() const
  42. {
  43. std::unique_lock<Lock> a( m_Locker );
  44. return base_class::empty();
  45. }
  46. size_t size() const
  47. {
  48. std::unique_lock<Lock> a( m_Locker );
  49. return base_class::size();
  50. }
  51. cds::opt::none statistics() const
  52. {
  53. return cds::opt::none();
  54. }
  55. };
  56. template <typename T, class Lock = cds::sync::spin >
  57. using StdQueue_deque = StdQueue<T, std::deque<T>, Lock >;
  58. template <typename T, class Lock = cds::sync::spin >
  59. using StdQueue_list = StdQueue<T, std::list<T>, Lock >;
  60. }
  61. #endif // #ifndef CDSUNIT_QUEUE_STD_QUEUE_H