wayland-util.h

wl_array
wl_array_init初期化
wl_array_release解放
wl_array_addサイズの追加
wl_array_copy複製する
wl_array_for_eachデータを順に参照
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
void wl_array_init(struct wl_array *array);
データを初期化。

struct wl_array {
    size_t size;
    size_t alloc;
    void *data;
};
void wl_array_release(struct wl_array *array);
データを解放
void *wl_array_add(struct wl_array *array, size_t size);
配列のサイズを size byte 分追加。
戻り値
先頭のポインタ。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
void wl_list_init(struct wl_list *list);
データを初期化する。

struct wl_list {
    struct wl_list *prev;
    struct wl_list *next;
};
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 の後に別のリストのデータを追加。
#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 は構造体データのポインタ、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)
終端から参照