#include "dkcArrayOneByOne.h"
#include "dkcStdio.h"
dkcArrayOneByOne.cのインクルード依存関係図
マクロ定義 | |
#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) |
一つの要素のサイズ(オフセット)を返す |
dkcArrayOneByOne.c で定義されています。
|
dkcArrayOneByOne.c の 9 行で定義されています。 |
|
バッファをリサイズ。INT_MAX個以上の要素は挿入できないようになっている。
dkcArrayOneByOne.c の 76 行で定義されています。 参照先 DKC_ARRAY_ONEBYONE, 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 } |
|
dkcArrayOneByOne.c の 14 行で定義されています。 参照先 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 } |
|
dkcAllocArrayOneByOneStatic() バッファが足りない場合、バッファを動的拡張するモードです。
dkcArrayOneByOne.c の 61 行で定義されています。 参照先 DKC_ARRAY_ONEBYONE, dkcAllocArrayOneByOne(), と edkcArrayOneByOneDynamic.
00061 { 00062 return dkcAllocArrayOneByOne( edkcArrayOneByOneDynamic, offset,num,ext_num); 00063 } |
|
dkcArrayOneByOne.c の 57 行で定義されています。 参照先 DKC_ARRAY_ONEBYONE, dkcAllocArrayOneByOne(), と edkcArrayOneByOneStatic.
00057 { 00058 return dkcAllocArrayOneByOne( edkcArrayOneByOneStatic, offset , num , 0 ); 00059 } |
|
このコンテナの許容量(要素数)を返す。
dkcArrayOneByOne.c の 197 行で定義されています。 参照先 DKC_ARRAY_ONEBYONE, と dkc_ArrayOneByOne::mNum.
00197 { 00198 return p->mNum; 00199 } |
|
一つの要素のサイズ(オフセット)を返す
dkcArrayOneByOne.c の 207 行で定義されています。 参照先 DKC_ARRAY_ONEBYONE, と dkc_ArrayOneByOne::mOffset.
00207 { 00208 return p->mOffset; 00209 } |
|
要素を削除する
dkcArrayOneByOne.c の 173 行で定義されています。 参照先 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 } |
|
要素を挿入する
dkcArrayOneByOne.c の 164 行で定義されています。 参照先 DKC_ARRAY_ONEBYONE, dkcArrayOneByOnePushSafe(), と dkc_ArrayOneByOne::mOffset.
00164 { 00165 00166 return dkcArrayOneByOnePushSafe(p,data,p->mOffset); 00167 } |
|
dkcArrayOneByOne.c の 129 行で定義されています。 参照先 BufferResize(), DKC_ARRAY_ONEBYONE, dkcStackIsEmpty(), edkcArrayOneByOneDynamic, edkcArrayOneByOneStatic, dkc_ArrayOneByOne::mFlag, dkc_ArrayOneByOne::mOffset, dkc_ArrayOneByOne::mStack, と setData().
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 } |
|
dkcArrayOneByOne.c の 188 行で定義されています。 参照先 DKC_ARRAY_ONEBYONE, dkcBufferGetOffset(), dkc_ArrayOneByOne::mBuff, と dkc_ArrayOneByOne::mOffset.
00188 { 00189 return dkcBufferGetOffset(p->mBuff,pp,p->mOffset,p->mOffset * id); 00190 } |
|
このコンテナの残り領域(要素数)を返す
dkcArrayOneByOne.c の 202 行で定義されています。 参照先 DKC_ARRAY_ONEBYONE, dkcStackRestSize(), と dkc_ArrayOneByOne::mStack.
00203 { 00204 return dkcStackRestSize(p->mStack); 00205 } |
|
現在の使用している要素数を返す。
dkcArrayOneByOne.c の 193 行で定義されています。 参照先 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 } |
|
dkcAllocArrayOneByOne 系で取得したメモリ領域を開放します。
dkcArrayOneByOne.c の 65 行で定義されています。 参照先 DKC_ARRAY_ONEBYONE, 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 } |
|
dkcArrayOneByOne.c の 113 行で定義されています。 参照先 DKC_ARRAY_ONEBYONE, 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 } |