40 #ifndef picox_container_xcircular_buffer_h_ 41 #define picox_container_xcircular_buffer_h_ 61 #define XCBUF__CAPACITY() ((size_t)(self->m_end - self->m_buff)) 62 #define XCBUF__ADD(p, n) ((p) + ((n) < (size_t)(self->m_end - (p)) ? (n) : (n) - XCBUF__CAPACITY())) 63 #define XCBUf__SUB(p, n) ((p) - ((n) > ((p) - self->m_buff) ? (n) - XCBUF__CAPACITY() : (n))) 64 #define XCBUF__DECREMENT(p) do { if (p == self->m_buff) p = self->m_end; --p; } while (0) 65 #define XCBUF__INCREMENT(p) do { if (++p == self->m_end) p = self->m_buff; } while (0) 95 buffer = (uint8_t*)
x_malloc(capacity);
98 self->m_is_heapdata =
true;
100 self->m_buff = (uint8_t*)buffer;
101 self->m_end =
self->m_buff + capacity;
102 self->m_first =
self->m_last =
self->m_buff;
114 if (self->m_is_heapdata)
116 self->m_is_heapdata =
false;
126 self->m_first =
self->m_last =
self->m_buff;
133 static inline uint8_t*
142 static inline const uint8_t*
156 static inline const uint8_t*
159 const uint8_t* p = ((
self->m_last <=
self->m_first) && (self->m_size != 0)) ?
160 self->m_end : self->m_last;
161 *o_size = p - self->m_first;
162 return self->m_first;
168 static inline const uint8_t*
171 *o_size = ((
self->m_last <=
self->m_first) && (self->m_size != 0)) ?
172 self->m_last - self->m_buff : 0;
179 static inline uint8_t*
182 if (self->m_size == 0)
185 if ((self->m_first < self->m_last) || (self->m_last == self->m_buff))
186 return self->m_first;
188 uint8_t* src =
self->m_first;
189 uint8_t* dest =
self->m_buff;
194 for (first = self->m_first; dest < src; src = first)
196 for (i = 0; src <
self->m_end; ++src, ++dest, ++moved, ++i)
198 if (moved == self->m_size)
214 self->m_first =
self->m_buff;
215 self->m_last = XCBUF__ADD(self->m_buff, self->m_size);
225 return (self->m_first < self->m_last) || (
self->m_last ==
self->m_buff);
243 return self->m_size == 0;
252 return XCBUF__CAPACITY();
261 return XCBUF__CAPACITY() ==
self->m_size;
270 return XCBUF__CAPACITY() -
self->m_size;
283 *(
self->m_last) = value;
284 XCBUF__INCREMENT(self->m_last);
285 self->m_first =
self->m_last;
289 *(
self->m_last) = value;
290 XCBUF__INCREMENT(self->m_last);
304 const size_t nn = (reserved >= n) ? n : reserved;
306 const uint8_t* p = (
const uint8_t*)src;
308 for (i = 0; i < nn; i++)
310 *(
self->m_last) = *p++;
311 XCBUF__INCREMENT(self->m_last);
317 *(
self->m_last) = *p++;
318 XCBUF__INCREMENT(self->m_last);
319 self->m_first =
self->m_last;
333 XCBUF__DECREMENT(self->m_first);
334 *(
self->m_first) = value;
335 self->m_last =
self->m_first;
339 XCBUF__DECREMENT(self->m_first);
340 *(
self->m_first) = value;
354 const size_t nn = (reserved >= n) ? n : reserved;
355 const uint8_t* p = (
const uint8_t*)(src);
358 for (i = 0; i < nn; i++)
360 XCBUF__DECREMENT(self->m_first);
361 *(
self->m_first) = *p++;
367 XCBUF__DECREMENT(self->m_first);
368 *(
self->m_first) = *p++;
369 self->m_last =
self->m_first;
376 static inline uint8_t
379 const uint8_t* p =
self->m_last;
387 static inline uint8_t
390 return *(
self->m_first);
396 static inline uint8_t
399 XCBUF__DECREMENT(self->m_last);
400 const uint8_t ret = *(
self->m_last);
408 static inline uint8_t
411 const uint8_t ret = *(
self->m_first);
412 XCBUF__INCREMENT(self->m_first);
430 for (i = 0; i < n; i++)
432 *p++ = *(
self->m_first);
433 XCBUF__INCREMENT(self->m_first);
438 for (i = 0; i < n; i++)
440 XCBUF__INCREMENT(self->m_first);
459 for (i = 0; i < n; i++)
461 XCBUF__DECREMENT(self->m_last);
462 *p++ = *(
self->m_last);
467 for (i = 0; i < n; i++)
469 XCBUF__DECREMENT(self->m_last);
481 const uint8_t* src = XCBUF__ADD(self->m_first, pos);
482 uint8_t* p = (uint8_t*)dst;
484 for (i = 0; i < n; i++)
487 XCBUF__INCREMENT(src);
493 #undef XCBUF__CAPACITY 496 #undef XCBUF__DECREMENT 497 #undef XCBUF__INCREMENT static const uint8_t * xcbuf_array_one(const XCircularBuffer *self, size_t *o_size)
バッファの先頭側の配列を返します
Definition: xcircular_buffer.h:157
static uint8_t xcbuf_front(XCircularBuffer *self)
バッファの先頭要素を返します
Definition: xcircular_buffer.h:388
static void xcbuf_push_front(XCircularBuffer *self, uint8_t value)
バッファ先頭に要素を追加します
Definition: xcircular_buffer.h:329
static uint8_t * xcbuf_data(XCircularBuffer *self)
バッファの先頭アドレスを返します
Definition: xcircular_buffer.h:134
static void xcbuf_push_back_n(XCircularBuffer *self, const void *src, size_t n)
バッファ末尾にnバイトを追加します
Definition: xcircular_buffer.h:301
static size_t xcbuf_capacity(const XCircularBuffer *self)
バッファに格納可能な最大要素数を返します
Definition: xcircular_buffer.h:250
Definition: xcircular_buffer.h:70
static size_t xcbuf_reserve(const XCircularBuffer *self)
バッファに格納可能な残り要素数を返します
Definition: xcircular_buffer.h:268
static void xcbuf_clear(XCircularBuffer *self)
バッファを空にします
Definition: xcircular_buffer.h:124
static const uint8_t * xcbuf_const_data(const XCircularBuffer *self)
バッファのコンストな先頭アドレスを返します
Definition: xcircular_buffer.h:143
static bool xcbuf_init(XCircularBuffer *self, void *buffer, size_t capacity)
循環バッファを初期化します
Definition: xcircular_buffer.h:91
static void xcbuf_push_front_n(XCircularBuffer *self, const void *src, size_t n)
バッファ先頭にnバイトを追加します
Definition: xcircular_buffer.h:351
static bool xcbuf_is_linearized(const XCircularBuffer *self)
バッファの要素が直線に並んでいるかどうかを返します
Definition: xcircular_buffer.h:223
static uint8_t xcbuf_pop_front(XCircularBuffer *self)
バッファの先頭要素を返し、先頭要素は除去されます
Definition: xcircular_buffer.h:409
static void xcbuf_deinit(XCircularBuffer *self)
バッファの終了処理を行います
Definition: xcircular_buffer.h:112
static void x_free(void *ptr)
ptrが指すメモリ空間を開放します
Definition: xstdlib.h:73
static void xcbuf_push_back(XCircularBuffer *self, uint8_t value)
バッファ末尾に要素を追加します
Definition: xcircular_buffer.h:279
static bool xcbuf_full(const XCircularBuffer *self)
バッファが満タンかどうかを返します
Definition: xcircular_buffer.h:259
static uint8_t * xcbuf_linearize(XCircularBuffer *self)
バッファの要素を直線に並べ替えます
Definition: xcircular_buffer.h:180
static const uint8_t * xcbuf_array_two(const XCircularBuffer *self, size_t *o_size)
バッファの後方側の配列を返します
Definition: xcircular_buffer.h:169
static void * x_malloc(size_t size)
sizeバイトのメモリを割り当てて返します
Definition: xstdlib.h:59
static bool xcbuf_empty(const XCircularBuffer *self)
バッファがからかどうかを返します
Definition: xcircular_buffer.h:241
static size_t xcbuf_size(const XCircularBuffer *self)
バッファの要素数を返します
Definition: xcircular_buffer.h:232
static void xcbuf_pop_back_n(XCircularBuffer *self, void *dst, size_t n)
バッファの後方からnバイトを除去し、dstにコピーします
Definition: xcircular_buffer.h:452
static void xcbuf_pop_front_n(XCircularBuffer *self, void *dst, size_t n)
バッファの先頭からnバイトを除去し、dstにコピーします
Definition: xcircular_buffer.h:423
static uint8_t xcbuf_pop_back(XCircularBuffer *self)
バッファの末尾要素を返し、末尾要素は除去されます
Definition: xcircular_buffer.h:397
static void xcbuf_copy_to_mem(const XCircularBuffer *self, size_t pos, void *dst, size_t n)
バッファから位置を指定してnバイトをdstにコピーします
Definition: xcircular_buffer.h:479
static uint8_t xcbuf_back(XCircularBuffer *self)
バッファの末尾要素を返します
Definition: xcircular_buffer.h:377