マクロ定義 | |
#define | CSTL_LIST_INTERFACE(Name, Type) |
インターフェイスマクロ | |
#define | CSTL_LIST_IMPLEMENT(Name, Type) |
実装マクロ | |
型定義 | |
typedef struct List | List |
listの型 | |
typedef struct List * | ListIterator |
イテレータの型 | |
関数 | |
List * | List_new (void) |
生成 | |
void | List_delete (List *self) |
破棄 | |
size_t | List_size (List *self) |
要素数を取得 | |
int | List_empty (List *self) |
空チェック | |
ListIterator | List_begin (List *self) |
最初の要素のイテレータ | |
ListIterator | List_end (List *self) |
最後の要素の次のイテレータ | |
ListIterator | List_rbegin (List *self) |
最後の要素のイテレータ | |
ListIterator | List_rend (List *self) |
最初の要素の前のイテレータ | |
ListIterator | List_next (ListIterator pos) |
次のイテレータ | |
ListIterator | List_prev (ListIterator pos) |
前のイテレータ | |
T * | List_data (ListIterator pos) |
イテレータによる要素のアクセス | |
T * | List_front (List *self) |
最初の要素のアクセス | |
T * | List_back (List *self) |
最後の要素のアクセス | |
ListIterator | List_insert (List *self, ListIterator pos, T data) |
要素を挿入 | |
int | List_insert_n (List *self, ListIterator pos, size_t n, T data) |
複数個の要素を挿入 | |
int | List_insert_array (List *self, ListIterator pos, T const *data, size_t n) |
配列の要素を挿入 | |
int | List_insert_range (List *self, ListIterator pos, ListIterator first, ListIterator last) |
指定範囲の要素を挿入 | |
int | List_push_front (List *self, T data) |
先頭に要素を挿入 | |
int | List_push_back (List *self, T data) |
末尾に要素を挿入 | |
ListIterator | List_erase (List *self, ListIterator pos) |
要素を削除 | |
ListIterator | List_erase_range (List *self, ListIterator first, ListIterator last) |
指定範囲の要素を削除 | |
void | List_pop_front (List *self) |
最初の要素を削除 | |
void | List_pop_back (List *self) |
最後の要素を削除 | |
void | List_clear (List *self) |
全要素を削除 | |
int | List_resize (List *self, size_t n, T data) |
要素数を変更 | |
void | List_swap (List *self, List *x) |
交換 | |
void | List_splice (List *self, ListIterator pos, List *x, ListIterator first, ListIterator last) |
つなぎ換え | |
void | List_sort (List *self, int(*comp)(const void *p1, const void *p2)) |
ソート | |
void | List_reverse (List *self) |
逆順に並べ替え | |
void | List_merge (List *self, List *x, int(*comp)(const void *p1, const void p2 *)) |
マージ |
listを使うには、<cstl/list.h>をインクルードし、以下のマクロを用いてコードを展開する必要がある。
#include <cstl/list.h> #define CSTL_LIST_INTERFACE(Name, Type) #define CSTL_LIST_IMPLEMENT(Name, Type)
CSTL_LIST_INTERFACE() は任意の名前と要素の型のlistのインターフェイスを展開する。 CSTL_LIST_IMPLEMENT() はその実装を展開する。
#include <stdlib.h> #include <stdio.h> #include <string.h> #include <cstl/list.h> typedef struct { char *key; int value; } Hoge; Hoge *Hoge_new(char *key, int value) { Hoge *self = malloc(sizeof(Hoge)); self->key = key; self->value = value; return self; } void Hoge_delete(Hoge *self) { free(self); } void Hoge_print(Hoge *self) { printf("%s: %d\n", self->key, self->value); } CSTL_LIST_INTERFACE(HogeList, Hoge *) /* インターフェイスを展開 */ CSTL_LIST_IMPLEMENT(HogeList, Hoge *) /* 実装を展開 */ int main(void) { Hoge *hoge; /* イテレータ */ HogeListIterator pos; /* (Hoge *)のlistを生成。 * 型名・関数のプレフィックスはHogeListとなる。 */ HogeList *lst = HogeList_new(); /* 末尾から追加 */ hoge = Hoge_new("aaa", 1); HogeList_push_back(lst, hoge); hoge = Hoge_new("bbb", 2); HogeList_push_back(lst, hoge); /* 先頭から追加 */ hoge = Hoge_new("ccc", 3); HogeList_push_front(lst, hoge); hoge = Hoge_new("ddd", 4); HogeList_push_front(lst, hoge); /* 要素数 */ printf("size: %d\n", HogeList_size(lst)); for (pos = HogeList_begin(lst); pos != HogeList_end(lst); pos = HogeList_next(pos)) { /* イテレータによる要素のアクセス */ Hoge_print(*HogeList_data(pos)); (*HogeList_data(pos))->value++; Hoge_print(*HogeList_data(pos)); } for (pos = HogeList_begin(lst); pos != HogeList_end(lst); pos = HogeList_next(pos)) { Hoge *h = *HogeList_data(pos); if (!strcmp(h->key, "bbb")) { hoge = Hoge_new("eee", 5); /* 要素の挿入 */ HogeList_insert(lst, pos, hoge); } } for (pos = HogeList_begin(lst); pos != HogeList_end(lst);) { Hoge *h = *HogeList_data(pos); if (!strcmp(h->key, "bbb")) { Hoge_delete(h); /* 要素の削除 */ pos = HogeList_erase(lst, pos); } else { pos = HogeList_next(pos); } } /* 先頭から全要素を削除 */ while (!HogeList_empty(lst)) { Hoge *h = *HogeList_front(lst); Hoge_print(h); Hoge_delete(h); HogeList_pop_front(lst); } /* 使い終わったら破棄 */ HogeList_delete(lst); return 0; }
#define CSTL_LIST_INTERFACE | ( | Name, | |||
Type | ) |
インターフェイスマクロ
任意の名前と要素の型のlistのインターフェイスを展開する。
Name | 既存の型と重複しない任意の名前。listの型名と関数のプレフィックスになる | |
Type | 任意の要素の型 |
Type に括弧を付けないこと。
#define CSTL_LIST_IMPLEMENT | ( | Name, | |||
Type | ) |
実装マクロ
CSTL_LIST_INTERFACE()で展開したインターフェイスの実装を展開する。
Name | 既存の型と重複しない任意の名前。listの型名と関数のプレフィックスになる | |
Type | 任意の要素の型 |
Type に括弧を付けないこと。
typedef struct List* ListIterator |
イテレータの型
要素の位置を示す。
以下、関数から返されたイテレータを有効なイテレータという。 宣言されただけのイテレータ、または削除された要素のイテレータを無効なイテレータという。
List* List_new | ( | void | ) |
生成
要素数が0のlistを生成する。
メモリ不足の場合、NULLを返す。
void List_delete | ( | List * | self | ) |
破棄
self のすべての要素を削除し、self を破棄する。 self がNULLの場合、何もしない。
self | listオブジェクト |
size_t List_size | ( | List * | self | ) |
要素数を取得
self | listオブジェクト |
int List_empty | ( | List * | self | ) |
空チェック
self | listオブジェクト |
self の要素数が1以上の場合、0を返す。
ListIterator List_begin | ( | List * | self | ) |
最初の要素のイテレータ
self | listオブジェクト |
ListIterator List_end | ( | List * | self | ) |
最後の要素の次のイテレータ
self | listオブジェクト |
ListIterator List_rbegin | ( | List * | self | ) |
最後の要素のイテレータ
self | listオブジェクト |
ListIterator List_rend | ( | List * | self | ) |
最初の要素の前のイテレータ
self | listオブジェクト |
ListIterator List_next | ( | ListIterator | pos | ) |
次のイテレータ
pos | イテレータ |
pos が List_end() または List_rend() でないこと。
ListIterator List_prev | ( | ListIterator | pos | ) |
前のイテレータ
pos | イテレータ |
pos が List_end() または List_rend() でないこと。
T* List_data | ( | ListIterator | pos | ) |
イテレータによる要素のアクセス
pos | イテレータ |
pos が List_end() または List_rend() でないこと。
T* List_front | ( | List * | self | ) |
最初の要素のアクセス
self | listオブジェクト |
T* List_back | ( | List * | self | ) |
最後の要素のアクセス
self | listオブジェクト |
ListIterator List_insert | ( | List * | self, | |
ListIterator | pos, | |||
T | data | |||
) |
要素を挿入
self のpos が示す位置に、data のコピーを挿入する。
self | listオブジェクト | |
pos | 挿入する位置 | |
data | 挿入するデータ |
メモリ不足の場合、self の変更を行わず0を返す。
int List_insert_n | ( | List * | self, | |
ListIterator | pos, | |||
size_t | n, | |||
T | data | |||
) |
複数個の要素を挿入
self のpos が示す位置に、data のコピーをn 個挿入する。
self | listオブジェクト | |
pos | 挿入する位置 | |
n | 挿入するデータの個数 | |
data | 挿入するデータ |
メモリ不足の場合、self の変更を行わず0を返す。
int List_insert_array | ( | List * | self, | |
ListIterator | pos, | |||
T const * | data, | |||
size_t | n | |||
) |
配列の要素を挿入
self のpos が示す位置に、data という配列からn 個の要素のコピーを挿入する。
self | listオブジェクト | |
pos | 挿入する位置 | |
data | 挿入するデータの配列 | |
n | 挿入するデータの個数 |
メモリ不足の場合、self の変更を行わず0を返す。
data がNULLでないこと。
int List_insert_range | ( | List * | self, | |
ListIterator | pos, | |||
ListIterator | first, | |||
ListIterator | last | |||
) |
指定範囲の要素を挿入
self のpos が示す位置に、[first, last)の範囲の要素のコピーを挿入する。 [first, last)の要素はself が持つ要素でもよい。
self | listオブジェクト | |
pos | 挿入する位置 | |
first | コピー元の範囲の開始位置 | |
last | コピー元の範囲の終了位置 |
メモリ不足の場合、self の変更を行わず0を返す。
[first, last)が有効なイテレータであること。
int List_push_front | ( | List * | self, | |
T | data | |||
) |
先頭に要素を挿入
data のコピーをself の最初の要素として挿入する。
self | listオブジェクト | |
data | 挿入するデータ |
メモリ不足の場合、self の変更を行わず0を返す。
int List_push_back | ( | List * | self, | |
T | data | |||
) |
末尾に要素を挿入
data のコピーをself の最後の要素として挿入する。
self | listオブジェクト | |
data | 挿入するデータ |
メモリ不足の場合、self の変更を行わず0を返す。
ListIterator List_erase | ( | List * | self, | |
ListIterator | pos | |||
) |
要素を削除
self のpos が示す位置の要素を削除する。
self | listオブジェクト | |
pos | 削除する要素の位置 |
pos が List_end() または List_rend() でないこと。
ListIterator List_erase_range | ( | List * | self, | |
ListIterator | first, | |||
ListIterator | last | |||
) |
指定範囲の要素を削除
self の[first, last)の範囲の要素を削除する。
self | listオブジェクト | |
first | 削除する範囲の開始位置 | |
last | 削除する範囲の終了位置 |
void List_pop_front | ( | List * | self | ) |
最初の要素を削除
self の最初の要素を削除する。
self | listオブジェクト |
void List_pop_back | ( | List * | self | ) |
最後の要素を削除
self の最後の要素を削除する。
self | listオブジェクト |
void List_clear | ( | List * | self | ) |
全要素を削除
self のすべての要素を削除する。
self | listオブジェクト |
int List_resize | ( | List * | self, | |
size_t | n, | |||
T | data | |||
) |
要素数を変更
self の要素数をn 個に変更する。 n がself の現在の要素数以下の場合、要素数がn 個になるまで末尾から要素が削除される。 n がself の現在の要素数より大きい場合、要素数がn 個になるまでdata のコピーが末尾から挿入される。
self | listオブジェクト | |
n | 要素数 | |
data | 挿入するデータ |
メモリ不足の場合、self の変更を行わず0を返す。
交換
self とx の内容を交換する。
self | listオブジェクト | |
x | self と内容を交換するlistオブジェクト |
void List_splice | ( | List * | self, | |
ListIterator | pos, | |||
List * | x, | |||
ListIterator | first, | |||
ListIterator | last | |||
) |
つなぎ換え
self のpos が示す位置に、x の[first, last)の範囲の要素を移動する。
self | listオブジェクト | |
pos | つなぎ換え先 | |
x | [first, last)の要素を持つlistオブジェクト | |
first | つなぎ換え元の範囲の開始位置 | |
last | つなぎ換え元の範囲の終了位置 |
[first, last)がx の有効なイテレータであること。
self とx が同一ならばpos は[first, last)の範囲外であること。
void List_sort | ( | List * | self, | |
int(*)(const void *p1, const void *p2) | comp | |||
) |
ソート
self のすべての要素を比較関数comp に従ってソートする。 このソートは安定である。
self | listオブジェクト | |
comp | 比較関数 |
void List_reverse | ( | List * | self | ) |
逆順に並べ替え
self のすべての要素を逆順に並べ替える。
self | listオブジェクト |
マージ
ソートされた状態であるself とx において、x のすべての要素を比較関数comp に従ってself にマージする。 self はソートされた状態になり、x は空になる。
self | listオブジェクト | |
x | self にマージされるlistオブジェクト | |
comp | 比較関数 |
selfとxがcompに従ってソートされていること。