ringbuffer.h 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181
  1. /*
  2. * Copyright 2010-2023 Branimir Karadzic. All rights reserved.
  3. * License: https://github.com/bkaradzic/bx/blob/master/LICENSE
  4. */
  5. #ifndef BX_RINGBUFFER_H_HEADER_GUARD
  6. #define BX_RINGBUFFER_H_HEADER_GUARD
  7. #include "bx.h"
  8. #include "cpu.h"
  9. #include "uint32_t.h"
  10. namespace bx
  11. {
  12. ///
  13. class RingBufferControl
  14. {
  15. BX_CLASS(RingBufferControl
  16. , NO_DEFAULT_CTOR
  17. , NO_COPY
  18. );
  19. public:
  20. ///
  21. RingBufferControl(uint32_t _size);
  22. ///
  23. ~RingBufferControl();
  24. ///
  25. uint32_t available() const;
  26. ///
  27. uint32_t consume(uint32_t _size); // consumer only
  28. ///
  29. uint32_t reserve(uint32_t _size, bool _mustSucceed = false); // producer only
  30. ///
  31. uint32_t commit(uint32_t _size); // producer only
  32. ///
  33. uint32_t distance(uint32_t _from, uint32_t _to) const; // both
  34. ///
  35. void reset();
  36. const uint32_t m_size;
  37. uint32_t m_current;
  38. uint32_t m_write;
  39. uint32_t m_read;
  40. };
  41. ///
  42. class SpScRingBufferControl
  43. {
  44. BX_CLASS(SpScRingBufferControl
  45. , NO_DEFAULT_CTOR
  46. , NO_COPY
  47. );
  48. public:
  49. ///
  50. SpScRingBufferControl(uint32_t _size);
  51. ///
  52. ~SpScRingBufferControl();
  53. ///
  54. uint32_t available() const;
  55. ///
  56. uint32_t consume(uint32_t _size); // consumer only
  57. ///
  58. uint32_t reserve(uint32_t _size); // producer only
  59. ///
  60. uint32_t commit(uint32_t _size); // producer only
  61. ///
  62. uint32_t distance(uint32_t _from, uint32_t _to) const; // both
  63. ///
  64. void reset();
  65. const uint32_t m_size;
  66. uint32_t m_current;
  67. uint32_t m_write;
  68. uint32_t m_read;
  69. };
  70. ///
  71. template <typename ControlT>
  72. class ReadRingBufferT
  73. {
  74. BX_CLASS(ReadRingBufferT
  75. , NO_DEFAULT_CTOR
  76. , NO_COPY
  77. );
  78. public:
  79. ///
  80. ReadRingBufferT(ControlT& _control, const char* _buffer, uint32_t _size);
  81. ///
  82. ~ReadRingBufferT();
  83. ///
  84. void end();
  85. ///
  86. void read(char* _data, uint32_t _len);
  87. ///
  88. void skip(uint32_t _len);
  89. private:
  90. template <typename Ty>
  91. friend class WriteRingBufferT;
  92. ControlT& m_control;
  93. uint32_t m_read;
  94. uint32_t m_end;
  95. const uint32_t m_size;
  96. const char* m_buffer;
  97. };
  98. ///
  99. typedef ReadRingBufferT<RingBufferControl> ReadRingBuffer;
  100. ///
  101. typedef ReadRingBufferT<SpScRingBufferControl> SpScReadRingBuffer;
  102. ///
  103. template <typename ControlT>
  104. class WriteRingBufferT
  105. {
  106. BX_CLASS(WriteRingBufferT
  107. , NO_DEFAULT_CTOR
  108. , NO_COPY
  109. );
  110. public:
  111. ///
  112. WriteRingBufferT(ControlT& _control, char* _buffer, uint32_t _size);
  113. ///
  114. ~WriteRingBufferT();
  115. ///
  116. void end();
  117. ///
  118. void write(const char* _data, uint32_t _len);
  119. ///
  120. void write(ReadRingBufferT<ControlT>& _read, uint32_t _len);
  121. ///
  122. void skip(uint32_t _len);
  123. private:
  124. ControlT& m_control;
  125. uint32_t m_write;
  126. uint32_t m_end;
  127. const uint32_t m_size;
  128. char* m_buffer;
  129. };
  130. ///
  131. typedef WriteRingBufferT<RingBufferControl> WriteRingBuffer;
  132. ///
  133. typedef WriteRingBufferT<SpScRingBufferControl> SpScWriteRingBuffer;
  134. } // namespace bx
  135. #include "inline/ringbuffer.inl"
  136. #endif // BX_RINGBUFFER_H_HEADER_GUARD