ringbuffer.h 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143
  1. #include <inttypes.h>
  2. #include <stddef.h>
  3. #include <assert.h>
  4. /**
  5. * @file
  6. * 环形缓冲模块的原型和结构。
  7. */
  8. #ifndef RINGBUFFER_H
  9. #define RINGBUFFER_H
  10. #ifdef __cplusplus
  11. extern "C"
  12. {
  13. #endif
  14. #define RING_BUFFER_ASSERT(x) assert(x)
  15. #define inline __inline
  16. /**
  17. * 检查 buffer_size 是否为 2 的幂。
  18. * 由于设计仅 <tt> RING_BUFFER_SIZE-1 </tt> 项目
  19. * 可以包含在缓冲区中。
  20. * buffer_size 必须是 2 的幂。
  21. */
  22. // 移除
  23. // #define RING_BUFFER_IS_POWER_OF_TWO(buffer_size) ((buffer_size & (buffer_size - 1)) == 0)
  24. /**
  25. * 用于保存大小的类型
  26. * 和缓冲区的指示。
  27. */
  28. typedef size_t ring_buffer_size_t;
  29. /**
  30. * 用作模运算符
  31. * 作为 <tt> a % b = (a & (b ? 1)) </tt>
  32. * 其中 \c a 是缓冲区中的正索引,
  33. * \c b 是缓冲区的 (2 的幂) 大小。
  34. */
  35. // 移除
  36. // #define RING_BUFFER_MASK(rb) (rb->buffer_mask)
  37. /**
  38. * 简化了 <tt>struct ring_buffer_t</tt> 的使用。
  39. */
  40. typedef struct ring_buffer_t ring_buffer_t;
  41. /**
  42. * 保存环形缓冲区的结构。
  43. * 缓冲区包含一个缓冲区数组
  44. * 以及 Ring Buffer 的元数据。
  45. */
  46. struct ring_buffer_t {
  47. /** 缓冲内存。 */
  48. char *buffer;
  49. /** 缓冲区大小。 */
  50. ring_buffer_size_t buf_size;
  51. /** 尾巴索引。 */
  52. ring_buffer_size_t tail_index;
  53. /** 头部索引。 */
  54. ring_buffer_size_t head_index;
  55. /** 计数掩码。 */
  56. ring_buffer_size_t count;
  57. };
  58. /**
  59. * 初始化<em>缓冲区</em>指向的环形缓冲区。
  60. * 此功能也可用于清空/重置缓冲区。
  61. * @param buffer 要初始化的环形缓冲区。
  62. * @param buf 为 ringbuffer 分配的缓冲区。
  63. * @param buf_size 分配的 ringbuffer 的大小。
  64. */
  65. void ring_buffer_init(ring_buffer_t *buffer, char *buf, size_t buf_size);
  66. /**
  67. * 向环形缓冲区添加一个字节。
  68. * @param buffer ( 缓冲区) 应放置数据的缓冲区。
  69. * @param data 要放置的字节。
  70. */
  71. void ring_buffer_queue(ring_buffer_t *buffer, char data);
  72. /**
  73. * 将字节数组添加到环形缓冲区。
  74. * @param buffer ( 缓冲区) 应放置数据的缓冲区。
  75. * @param data 指向要放置在队列中的字节数组的指针。
  76. * @param size 数组的大小。
  77. */
  78. void ring_buffer_queue_arr(ring_buffer_t *buffer, const char *data, ring_buffer_size_t size);
  79. /**
  80. * 返回环形缓冲区中最早的字节。
  81. * @param buffer 应从中返回数据的缓冲区。
  82. * @param data 指向数据应放置位置的指针。
  83. * 如果返回数据,则@return 1;否则为 0。
  84. */
  85. uint8_t ring_buffer_dequeue(ring_buffer_t *buffer, char *data);
  86. /**
  87. * 返回环形缓冲区中 <em>len</em> 最早的字节。
  88. * @param buffer 应从中返回数据的缓冲区。
  89. * @param data 指向应放置数据的数组的指针。
  90. * @param len 要返回的最大字节数。
  91. * @return 返回的字节数。
  92. */
  93. ring_buffer_size_t ring_buffer_dequeue_arr(ring_buffer_t *buffer, char *data, ring_buffer_size_t len);
  94. /**
  95. * Peeks a ring buffer,即返回一个元素而不删除它。
  96. * @param buffer 应从中返回数据的缓冲区。
  97. * @param data 指向数据应放置位置的指针。
  98. * @param index 要速览的索引。
  99. * 如果返回数据,则@return 1;否则为 0。
  100. */
  101. uint8_t ring_buffer_peek(ring_buffer_t *buffer, char *data, ring_buffer_size_t index);
  102. /**
  103. * 返回 ring buffer 是否为空。
  104. * @param buffer 无论是否为空,都应该返回的缓冲区。
  105. * @return 1 为空;否则为 0。
  106. */
  107. inline uint8_t ring_buffer_is_empty(ring_buffer_t *buffer);
  108. /**
  109. * 返回环形缓冲区是否已满。
  110. * @param buffer 缓冲区 无论缓冲区是否已满,都应返回其缓冲区。
  111. * @return 1 如果已满;否则为 0。
  112. */
  113. inline uint8_t ring_buffer_is_full(ring_buffer_t *buffer);
  114. /**
  115. * 返回环形缓冲区中的项数。
  116. * @param buffer 应为其返回项目数的缓冲区。
  117. * @return 环形缓冲区中的项数。
  118. */
  119. inline ring_buffer_size_t ring_buffer_num_items(ring_buffer_t *buffer);
  120. #ifdef __cplusplus
  121. }
  122. #endif
  123. #endif /* RINGBUFFER_H */