メインページ | 構成 | ファイル一覧 | 構成メンバ | ファイルメンバ | 関連ページ

dkcArrayOneByOne.c

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

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

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

Include dependency graph

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

Included by dependency graph

ソースコードを見る。

マクロ定義

#define DKUTIL_C_ARRAY_ONEBYONE_C

関数

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)
 dkcAllocArrayOneByOneStatic() バッファが足りない場合、バッファを動的拡張するモードです。

int WINAPI dkcFreeArrayOneByOne (DKC_ARRAY_ONEBYONE **p)
 dkcAllocArrayOneByOne 系で取得したメモリ領域を開放します。

int BufferResize (DKC_ARRAY_ONEBYONE *p)
 バッファをリサイズ。INT_MAX個以上の要素は挿入できないようになっている。

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)
 dkcArrayOneByOnePush()の安全版

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を返すコンテナです。
から:
2004/08/22

d金魚

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


マクロ定義

#define DKUTIL_C_ARRAY_ONEBYONE_C
 

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


関数

int BufferResize DKC_ARRAY_ONEBYONE p  )  [static]
 

バッファをリサイズ。INT_MAX個以上の要素は挿入できないようになっている。

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

参照先 DKC_ARRAY_ONEBYONE, dkcBufferResize(), dkcBufferSize(), dkcmFORCE_NOT_ASSERT, dkcStackDynamicPush(), DKUTIL_FAILED, edk_FAILED, edk_SUCCEEDED, 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 }

DKC_ARRAY_ONEBYONE* WINAPI dkcAllocArrayOneByOne BYTE  flag,
size_t  offset,
size_t  num,
size_t  ext_size
 

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

参照先 BYTE, DKC_ARRAY_ONEBYONE, 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.c61 行で定義されています。

参照先 DKC_ARRAY_ONEBYONE, 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.c57 行で定義されています。

参照先 DKC_ARRAY_ONEBYONE, dkcAllocArrayOneByOne(), と edkcArrayOneByOneStatic.

00057                                                                                  {
00058     return dkcAllocArrayOneByOne(   edkcArrayOneByOneStatic, offset , num , 0 );
00059 }

size_t WINAPI dkcArrayOneByOneCapacity DKC_ARRAY_ONEBYONE p  ) 
 

このコンテナの許容量(要素数)を返す。

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

参照先 DKC_ARRAY_ONEBYONE, と dkc_ArrayOneByOne::mNum.

00197                                                              {
00198     return p->mNum;
00199 }

size_t WINAPI dkcArrayOneByOneOffset DKC_ARRAY_ONEBYONE p  ) 
 

一つの要素のサイズ(オフセット)を返す

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

参照先 DKC_ARRAY_ONEBYONE, と dkc_ArrayOneByOne::mOffset.

00207                                                            {
00208     return p->mOffset;
00209 }

int WINAPI dkcArrayOneByOnePop DKC_ARRAY_ONEBYONE p,
int  id
 

要素を削除する

戻り値:
enum edk_Resultのどれかを返す。

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

参照先 DKC_ARRAY_ONEBYONE, 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.c164 行で定義されています。

参照先 DKC_ARRAY_ONEBYONE, DKC_INLINE, 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.c129 行で定義されています。

参照先 BufferResize(), DKC_ARRAY_ONEBYONE, dkcStackIsEmpty(), DKUTIL_FAILED, 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.c188 行で定義されています。

参照先 DKC_ARRAY_ONEBYONE, 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.c202 行で定義されています。

参照先 DKC_ARRAY_ONEBYONE, dkcStackRestSize(), と dkc_ArrayOneByOne::mStack.

00203 {
00204     return dkcStackRestSize(p->mStack);
00205 }

size_t WINAPI dkcArrayOneByOneSize DKC_ARRAY_ONEBYONE p  ) 
 

現在の使用している要素数を返す。

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

参照先 DKC_ARRAY_ONEBYONE, 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.c65 行で定義されています。

参照先 DKC_ARRAY_ONEBYONE, dkcFree(), dkcFreeBuffer(), dkcFreeStack(), edk_FAILED, と 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 }

size_t setData DKC_ARRAY_ONEBYONE p,
const void *  data,
size_t  size
[static]
 

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

参照先 DKC_ARRAY_ONEBYONE, dkcBufferSetOffset(), dkcmFORCE_NOT_ASSERT, dkcStackPop(), dkcStackTop(), DKUTIL_FAILED, 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 }


dkutil_cに対してTue Oct 19 03:35:04 2004に生成されました。 doxygen 1.3.6