/*
 * 動的配列ライブラリ
 */

#ifndef MINATO__VECTOR_H
#define MINATO__VECTOR_H

#define BOOL int
#define TRUE 1
#define FALSE 0

/* 動的配列オブジェクト */
typedef struct {
   void** mTable;
   int mTableSize;
   
   int mCount;
} vector_obj;

///////////////////////////////////////////////////////////////////////////////
// 関数定義
///////////////////////////////////////////////////////////////////////////////
vector_obj* vector_new(int first_size);                         // 初期化
void vector_delete(vector_obj* self);                           // 解放

vector_obj* vector_clone(vector_obj* v);                        // クローン

void* vector_item(vector_obj* self, int index);                 // アイテムを返す
int vector_size(vector_obj* self);                              // サイズを返す
int vector_index(vector_obj* self, void* item);                 // アイテムのインデックスを返す

void vector_exchange(vector_obj* self, int n, void* item);      // アイテムをnの位置に置きなおす
void vector_add(vector_obj* self, void* item);                  // アイテムを最後に追加
void vector_insert(vector_obj* self, int n, void* item);        // アイテムをnの位置に挿入
void* vector_erase(vector_obj* self, int n);                    // nの位置のアイテムを削除
void* vector_pop_back(vector_obj* self);                        // 最後のアイテムを取り出す
void* vector_pop_front(vector_obj* self);                       // 最初のアイテムを取り出す
void vector_clear(vector_obj* self);                            // アイテムをクリア

typedef BOOL (*sort_if)(void* left, void* right);
void vector_sort(vector_obj* self, sort_if fun);                // アイテムをソートする

#endif
