queue.hpp 2.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394
  1. #pragma once
  2. #include <queue>
  3. #include <stdio.h>
  4. #include <mutex>
  5. namespace ylib
  6. {
  7. template<typename T>
  8. class queue
  9. {
  10. public:
  11. struct node
  12. {
  13. T value;
  14. node* next;
  15. };
  16. public:
  17. queue()
  18. {
  19. m_first = nullptr;
  20. m_end = nullptr;
  21. m_size = 0;
  22. }
  23. ~queue()
  24. {
  25. clear();
  26. }
  27. inline void clear()
  28. {
  29. m_mutex.lock();
  30. T value;
  31. while(pop(value,false));
  32. m_mutex.unlock();
  33. }
  34. inline void push(const T& value, bool locked = true)
  35. {
  36. if(locked){
  37. m_mutex.lock();
  38. }
  39. m_size++;
  40. if(m_first ==nullptr)
  41. {
  42. m_first = new node();
  43. m_first->next = nullptr;
  44. m_first->value = value;
  45. m_end = m_first;
  46. if(locked){
  47. m_mutex.unlock();
  48. }
  49. return;
  50. }
  51. m_end->next = new node;
  52. m_end->next->next = nullptr;
  53. m_end->next->value = value;
  54. m_end = m_end->next;
  55. if(locked){
  56. m_mutex.unlock();
  57. }
  58. }
  59. inline bool pop(T& value,bool locked = true)
  60. {
  61. if(m_first == nullptr)
  62. return false;
  63. if(locked){
  64. m_mutex.lock();
  65. }
  66. if(m_first == nullptr)
  67. {
  68. if(locked){
  69. m_mutex.unlock();
  70. }
  71. return false;
  72. }
  73. m_size--;
  74. value = m_first->value;
  75. node* temp = m_first->next;
  76. delete m_first;
  77. m_first = temp;
  78. if(locked){
  79. m_mutex.unlock();
  80. }
  81. return true;
  82. }
  83. inline size_t size(){return m_size;}
  84. node* m_first;
  85. node* m_end;
  86. std::mutex m_mutex;
  87. size_t m_size;
  88. };
  89. }