40 #ifndef picox_container_xmessage_buffer_h_ 41 #define picox_container_xmessage_buffer_h_ 69 uint8_t bytes[
sizeof(size_t)];
104 X_ASSERT(size >
sizeof(XMessageHeader));
107 self->first =
self->last =
self->size = 0;
108 self->capacity = size;
114 static inline uint8_t*
128 self->first =
self->last =
self->size = 0;
150 return self->size == 0;
160 return self->capacity;
170 return self->capacity -
self->size;
196 XMessageHeader header;
197 size_t rpos =
self->first;
199 for (i = 0; i < (int)
sizeof(XMessageHeader); i++)
201 header.bytes[i] =
self->data[rpos++];
202 if (rpos == self->capacity)
219 size_t first =
self->first;
220 size_t size =
self->size;
225 for (i = 0; i < (int)
sizeof(XMessageHeader); i++)
227 hdr.bytes[i] =
self->data[first++];
228 if (first == self->capacity)
231 size -= (
sizeof(XMessageHeader) + hdr.size);
232 first = (first + hdr.size) % self->capacity;
251 size_t first =
self->first;
254 for (i = 0; i < (int)
sizeof(XMessageHeader); i++)
256 hdr.bytes[i] =
self->data[first++];
257 if (first == self->capacity)
260 first = (first + hdr.size) % self->capacity;
261 self->size -=
sizeof(XMessageHeader) + hdr.size;
282 XMessageHeader header;
284 self->size +=
sizeof(XMessageHeader) + size;
286 size_t pos =
self->last;
288 for (i = 0; i < (int)
sizeof(XMessageHeader); i++)
290 self->data[pos++] = header.bytes[i];
291 if (pos >= self->capacity)
295 const uint8_t* from = src;
298 if (pos + size > self->capacity)
300 const size_t until_tail =
self->capacity - pos;
301 to =
self->data + pos;
302 memcpy(to, from, until_tail);
309 to =
self->data + pos;
310 memcpy(to, from, size);
313 if (pos == self->capacity)
334 XMessageHeader header;
335 size_t pos =
self->first;
337 for (i = 0; i < (int)
sizeof(XMessageHeader); i++) {
338 header.bytes[i] =
self->data[pos++];
339 if (pos == self->capacity)
345 size_t to_read = header.size;
347 if (pos + to_read > self->capacity)
349 const size_t until_tail =
self->capacity - pos;
350 from =
self->data + pos;
351 memcpy(to, from, until_tail);
352 to_read -= until_tail;
357 from =
self->data + pos;
358 memcpy(to, from, to_read);
361 if (pos == self->capacity)
364 self->size -= header.size +
sizeof(XMessageHeader);
372 #endif // __cplusplus 380 #endif // picox_container_xmessage_buffer_h_ static size_t xmsgbuf_reserve(const XMessageBuffer *self)
バッファの空きバイト数を返します
Definition: xmessage_buffer.h:167
static size_t xmsgbuf_size(const XMessageBuffer *self)
バッファに格納されているバイト数を返します
Definition: xmessage_buffer.h:137
static void xmsgbuf_skip(XMessageBuffer *self)
先頭メッセージを読み飛ばします
Definition: xmessage_buffer.h:243
static size_t xmsgbuf_num(const XMessageBuffer *self)
格納メッセージ数を返します
Definition: xmessage_buffer.h:213
static size_t xmsgbuf_msg_size(const XMessageBuffer *self)
先頭メッセージのバイト数を返します
Definition: xmessage_buffer.h:190
static uint8_t * xmsgbuf_data(const XMessageBuffer *self)
要素を格納するバッファを返します
Definition: xmessage_buffer.h:115
static void xmsgbuf_clear(XMessageBuffer *self)
バッファを空にします
Definition: xmessage_buffer.h:125
static size_t xmsgbuf_pull(XMessageBuffer *self, void *dst)
バッファ先頭からメッセージを取り出し、メッセージサイズを返します
Definition: xmessage_buffer.h:326
static void xmsgbuf_init(XMessageBuffer *self, void *buffer, size_t size)
バッファを初期化します
Definition: xmessage_buffer.h:100
static bool xmsgbuf_empty(const XMessageBuffer *self)
バッファが空かどうかを返します
Definition: xmessage_buffer.h:147
可変長バイトデータの管理構造体
Definition: xmessage_buffer.h:78
static bool xmsgbuf_full(const XMessageBuffer *self)
バッファが満タンかどうかを返します
Definition: xmessage_buffer.h:180
static size_t xmsgbuf_capacity(const XMessageBuffer *self)
バッファに格納できる最大バイト数を返します
Definition: xmessage_buffer.h:157
static void xmsgbuf_push(XMessageBuffer *self, const void *src, size_t size)
バッファ末尾にメッセージを追加します
Definition: xmessage_buffer.h:274