メインページ | アルファベット順一覧 | 構成 | ファイル一覧 | 構成メンバ | ファイルメンバ | 関連ページ

# dkcArrayOneByOne.h

配列プールにO(1)でデータを入れて、参照IDを返すコンテナです。 [詳細]

`#include "dkcOSIndependent.h"`
`#include "dkcBuffer.h"`
`#include "dkcStack.h"`

dkcArrayOneByOne.hのインクルード依存関係図

このグラフは、どのファイルから直接、間接的にインクルードされているかを示しています。

ソースコードを見る。

## 構成
struct | dkc_ArrayOneByOne
## 型定義
typedef dkc_ArrayOneByOne | DKC_ARRAY_ONEBYONE
## 列挙型
enum | { edkcArrayOneByOneStatic = 0, edkcArrayOneByOneDynamic }
## 関数
DKC_EXTERN DKC_ARRAY_ONEBYONE *WINAPI | dkcAllocArrayOneByOneStatic (size_t offset, size_t num)
DKC_EXTERN DKC_ARRAY_ONEBYONE *WINAPI | dkcAllocArrayOneByOneDynamic (size_t offset, size_t num, size_t ext_num)
DKC_EXTERN int WINAPI | dkcFreeArrayOneByOne (DKC_ARRAY_ONEBYONE **pp)
| dkcAllocArrayOneByOne　系で取得したメモリ領域を開放します。
DKC_EXTERN int WINAPI | dkcArrayOneByOnePushSafe (DKC_ARRAY_ONEBYONE *, const void *data, size_t size)
DKC_EXTERN int WINAPI | dkcArrayOneByOnePush (DKC_ARRAY_ONEBYONE *, const void *data)
| 要素を挿入する
DKC_EXTERN int WINAPI | dkcArrayOneByOnePop (DKC_ARRAY_ONEBYONE *, int id)
| 要素を削除する
DKC_EXTERN int WINAPI | dkcArrayOneByOneReference (DKC_ARRAY_ONEBYONE *, int id, void *ref)
DKC_EXTERN size_t WINAPI | dkcArrayOneByOneSize (DKC_ARRAY_ONEBYONE *)
| 現在の使用している要素数を返す。
DKC_EXTERN size_t WINAPI | dkcArrayOneByOneCapacity (DKC_ARRAY_ONEBYONE *)
| このコンテナの許容量（要素数）を返す。
DKC_EXTERN size_t WINAPI | dkcArrayOneByOneRestSize (DKC_ARRAY_ONEBYONE *p)
| このコンテナの残り領域（要素数）を返す
DKC_EXTERN size_t WINAPI | dkcArrayOneByOneOffset (DKC_ARRAY_ONEBYONE *)
| 一つの要素のサイズ（オフセット）を返す

## 説明

配列プールにO(1)でデータを入れて、参照IDを返すコンテナです。

作者:
  d金魚

から:
  2004/08/22

覚え書き:
  アルゴリズム概要

- 配列の空き領域への配列の添え字（以下 参照ID)をStackに入れておく。
- 挿入するときはStackから空き領域を得る、そして参照IDを返す。
- 削除するときは参照IDを受け取り、そのIDをStackに返す。
- 初期化フラグによって自動的に内部バッファが動的拡張されたりする。
- バッファをいつでもリサイズする事が出来る。（しかし、内部にデータがある場合はバッファを小さくは出来ない。）

仕様 INT_MAX個の要素までしか挿入できない。

dkcArrayOneByOne.h で定義されています。

## 型定義

typedef struct dkc_ArrayOneByOne DKC_ARRAY_ONEBYONE

| 配列の中から空き領域を得るための機構が使う構造体

## 列挙型

anonymous enum

  | 列挙型の値:
  edkcArrayOneByOneStatic | バッファの拡張は出来ないタイプ
  edkcArrayOneByOneDynamic | バッファの格調が出来るタイプ
dkcArrayOneByOne.h の 46 行で定義されています。
    00046     {
    00048     edkcArrayOneByOneStatic = 0,
    00050     edkcArrayOneByOneDynamic,
    00051 };

## 関数

DKC_EXTERN DKC_ARRAY_ONEBYONE* WINAPI dkcAllocArrayOneByOneDynamic | ( | size_t | offset,
|  | size_t | num,
|  | size_t | ext_num
| ) |

| 参照: dkcAllocArrayOneByOneStatic() バッファが足りない場合、バッファを動的拡張するモードです。 dkcArrayOneByOne.c の 61 行で定義されています。 参照先 dkcAllocArrayOneByOne(), と edkcArrayOneByOneDynamic.
    00061                                                                                                  {
    00062     return dkcAllocArrayOneByOne(   edkcArrayOneByOneDynamic, offset,num,ext_num);
    00063 }

DKC_EXTERN DKC_ARRAY_ONEBYONE* WINAPI dkcAllocArrayOneByOneStatic | ( | size_t | offset,
|  | size_t | num
| ) |

  | 引数:
  | offset[in] | データのオフセット
  | num[in] | 初期バッファの数 (確保されるメモリ領域はoffset * num)
覚え書き: 内部でバッファを動的拡張しないモードで初期化します。 dkcArrayOneByOne.c の 57 行で定義されています。 参照先 dkcAllocArrayOneByOne(), と edkcArrayOneByOneStatic.
    00057                                                                                  {
    00058     return dkcAllocArrayOneByOne(   edkcArrayOneByOneStatic, offset , num , 0 );
    00059 }

DKC_EXTERN size_t WINAPI dkcArrayOneByOneCapacity | ( | DKC_ARRAY_ONEBYONE * |  | ) |

| このコンテナの許容量（要素数）を返す。 dkcArrayOneByOne.c の 197 行で定義されています。 参照先 dkc_ArrayOneByOne::mNum.
    00197                                                              {
    00198     return p->mNum;
    00199 }

DKC_EXTERN size_t WINAPI dkcArrayOneByOneOffset | ( | DKC_ARRAY_ONEBYONE * |  | ) |

| 一つの要素のサイズ（オフセット）を返す dkcArrayOneByOne.c の 207 行で定義されています。 参照先 dkc_ArrayOneByOne::mOffset.
    00207                                                            {
    00208     return p->mOffset;
    00209 }

DKC_EXTERN int WINAPI dkcArrayOneByOnePop | ( | DKC_ARRAY_ONEBYONE * | p,
|  | int | id
| ) |

| 要素を削除する 戻り値: enum edk_Resultのどれかを返す。 dkcArrayOneByOne.c の 173 行で定義されています。 参照先 dkcmFORCE_NOT_ASSERT, dkcStackDynamicPush(), dkc_Stack::mBuffer, dkc_Stack::mCount, と dkc_ArrayOneByOne::mStack.
    00173                                                             {
    00174
    00175 #ifdef DEBUG
    00176     int i;
    00177     //重複チェックをしてみる。
    00178     int *ch = (int *)p->mStack->mBuffer;
    00179     size_t se = p->mStack->mCount;
    00180     for(i=0;i<(int)se;i++){
    00181         dkcmFORCE_NOT_ASSERT(ch[i] == id);
    00182     }
    00183 #endif
    00184     return dkcStackDynamicPush(p->mStack,&id);
    00185 }

DKC_EXTERN int WINAPI dkcArrayOneByOnePush | ( | DKC_ARRAY_ONEBYONE * | ,
|  | const void * | data
| ) |

| 要素を挿入する 戻り値: 参照IDを返す。失敗した場合は -1 dkcArrayOneByOne.c の 164 行で定義されています。 参照先 dkcArrayOneByOnePushSafe(), と dkc_ArrayOneByOne::mOffset.
    00164                                                                                   {
    00165
    00166     return dkcArrayOneByOnePushSafe(p,data,p->mOffset);
    00167 }

DKC_EXTERN int WINAPI dkcArrayOneByOnePushSafe | ( | DKC_ARRAY_ONEBYONE * | p,
|  | const void * | data,
|  | size_t | size
| ) |

| 参照: dkcArrayOneByOnePush()の安全版 dkcArrayOneByOne.c の 129 行で定義されています。 参照先 BufferResize(), dkcStackIsEmpty(), edkcArrayOneByOneDynamic, edkcArrayOneByOneStatic, dkc_ArrayOneByOne::mFlag, dkc_ArrayOneByOne::mOffset, dkc_ArrayOneByOne::mStack, と setData(). 参照元 dkcArrayOneByOnePush().
    00129                                                                                        {
    00130     size_t r;
    00131
    00132     if(size > p->mOffset){
    00133         return -1;
    00134     }
    00135
    00136
    00137
    00138     switch(p->mFlag)
    00139     {
    00140     case edkcArrayOneByOneStatic:
    00141         if(dkcStackIsEmpty(p->mStack)){
    00142             return -1;
    00143         }
    00144
    00145         break;
    00146     case edkcArrayOneByOneDynamic:
    00147         if(dkcStackIsEmpty(p->mStack))
    00148         {//バッファ拡張処理
    00149             if(DKUTIL_FAILED(BufferResize(p))){
    00150                 return -1;
    00151             }
    00152         }
    00153
    00154         break;
    00155     }//end of switch
    00156
    00157     r  = setData(p,data,size);
    00158
    00159     return r;
    00160
    00161 }

DKC_EXTERN int WINAPI dkcArrayOneByOneReference | ( | DKC_ARRAY_ONEBYONE * | ,
|  | int | id,
|  | void * | ref
| ) |

  | 引数:
  | id[in] | Pushで得た参照IDを指定する
  | ref[out] | 関数が成功した場合、idへのポインタが返る。
戻り値: enum edk_Resultのどれかを返す。 dkcArrayOneByOne.c の 188 行で定義されています。 参照先 dkcBufferGetOffset(), dkc_ArrayOneByOne::mBuff, と dkc_ArrayOneByOne::mOffset.
    00188                                                                            {
    00189     return dkcBufferGetOffset(p->mBuff,pp,p->mOffset,p->mOffset * id);
    00190 }

DKC_EXTERN size_t WINAPI dkcArrayOneByOneRestSize | ( | DKC_ARRAY_ONEBYONE * | p | ) |

| このコンテナの残り領域（要素数）を返す dkcArrayOneByOne.c の 202 行で定義されています。 参照先 dkcStackRestSize(), と dkc_ArrayOneByOne::mStack.
    00203 {
    00204     return dkcStackRestSize(p->mStack);
    00205 }

DKC_EXTERN size_t WINAPI dkcArrayOneByOneSize | ( | DKC_ARRAY_ONEBYONE * |  | ) |

| 現在の使用している要素数を返す。 dkcArrayOneByOne.c の 193 行で定義されています。 参照先 dkcmNOT_ASSERT, dkcStackSize(), dkc_ArrayOneByOne::mNum, と dkc_ArrayOneByOne::mStack.
    00193                                                          {
    00194     dkcmNOT_ASSERT(p->mNum < dkcStackSize(p->mStack));
    00195     return p->mNum - dkcStackSize(p->mStack);
    00196 }

DKC_EXTERN int WINAPI dkcFreeArrayOneByOne | ( | DKC_ARRAY_ONEBYONE ** | pp | ) |

| dkcAllocArrayOneByOne　系で取得したメモリ領域を開放します。 dkcArrayOneByOne.c の 65 行で定義されています。 参照先 dkcFree(), dkcFreeBuffer(), dkcFreeStack(), と NULL.
    00065                                                        {
    00066     if(NULL==p || NULL==*p){
    00067         return edk_FAILED;
    00068     }
    00069     dkcFreeStack(& ( (*p)->mStack ) );
    00070     dkcFreeBuffer(& ( (*p)->mBuff ) );
    00071     return dkcFree((void **)p);
    00072 }