コードベースのいくつかの場所で、動的に拡張する配列、つまり要素カウンターと「最大要素」値を組み合わせた基本配列を使用していることに気付きました。
私がやりたいのは、通常のオブジェクト指向の理由から、これらを共通のデータ構造とユーティリティ関数に置き換えることです。配列要素は、基本的なデータ型または構造体のいずれかです。要素への高速ランダムアクセスが必要であり、できればタイプセーフな実装が必要です。
したがって、基本的にはSTLベクトルを使用しますが、コードベースはC89に制限されているため、別の方法を考え出す必要があります:-)
私はそれにいくつかの考えを与え、私が何を目指しているかを示すために、この最初のドラフトを作成しました:
/* Type-safe dynamic list in C89 */
#define list_declare(type) typedef struct _##type##_list_t { type * base_array; size_t elements; size_t max_size; } type##_list_t
#define list(type) type##_list_t
#define list_new(type, initial_size) { calloc(initial_size, sizeof(type)), 0, initial_size }
#define list_free(list) free(list.base_array)
#define list_set(list, place, element) if ( list.elements < list.max_size ) { list.base_array[place] = element; } else { /* Array index out of bounds */ }
#define list_add(list, element) if ( list.elements < list.max_size ) { list.base_array[list.elements++] = element; } else { /* Expand array then add */ }
#define list_get(list, n) list.base_array[n]
/* Sample usage: */
list_declare(int);
int main(void)
{
list(int) integers = list_new(int, 10);
printf("list[0] = %d\n", list_get(integers, 0));
list_add(integers, 4);
printf("list[0] = %d\n", list_get(integers, 0));
list_set(integers, 0, 3);
printf("list[0] = %d\n", list_get(integers, 0));
list_free(integers);
return EXIT_SUCCESS;
}
...しかし、これを以前に行ったことがある人が他にいるはずです。私は、FreeBSD sys / queue.hがいくつかの異なるキューに対して同様の概念を実装していることを知っていますが、配列に対してはそのようなものを見つけることができません。
ここに賢い人はいますか?