wayland-util.h

wl_array (配列)
struct wl_array配列
wl_array_init初期化
wl_array_release解放
wl_array_add領域の追加
wl_array_copy複製
wl_array_for_each配列のデータを先頭から順に参照
wl_list (双方向リスト)
struct wl_listリスト
wl_list_init初期化
wl_list_insert挿入
wl_list_removeリストから取り除く
wl_list_lengthアイテム数取得
wl_list_emptyリストが空かどうか
wl_list_insert_listリストの末尾に、他のリストのアイテムを追加
wl_list_for_each先頭から参照
wl_list_for_each_safe先頭から参照 (削除に対応)
wl_list_for_each_reverse
wl_list_for_each_reverse_safe
終端から逆順に参照
wl_array (配列)
struct wl_array {
    size_t size;  //使用されている全体サイズ
    size_t alloc; //確保されているサイズ
    void *data;
};
配列
void wl_array_init(struct wl_array *array);
データを初期化。
void wl_array_release(struct wl_array *array);
データを解放
void *wl_array_add(struct wl_array *array, size_t size);
配列のサイズを、size バイト分拡張。
戻り値
新しい先頭のポインタ。NULL で失敗
int wl_array_copy(struct wl_array *array, struct wl_array *source);
複製
戻り値
0 で成功、-1 で失敗
#define wl_array_for_each(pos, array)
for (pos = (array)->data; \
    (const char *) pos < ((const char *) (array)->data + (array)->size); \
    (pos)++)
配列のデータを先頭から順に参照
pos
データのポインタを示す変数。
繰り返すごとにポインタが移動する。
wl_list (双方向リスト)
struct wl_list {
    struct wl_list *prev;
    struct wl_list *next;
};
リスト
void wl_list_init(struct wl_list *list);
データを初期化する。
void wl_list_insert(struct wl_list *list, struct wl_list *elm);
list の後に elm を挿入する。
list が先頭なら、先頭へ挿入。
void wl_list_remove(struct wl_list *elm);
リストから取り除く
int wl_list_length(const struct wl_list *list);
アイテム数取得
int wl_list_empty(const struct wl_list *list);
リストが空かどうか
戻り値
1 で空、0 で空でない
void wl_list_insert_list(struct wl_list *list, struct wl_list *other);
list の末尾に、other の全てのアイテムを追加する。
#define wl_list_for_each(pos, head, member) \
    for (pos = wl_container_of((head)->next, pos, member); \
         &pos->member != (head); \
         pos = wl_container_of(pos->member.next, pos, member))
先頭から参照
pos
wl_list が含まれる構造体のポインタを示す変数。
繰り返すごとに、ポインタが次の位置へ移動する。
head
繰り返しの先頭位置となる、wl_list *
member
構造体内の wl_list を示すメンバ名
#define wl_list_for_each_safe(pos, tmp, head, member) \
    for (pos = wl_container_of((head)->next, pos, member), \
         tmp = wl_container_of((pos)->member.next, tmp, member); \
         &pos->member != (head); \
         pos = tmp, \
         tmp = wl_container_of(pos->member.next, tmp, member))
先頭から、各データを参照する。
for 内でデータを削除する場合でも、正しく動作する。

tmp は次のデータ用の wl_list * の変数名。
#define wl_list_for_each_reverse(pos, head, member) \
    for (pos = wl_container_of((head)->prev, pos, member); \
         &pos->member != (head); \
         pos = wl_container_of(pos->member.prev, pos, member))

wl_list_for_each_reverse_safe(pos, tmp, head, member)
終端から逆順に参照