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

# dkcArrayOneByOne.c

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

`#include "dkcArrayOneByOne.h"`
`#include "dkcStdio.h"`

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

ソースコードを見る。

## マクロ定義
#define | DKUTIL_C_ARRAY_ONEBYONE_C
## 関数
static DKC_ARRAY_ONEBYONE *WINAPI | dkcAllocArrayOneByOne (BYTE flag, size_t offset, size_t num, size_t ext_size)
DKC_ARRAY_ONEBYONE *WINAPI | dkcAllocArrayOneByOneStatic (size_t offset, size_t num)
DKC_ARRAY_ONEBYONE *WINAPI | dkcAllocArrayOneByOneDynamic (size_t offset, size_t num, size_t ext_num)
int WINAPI | dkcFreeArrayOneByOne (DKC_ARRAY_ONEBYONE **p)
| dkcAllocArrayOneByOne　系で取得したメモリ領域を開放します。
static int | BufferResize (DKC_ARRAY_ONEBYONE *p)
| バッファをリサイズ。INT_MAX個以上の要素は挿入できないようになっている。
static size_t | setData (DKC_ARRAY_ONEBYONE *p, const void *data, size_t size)
int WINAPI | dkcArrayOneByOnePushSafe (DKC_ARRAY_ONEBYONE *p, const void *data, size_t size)
DKC_INLINE int WINAPI | dkcArrayOneByOnePush (DKC_ARRAY_ONEBYONE *p, const void *data)
| 要素を挿入する
int WINAPI | dkcArrayOneByOnePop (DKC_ARRAY_ONEBYONE *p, int id)
| 要素を削除する
int WINAPI | dkcArrayOneByOneReference (DKC_ARRAY_ONEBYONE *p, int id, void *pp)
size_t WINAPI | dkcArrayOneByOneSize (DKC_ARRAY_ONEBYONE *p)
| 現在の使用している要素数を返す。
size_t WINAPI | dkcArrayOneByOneCapacity (DKC_ARRAY_ONEBYONE *p)
| このコンテナの許容量（要素数）を返す。
size_t WINAPI | dkcArrayOneByOneRestSize (DKC_ARRAY_ONEBYONE *p)
| このコンテナの残り領域（要素数）を返す
size_t WINAPI | dkcArrayOneByOneOffset (DKC_ARRAY_ONEBYONE *p)
| 一つの要素のサイズ（オフセット）を返す

## 説明

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

作者:
  d金魚

から:
  2004/08/22

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

## マクロ定義

#define DKUTIL_C_ARRAY_ONEBYONE_C

| dkcArrayOneByOne.c の 9 行で定義されています。

## 関数

static int BufferResize | ( | DKC_ARRAY_ONEBYONE * | p | ) | `[static]`

| バッファをリサイズ。INT_MAX個以上の要素は挿入できないようになっている。 dkcArrayOneByOne.c の 76 行で定義されています。 参照先 dkcBufferResize(), dkcBufferSize(), dkcmFORCE_NOT_ASSERT, dkcStackDynamicPush(), dkc_ArrayOneByOne::mBuff, dkc_ArrayOneByOne::mExtNum, dkc_ArrayOneByOne::mNum, dkc_ArrayOneByOne::mOffset, と dkc_ArrayOneByOne::mStack. 参照元 dkcArrayOneByOnePushSafe().
    00076                                               {
    00077
    00078     size_t tsize;
    00079     size_t temp;
    00080     int i;
    00081         //保存しておく
    00082     tsize = dkcBufferSize(p->mBuff);
    00083
    00084
    00085     //length check
    00086     if(p->mNum + p->mExtNum > INT_MAX){
    00087         return edk_FAILED;
    00088     }
    00089
    00090     //バッファを拡張
    00091     temp = (p->mExtNum * p->mOffset) + tsize;
    00092
    00093     dkcmFORCE_NOT_ASSERT(
    00094         DKUTIL_FAILED(dkcBufferResize(p->mBuff,temp))
    00095     );
    00096
    00097
    00098
    00099
    00100     //このループになれていないからバグあるかも？
    00101     tsize = p->mExtNum;
    00102     for(i = (int)(p->mNum + p->mExtNum - 1); i >= (int)tsize; i--)
    00103     {
    00104         dkcStackDynamicPush(p->mStack,&i);
    00105     }
    00106     //全体数を更新
    00107     p->mNum += p->mExtNum;
    00108
    00109     return edk_SUCCEEDED;
    00110
    00111 }

static DKC_ARRAY_ONEBYONE* WINAPI dkcAllocArrayOneByOne | ( | BYTE | flag,
|  | size_t | offset,
|  | size_t | num,
|  | size_t | ext_size
| ) | `[static]`

| dkcArrayOneByOne.c の 14 行で定義されています。 参照先 dkcAllocate(), dkcAllocBuffer(), dkcAllocStack(), dkcFree(), dkcFreeBuffer(), dkcFreeStack(), dkcStackPush(), dkc_ArrayOneByOne::mBuff, dkc_ArrayOneByOne::mExtNum, dkc_ArrayOneByOne::mFlag, dkc_ArrayOneByOne::mNum, dkc_ArrayOneByOne::mOffset, dkc_ArrayOneByOne::mStack, と NULL. 参照元 dkcAllocArrayOneByOneDynamic(), と dkcAllocArrayOneByOneStatic().
    00014                                                                                                              {
    00015     DKC_ARRAY_ONEBYONE *p;
    00016     int i;
    00017
    00018     p = (DKC_ARRAY_ONEBYONE *)dkcAllocate(sizeof(DKC_ARRAY_ONEBYONE));
    00019     if(NULL==p){
    00020         return NULL;
    00021     }
    00022
    00023     //offset * num個のバッファを確保
    00024     p->mBuff = dkcAllocBuffer(NULL,offset * num);
    00025     if(NULL==p->mBuff){
    00026         goto Error;
    00027     }
    00028
    00029     //num個のint用スタックを確保
    00030     p->mStack = dkcAllocStack(num,sizeof(int));
    00031     if(NULL==p->mStack){
    00032         goto Error;
    00033     }
    00034
    00035     //スタックを初期化 (最初の配列の方をスタックの最初の方にしたいので＾＾；
    00036     for(i = num - 1; i>=0 ;i--){
    00037         dkcStackPush(p->mStack,(const void *)&i);
    00038     }
    00039
    00040     p->mOffset = offset;
    00041     p->mNum = num;
    00042     p->mFlag = flag;
    00043     p->mExtNum = ext_size;
    00044
    00045     return p;
    00046
    00047
    00048
    00049 Error:
    00050     dkcFreeStack(&(p->mStack));
    00051     dkcFreeBuffer(&(p->mBuff));
    00052     dkcFree((void **)&p);
    00053     return NULL;
    00054 }

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_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 }

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

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

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

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

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_INLINE 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 }

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 }

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 }

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

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

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

| 現在の使用している要素数を返す。 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 }

int WINAPI dkcFreeArrayOneByOne | ( | DKC_ARRAY_ONEBYONE ** | p | ) |

| 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 }

static size_t setData | ( | DKC_ARRAY_ONEBYONE * | p,
|  | const void * | data,
|  | size_t | size
| ) | `[static]`

| dkcArrayOneByOne.c の 113 行で定義されています。 参照先 dkcBufferSetOffset(), dkcmFORCE_NOT_ASSERT, dkcStackPop(), dkcStackTop(), dkc_ArrayOneByOne::mBuff, dkc_ArrayOneByOne::mOffset, と dkc_ArrayOneByOne::mStack. 参照元 dkcArrayOneByOnePushSafe().
    00113                                                                          {
    00114     int id;
    00115
    00116     dkcStackTop(p->mStack,&id);
    00117
    00118     dkcmFORCE_NOT_ASSERT(
    00119         DKUTIL_FAILED(
    00120             dkcBufferSetOffset(p->mBuff,data,size,p->mOffset * id)
    00121         )
    00122     );
    00123
    00124     dkcStackPop(p->mStack);
    00125     return id;
    00126 }