picox  0.1
Xbyte_array

可変長バイト配列モジュール [詳解]

Xbyte_array 連携図

データ構造

struct  XByteArray
 可変長バイト配列管理構造体 [詳解]
 

関数

static uint8_t * xbarray_at (XByteArray *self, size_t index)
 バッファ先頭からnバイト後方を指すポインタを返します
 
static size_t xbarray_capacity (const XByteArray *self)
 バッファに割り当てられたバイト数を返します
 
static void xbarray_clear (XByteArray *self)
 バッファの要素数を0にします
 
static const uint8_t * xbarray_const_at (const XByteArray *self, size_t index)
 バッファ先頭からnバイト後方を指すコンストポインタを返します
 
static const uint8_t * xbarray_const_data (const XByteArray *self)
 バッファ先頭を指すコンストポインタを返します
 
static uint8_t * xbarray_data (XByteArray *self)
 バッファ先頭を指すポインタを返します
 
static void xbarray_deinit (XByteArray *self)
 バッファを破棄します
 
static bool xbarray_empty (const XByteArray *self)
 バッファが空かどうかを返します
 
static void xbarray_erase (XByteArray *self, size_t index)
 バッファ先頭からn番目を除去します
 
static void xbarray_erase_n (XByteArray *self, size_t index, size_t size)
 バッファ先頭からn番目 ~ n + sizeの範囲を除去します
 
static void xbarray_fill (XByteArray *self, uint8_t value)
 バッファをvalueで埋めます
 
static bool xbarray_full (const XByteArray *self)
 バッファが拡張なしで格納できる上限に達しているかどうかを返します
 
static bool xbarray_init (XByteArray *self, void *buffer, size_t size)
 バッファを初期化します [詳解]
 
static void xbarray_insert (XByteArray *self, size_t index, uint8_t value)
 バッファ先頭からn番目にvalueを挿入します
 
static void xbarray_insert_n (XByteArray *self, size_t index, const void *src, size_t size)
 バッファ先頭からn番目にsrcからsizeバイトを挿入します
 
static bool xbarray_make_space_if (XByteArray *self, size_t size)
 sizeバイトを格納する空き容量がない場合、バッファを拡張します [詳解]
 
static uint8_t xbarray_pop_back (XByteArray *self)
 バッファ末尾から1バイトを除去して返します
 
static void xbarray_pop_back_n (XByteArray *self, void *dst, size_t size)
 バッファ末尾からsizeバイトを除去します [詳解]
 
static void xbarray_push_back (XByteArray *self, uint8_t value)
 バッファ末尾にvalueを追加します
 
static void xbarray_push_back_n (XByteArray *self, const void *src, size_t size)
 バッファ末尾にsrcからsizeバイトを追加します
 
static bool xbarray_reserve (XByteArray *self, size_t size)
 バッファにsizeバイト以上の容量を確保します [詳解]
 
static bool xbarray_shrink_to_fit (XByteArray *self)
 バッファの容量を有効バイト数まで切り詰めます [詳解]
 
static size_t xbarray_size (const XByteArray *self)
 バッファに格納されたバイト数を返します
 
static size_t xbarray_space (const XByteArray *self)
 バッファが拡張なしで格納できる空きバイト数を返します
 
static void xbarray_strict_make_space_if (XByteArray *self, size_t size)
 X_ASSERT()による検査を行うxbarray_make_space_if()です
 

詳解

可変長バイト配列モジュール

データはメモリ上に連続して配置されることを保証しているので、データポインタは 、配列を操作するAPIに直接渡すことができます。

型がuint8_t固定なのでstd::vector<>に比べると使い勝手は数段劣りますが、それで も十分便利です。パフォーマンスを多少犠牲にしてバイトデータとして扱えば、 uint8_t以外の型を格納することも可能です。

関数詳解

static bool xbarray_init ( XByteArray self,
void *  buffer,
size_t  size 
)
inlinestatic

バッファを初期化します

引数
buffer可変長バイト配列に使用するメモリ領域
sizeバッファサイズ

buffer == NULLの場合は、ヒープからsizeバイト分のメモリ確保を行います。 buffer != NULLの場合は、バッファの自動伸長は行われないことに注意してください 。

static bool xbarray_make_space_if ( XByteArray self,
size_t  size 
)
inlinestatic

sizeバイトを格納する空き容量がない場合、バッファを拡張します

戻り値
trueメモリ確保成功
falseメモリ確保失敗

メモリ確保失敗時は、元のバッファはそのまま保持されます

static void xbarray_pop_back_n ( XByteArray self,
void *  dst,
size_t  size 
)
inlinestatic

バッファ末尾からsizeバイトを除去します

dstがNULLでなければ除去されるデータがdstにコピーされます

static bool xbarray_reserve ( XByteArray self,
size_t  size 
)
inlinestatic

バッファにsizeバイト以上の容量を確保します

戻り値
trueメモリ確保成功
falseメモリ確保失敗

メモリ確保失敗時は、元のバッファはそのまま保持されます。

要素追加時のメモリ伸長をX_ASSERT()で検査していますが、失敗時にプログラムを停 止させたくない場合は、前もってメモリを予約することで成功を保証きます。 また、必要な容量が予めある程度わかっているときは、先に予約をしておくことで、 再配置のオーバーヘッドを最小にすることができます。

static bool xbarray_shrink_to_fit ( XByteArray self)
inlinestatic

バッファの容量を有効バイト数まで切り詰めます

メモリ再配置によるオーバーヘッドを減らすために、メモリ伸長時はある程度多めに 確保を行います。 この関数が成功すると、xbarray_size() == xbarray_capcity()になります。