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

dkcQueue.h

キュー Queue [詳細]

#include "dkcOSIndependent.h"
#include "dkcSerialize.h"

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

Include dependency graph

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

Included by dependency graph

ソースコードを見る。

構成

struct  dkc_Queue

型定義

typedef dkc_Queue DKC_QUEUE

関数

DKC_EXTERN DKC_QUEUE *WINAPI dkcAllocQueue (size_t numof__, size_t offsetof__)
 キュー領域を得る。

DKC_EXTERN int WINAPI dkcFreeQueue (DKC_QUEUE **ptr)
 dkcAllocNewQueueと対。

DKC_EXTERN int WINAPI dkcQueuePush (DKC_QUEUE *ptr, const void *)
DKC_EXTERN int WINAPI dkcQueueDynamicPush (DKC_QUEUE *ptr, const void *)
DKC_EXTERN void WINAPI dkcQueuePop (DKC_QUEUE *ptr)
DKC_EXTERN int WINAPI dkcQueueTop (DKC_QUEUE *ptr, void *)
DKC_EXTERN size_t WINAPI dkcQueueSize (DKC_QUEUE *ptr)
DKC_EXTERN BOOL WINAPI dkcQueueIsEmpty (DKC_QUEUE *ptr)
DKC_EXTERN void WINAPI dkcQueueClear (DKC_QUEUE *ptr)
DKC_EXTERN int WINAPI dkcQueueSerialize (const DKC_QUEUE *ptr, DKC_SERIALIZE *se)
DKC_EXTERN DKC_QUEUE *WINAPI dkcAllocQueueDeserialize (DKC_DESERIALIZE *se)
DKC_EXTERN int WINAPI dkcQueueGetPoint (const DKC_QUEUE *ptr, size_t point_of__, void *buffer, size_t buffsize)


説明

キュー Queue

d金魚

から:
2004/3/xx

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


型定義

typedef struct dkc_Queue DKC_QUEUE
 

キュー構造体

参照元 dkcAllocQueue(), dkcAllocQueueDeserialize(), dkcFreeQueue(), dkcQueueClear(), dkcQueueDynamicPush(), dkcQueueIsEmpty(), dkcQueuePop(), dkcQueuePush(), dkcQueueSerialize(), dkcQueueSize(), と dkcQueueTop().


関数

DKC_EXTERN DKC_QUEUE* WINAPI dkcAllocQueue size_t  numof__,
size_t  offsetof__
 

キュー領域を得る。

引数:
numof__[in] キューに使う配列の要素の数
offsetof__[in] キューにぶち込むデータのサイズ
戻り値:
キューハンドルへのポインタ。

dkcQueue.c12 行で定義されています。

参照先 DKC_QUEUE, dkcAllocate(), dkcFree(), dkc_Queue::mBuffer, dkc_Queue::mCounter, dkc_Queue::mEntrance, dkc_Queue::mExit, dkc_Queue::mOffsetOf, dkc_Queue::mSize, と NULL.

参照元 dkcAllocQueueDeserialize().

00012                                                                  {
00013     DKC_QUEUE *p;
00014     size_t size = (numof__) * offsetof__;
00015     if(0==size) return NULL;
00016     p = dkcAllocate(sizeof(DKC_QUEUE));
00017     if(NULL==p) return NULL;
00018     p->mBuffer = dkcAllocate(size);
00019     
00020     if(NULL==p->mBuffer) goto Error;
00021 
00022     p->mExit = 0;
00023     p->mEntrance = 0;
00024     p->mSize = size;
00025     p->mOffsetOf = offsetof__;
00026     p->mCounter = 0;
00027 
00028     return p;
00029 Error:
00030     dkcFree(&p);
00031     return NULL;
00032 }

DKC_EXTERN DKC_QUEUE* WINAPI dkcAllocQueueDeserialize DKC_DESERIALIZE se  ) 
 

dkcQueue.c178 行で定義されています。

参照先 DKC_DESERIALIZE, DKC_QUEUE, dkcAllocQueue(), dkcDeserializeRead(), dkcmNOT_ASSERT, edkcSerializeIDQueue, dkc_Queue::mBuffer, dkc_Queue::mEntrance, dkc_Queue::mExit, dkc_Queue::mSize, と NULL.

00178                                                                {
00179     DKC_QUEUE *p;
00180     DKC_QUEUE t;
00181     size_t read;
00182     int id;
00183     
00184     dkcDeserializeRead(se,&id,sizeof(id),&read);
00185     if(id !=  edkcSerializeIDQueue)
00186     {
00187         return NULL;
00188     }
00189     dkcDeserializeRead(se,&t,sizeof(t),&read);
00190     
00191     p = dkcAllocQueue(t.mSize,t.mOffsetOf);
00192     if(NULL==p) return NULL;
00193 
00194     p->mEntrance = t.mEntrance;
00195     p->mExit = t.mExit;
00196     dkcDeserializeRead(se,p->mBuffer,p->mSize,&read);
00197     
00198     dkcmNOT_ASSERT(read != p->mSize);
00199     
00200     return p;
00201 }

DKC_EXTERN int WINAPI dkcFreeQueue DKC_QUEUE **  ptr  ) 
 

dkcAllocNewQueueと対。

DKC_QUEUEをデリート

覚え書き:
必ず使用したあとはこれを呼んでください。

dkcQueue.c33 行で定義されています。

参照先 DKC_QUEUE, dkcFree(), edk_ArgumentException, と NULL.

00033                                         {
00034     if(NULL==ptr || *ptr==NULL || NULL==(*ptr)->mBuffer)
00035         return edk_ArgumentException;
00036 
00037     dkcFree(&((*ptr)->mBuffer));
00038     return dkcFree(ptr);
00039 }

DKC_EXTERN void WINAPI dkcQueueClear DKC_QUEUE ptr  ) 
 

キューをクリアする。

dkcQueue.c152 行で定義されています。

参照先 DKC_QUEUE, dkc_Queue::mCounter, dkc_Queue::mEntrance, dkc_Queue::mExit, と NULL.

00152                                          {
00153     if(NULL==ptr) return;
00154 
00155     ptr->mExit = 0;//出口を戻す。
00156     ptr->mEntrance = 0;//入り口も戻す。
00157     ptr->mCounter = 0;//カウンタも戻す。
00158 }

DKC_EXTERN int WINAPI dkcQueueDynamicPush DKC_QUEUE ptr,
const void * 
 

dkcQueue.c92 行で定義されています。

参照先 DKC_QUEUE, dkcQueuePush(), dkcReallocate(), dkcReallocateSizeFunction(), DKUTIL_FAILED, DKUTIL_SUCCEEDED, edk_FAILED, dkc_Queue::mBuffer, dkc_Queue::mOffsetOf, と dkc_Queue::mSize.

00093 {
00094     int result;
00095     void *NewPtr;
00096     size_t want_size;
00097 
00098     result = dkcQueuePush(ptr,data);
00099 
00100     if(DKUTIL_SUCCEEDED(result)) return result;
00101 
00102     //メモリ再確保
00103     {
00104         want_size = dkcReallocateSizeFunction(ptr->mSize,ptr->mOffsetOf);
00105         if(DKUTIL_FAILED(
00106             dkcReallocate(&NewPtr,want_size,(void **)&ptr->mBuffer)
00107             )){
00108             return edk_FAILED;
00109         }
00110         ptr->mBuffer = NewPtr;
00111         ptr->mSize = want_size;
00112     }
00113     //もう一回行って見る。
00114     return dkcQueuePush(ptr,data);
00115 
00116 }

DKC_EXTERN int WINAPI dkcQueueGetPoint const DKC_QUEUE ptr,
size_t  point_of__,
void *  buffer,
size_t  buffsize
 

引数:
ptr[in] queue
point_of__[in] ポイント
buffer[in] バッファへのポインタ
buffsize[in] バッファのサイズ

DKC_EXTERN BOOL WINAPI dkcQueueIsEmpty DKC_QUEUE ptr  ) 
 

dkcQueue.c164 行で定義されています。

参照先 BOOL, DKC_QUEUE, と dkcQueueSize().

00164                                            {
00165     return (dkcQueueSize(ptr)==0);
00166 }

DKC_EXTERN void WINAPI dkcQueuePop DKC_QUEUE ptr  ) 
 

引数:
id[in] 同じidを二回解放するとバグリます。

dkcQueue.c117 行で定義されています。

参照先 DKC_QUEUE, dkcmNOT_ASSERT, と NULL.

00118 {
00119     dkcmNOT_ASSERT(NULL==ptr);
00120     ptr->mExit += ptr->mOffsetOf;
00121     if(ptr->mCounter <= 0)
00122     {//もうありませんよ^^;
00123         return;
00124     }
00125     ptr->mCounter--;
00126 
00127     if(ptr->mExit >= ptr->mSize)
00128     {//もう一杯イッパイです。
00129         ptr->mExit = 0;
00130     }
00131     return;
00132 }

DKC_EXTERN int WINAPI dkcQueuePush DKC_QUEUE ptr,
const void * 
 

覚え書き:

dkcQueue.c42 行で定義されています。

参照先 BYTE, DKC_QUEUE, dkcmNOT_ASSERT, edk_FAILED, edk_SUCCEEDED, と NULL.

参照元 dkcQueueDynamicPush().

00042                                                         {
00043     BYTE *tp;
00044     dkcmNOT_ASSERT(NULL==ptr);
00045 
00046     tp = ptr->mBuffer;
00047     if(/*ptr->mEntrance <= ptr->mExit &&*/ 
00048         ptr->mCounter >= ptr->mSize / ptr->mOffsetOf)
00049     {//MAX...
00050         return edk_FAILED;
00051     }
00052     else if(ptr->mEntrance >= ptr->mSize)
00053     {
00054         ptr->mEntrance = 0;
00055     }
00056     /*if(ptr->mSize < ptr->mOffsetOf + ptr->mEntrance)
00057     {//入り口が満杯 
00058         if(ptr->mExit + ptr->mOffsetOf >= ptr->mSize)
00059         {   //出口も入り口と一緒・・・。
00060             //と言う事は消せるね。
00061             dkcQueueClear(ptr);
00062         }
00063         else if(ptr->mExit > ptr->mOffsetOf)
00064         {//前まで出口だった使用していない領域が使えるかも?
00065             if(ptr->mEntrance < ptr->mExit)
00066             {//出口の方がオフセットが上だった
00067                 //つまり、すでに**----*** こんな感じになっている。
00068                 ptr->mEntrance += ptr->mOffsetOf;
00069             }else{//下だった
00070                 //こんな感じ:-----**
00071                 ptr->mEntrance = 0;
00072             }
00073         }else
00074         {//ダメだ完全満席
00075             return edk_FAILED;
00076         }
00077     }else if(ptr->mEntrance < ptr->mExit && 
00078         ptr->mEntrance+ ptr->mOffsetOf > ptr->mExit)
00079     {
00080         return edk_FAILED;
00081     }*/
00082     
00083     memcpy(&tp[ptr->mEntrance],data,ptr->mOffsetOf);
00084     
00085     ptr->mEntrance += ptr->mOffsetOf;
00086     ptr->mCounter++;
00087 
00088     return edk_SUCCEEDED;
00089 }

DKC_EXTERN int WINAPI dkcQueueSerialize const DKC_QUEUE ptr,
DKC_SERIALIZE se
 

dkcQueue.c168 行で定義されています。

参照先 DKC_QUEUE, DKC_SERIALIZE, dkcmNOT_ASSERT, dkcSerializeWrite(), edkcSerializeIDQueue, と NULL.

00169 {
00170     int id = edkcSerializeIDQueue;
00171     dkcmNOT_ASSERT(NULL==ptr);
00172     dkcSerializeWrite(se,&id,sizeof(id));
00173     dkcSerializeWrite(se,ptr,sizeof(DKC_QUEUE));
00174     return dkcSerializeWrite(se,ptr->mBuffer,ptr->mSize);
00175 }

DKC_EXTERN size_t WINAPI dkcQueueSize DKC_QUEUE ptr  ) 
 

dkcQueue.c160 行で定義されています。

参照先 DKC_QUEUE, と dkc_Queue::mCounter.

参照元 dkcQueueIsEmpty().

00160                                           {
00161     return ptr->mCounter;
00162 }

DKC_EXTERN int WINAPI dkcQueueTop DKC_QUEUE ptr,
void * 
 

dkcQueue.c133 行で定義されています。

参照先 BYTE, DKC_QUEUE, dkcmNOT_ASSERT, edk_FAILED, edk_SUCCEEDED, dkc_Queue::mBuffer, dkc_Queue::mCounter, dkc_Queue::mExit, dkc_Queue::mOffsetOf, と NULL.

00133                                                      {
00134     BYTE *tp;
00135     
00136     dkcmNOT_ASSERT(NULL==ptr || NULL==get_data);
00137     
00138     //データが無い。
00139     //if(ptr->mEntrance < ptr->mExit + ptr->mOffsetOf){
00140     if(0==ptr->mCounter){
00141         return edk_FAILED;
00142     }
00143     tp = ptr->mBuffer;
00144 
00145     memcpy(get_data,&tp[ptr->mExit],ptr->mOffsetOf);
00146 
00147     return edk_SUCCEEDED;
00148 
00149 
00150 }


dkutil_cに対してSun Jul 18 22:45:58 2004に生成されました。 doxygen 1.3.6