77 #define XFIFO__ADD_FIRST(x) ((self->first + x) & self->capacity) 78 #define XFIFO__ADD_LAST(x) ((self->last + x) & self->capacity) 82 XFifoDefaultAtomicAssign(
size_t* dst,
size_t value)
134 self->first =
self->last = 0;
135 self->capacity = size - 1;
138 self->assigner = XFifoDefaultAtomicAssign;
140 self->assigner = assigner;
150 self->last =
self->first;
160 return self->last ==
self->first;
170 return self->capacity;
179 return (self->last - self->first) &
self->capacity;
219 self->data[
self->last] = data;
220 self->assigner(&self->last, XFIFO__ADD_LAST(1));
226 static inline uint8_t
230 const uint8_t data =
self->data[
self->first];
231 self->assigner(&self->first, XFIFO__ADD_FIRST(1));
254 if ((reserve <= 0) || (ssize <= 0) || (src == NULL))
258 size_t to_write = (reserve >= ssize) ? ssize : reserve;
261 const size_t written = to_write;
262 volatile size_t wpos =
self->last;
265 if (to_write > until_tail)
267 memcpy(&self->data[wpos], src, until_tail);
268 to_write -= until_tail;
269 src = (
const char*)src + until_tail;
272 memcpy(&self->data[wpos], src, to_write);
273 self->assigner(&self->last, XFIFO__ADD_LAST(written));
296 if ((size <= 0) || (dsize <= 0) || (dst == NULL))
300 size_t to_read = (size >= dsize) ? dsize : size;
303 const size_t read = to_read;
304 volatile size_t rpos =
self->first;
307 if (to_read > until_tail)
309 memcpy(dst, &self->data[rpos], until_tail);
310 to_read -= until_tail;
311 dst = (
char*)dst + until_tail;
314 memcpy(dst, &self->data[rpos], to_read);
315 self->assigner(&self->first, XFIFO__ADD_FIRST(read));
321 #undef XFIFO__ADD_FIRST 322 #undef XFIFO__ADD_LAST 323 #undef XFIFO__IS_POWER_OF_TWO 328 #endif // __cplusplus static void * xfifo_data(const XFifoBuffer *self)
要素を格納するバッファを返します。
Definition: xfifo_buffer.h:206
static size_t xfifo_reserve(const XFifoBuffer *self)
空き要素数を返します。
Definition: xfifo_buffer.h:196
static size_t xfifo_write(XFifoBuffer *self, const void *src, size_t ssize)
FIFO末尾に指定サイズのデータの書き込みを試みます。
Definition: xfifo_buffer.h:247
static size_t xfifo_read(XFifoBuffer *self, void *dst, size_t dsize)
FIFO先頭から指定サイズのデータを読み込みを試みます。
Definition: xfifo_buffer.h:289
static void xfifo_clear(XFifoBuffer *self)
バッファを空にします。
Definition: xfifo_buffer.h:147
static uint8_t xfifo_pop(XFifoBuffer *self)
FIFO先頭から要素を取り出します。
Definition: xfifo_buffer.h:227
static bool xfifo_empty(const XFifoBuffer *self)
格納要素数が0かどうかを返します。
Definition: xfifo_buffer.h:157
static size_t xfifo_size(const XFifoBuffer *self)
格納要素数を返します。
Definition: xfifo_buffer.h:176
static bool xfifo_full(const XFifoBuffer *self)
要素数が上限かどうかを返します。
Definition: xfifo_buffer.h:186
static bool x_is_power_of_two(uint32_t x)
X_IS_POWER_OF_TWO()の関数版です。
Definition: xutils.h:329
static void xfifo_push(XFifoBuffer *self, uint8_t data)
FIFO末尾に要素を追加します。
Definition: xfifo_buffer.h:216
void(* XFifoAtomicAssigner)(size_t *dst, size_t value)
アトミックにsize_t変数に代入を行う関数ポインタ
Definition: xfifo_buffer.h:60
FIFOバイトバッファ管理構造体
Definition: xfifo_buffer.h:65
static void xfifo_init(XFifoBuffer *self, void *buffer, size_t size, XFifoAtomicAssigner assigner)
バッファを初期化します。
Definition: xfifo_buffer.h:126
static size_t xfifo_capacity(const XFifoBuffer *self)
最大格納要素数を返します。
Definition: xfifo_buffer.h:167