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

#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;

//////////////////////////////////////////////////////////////////////
// 関数定義
//////////////////////////////////////////////////////////////////////
// 初期化
#ifdef MDEBUG

vector_obj* vector_new_debug(int first_size, const char* fname, int line, const char* func_name);
#define VECTOR_NEW(size) vector_new_debug(size, __FILE__, __LINE__, __FUNCTION__)

#else

vector_obj* vector_new(int first_size);
#define VECTOR_NEW(size) vector_new(size)

#endif

void vector_delete(vector_obj* self);                           // 解放

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

#define vector_item(o, i) ((vector_obj*)o)->mTable[i]

//void* vector_item(vector_obj* self, int index);                 // アイテムを返す
/*
//////////////////////////////////////////////////////////////////////
// アイテムを返す
//////////////////////////////////////////////////////////////////////
void* vector_item(vector_obj* self, int index)
{
    if(index >= 0 && index < self->mCount) {
        return self->mTable[index];
    }
    else {
        return NULL;
    }
}
   
///////////////////////////////////////////////////////////////////////
// サイズを返す
///////////////////////////////////////////////////////////////////////
int vector_size(vector_obj* self)
{
   return self->mCount;
}
int vector_size(vector_obj* self);                              // サイズを返す
*/

#define vector_size(o) ((vector_obj*)o)->mCount

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 int (*sort_if)(void* left, void* right);             // -1でエラー
BOOL vector_sort(vector_obj* self, sort_if fun);                // アイテムをソートするFALSEが返ったらCTRL-Cが押された



#endif
