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

dkcCircularMemoryStream.h

環状バッファー boost::circular_streamみたいなもの かな? [詳細]

#include "dkcMemoryStream.h"

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

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

ソースコードを見る。

構成

struct  dkc_CircularMemoryStream

型定義

typedef dkc_CircularMemoryStream DKC_CIRCULAR_MEMORYSTREAM

列挙型

enum  edkcCirculerMemoryStream { edkcCirculerMemoryStreamSeekCurrent = edkcSeekCurrent, edkcCirculerMemoryStreamSeekEnd = edkcSeekEnd, edkcCirculerMemoryStreamSeekSet = edkcSeekSet }

関数

DKC_EXTERN DKC_CIRCULAR_MEMORYSTREAM
*WINAPI 
dkcAllocCircularMemoryStream (size_t size)
DKC_EXTERN int WINAPI dkcFreeCircularMemoryStream (DKC_CIRCULAR_MEMORYSTREAM **ptr)
DKC_EXTERN int WINAPI dkcCircularMemoryStreamRead (DKC_CIRCULAR_MEMORYSTREAM *ptr, void *buffer, size_t size, size_t *readsize)
 streamをリードする。freadみたいなもの
DKC_EXTERN int WINAPI dkcCircularMemoryStreamReference (DKC_CIRCULAR_MEMORYSTREAM *ptr, void *buffer, size_t size, size_t *readsize)
 中を覗き見るだけ。引数についてはdkcCircularMemoryStreamRead()を見るべし。
DKC_EXTERN int WINAPI dkcCircularMemoryStreamWrite (DKC_CIRCULAR_MEMORYSTREAM *ptr, const void *buffer, size_t size)
 streamをライトする。fwriteみたいなもの
DKC_EXTERN int WINAPI dkcCircularMemoryStreamClear (DKC_CIRCULAR_MEMORYSTREAM *ptr)
 stream内のカウンタを0にして事実上すべてクリアーにする。
DKC_EXTERN DKC_CIRCULAR_MEMORYSTREAM
*WINAPI 
dkcAllocCircularMemoryStreamCopy (const DKC_CIRCULAR_MEMORYSTREAM *ptr)
DKC_INLINE size_t dkcCirculerMemoryStreamTell (DKC_CIRCULAR_MEMORYSTREAM *ptr)
DKC_INLINE size_t dkcCirculerMemoryStreamSize (DKC_CIRCULAR_MEMORYSTREAM *ptr)
DKC_INLINE size_t dkcCirculerMemoryStreamEOF (DKC_CIRCULAR_MEMORYSTREAM *ptr)
DKC_INLINE int dkcCirculerMemoryStreamSeek (DKC_CIRCULAR_MEMORYSTREAM *ptr, long offset, long origin)
 todo test まだテストして無いよ^^;


説明

環状バッファー boost::circular_streamみたいなもの かな?

から:
2004/3/xx
覚え書き:

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


型定義

typedef struct dkc_CircularMemoryStream DKC_CIRCULAR_MEMORYSTREAM
 

円型ストリーム(リングバッファデータ)構造体


列挙型

enum edkcCirculerMemoryStream
 

列挙型の値:
edkcCirculerMemoryStreamSeekCurrent  今の位置からシーク
edkcCirculerMemoryStreamSeekEnd  最後の位置からシーク
edkcCirculerMemoryStreamSeekSet  最初の位置からシーク

dkcCircularMemoryStream.h14 行で定義されています。


関数

DKC_EXTERN DKC_CIRCULAR_MEMORYSTREAM* WINAPI dkcAllocCircularMemoryStream size_t  size  ) 
 

dkcCircularMemoryStream.c11 行で定義されています。

参照先 dkcAllocate(), dkcFree(), dkc_CircularMemoryStream::mBuffer, dkc_CircularMemoryStream::mEnableLength, dkc_CircularMemoryStream::mEnd, dkc_CircularMemoryStream::mSize, dkc_CircularMemoryStream::mStart, と NULL.

参照元 dkcAllocCircularMemoryStreamCopy().

00012 {
00013     DKC_CIRCULAR_MEMORYSTREAM *p = NULL;
00014 
00015     p = (DKC_CIRCULAR_MEMORYSTREAM *)dkcAllocate(sizeof(DKC_CIRCULAR_MEMORYSTREAM));
00016     if(NULL==p) return NULL;
00017 
00018     p->mBuffer = dkcAllocate(size);
00019     if(NULL==p->mBuffer) goto Error;
00020 
00021     p->mStart = 0;
00022     p->mEnd = 0;
00023     p->mEnableLength = 0;
00024     p->mSize = size;
00025     
00026     return p;
00027 Error:
00028     dkcFree((void **)&p);
00029     return NULL;
00030 }

DKC_EXTERN DKC_CIRCULAR_MEMORYSTREAM* WINAPI dkcAllocCircularMemoryStreamCopy const DKC_CIRCULAR_MEMORYSTREAM ptr  ) 
 

DKC_CIRCULAR_MEMORYSTREAMをコピーする。 C++で言うコピーコンストラクタみたいなもの^^;

dkcCircularMemoryStream.c170 行で定義されています。

参照先 dkc_memcpy(), dkcAllocCircularMemoryStream(), dkcmNOT_ASSERT, dkc_CircularMemoryStream::mBuffer, dkc_CircularMemoryStream::mEnableLength, dkc_CircularMemoryStream::mEnd, dkc_CircularMemoryStream::mSize, dkc_CircularMemoryStream::mStart, と NULL.

00171 {
00172     DKC_CIRCULAR_MEMORYSTREAM *p;
00173     
00174     dkcmNOT_ASSERT(NULL==ptr);
00175     
00176     p = dkcAllocCircularMemoryStream(ptr->mSize);
00177     
00178     
00179     if(NULL==p) return NULL;//強制終了したい気分!!
00180 
00181     dkcmNOT_ASSERT(DKUTIL_FAILED(
00182         dkc_memcpy(p->mBuffer,p->mSize,ptr->mBuffer,ptr->mSize)
00183         ));
00184 
00185     p->mEnableLength = ptr->mEnableLength;
00186     p->mEnd = p->mEnd;
00187     p->mStart = p->mStart;
00188 
00189 
00190     return p;
00191 }

DKC_EXTERN int WINAPI dkcCircularMemoryStreamClear DKC_CIRCULAR_MEMORYSTREAM ptr  ) 
 

stream内のカウンタを0にして事実上すべてクリアーにする。

dkcCircularMemoryStream.c148 行で定義されています。

参照先 dkc_CircularMemoryStream::mBuffer, dkc_CircularMemoryStream::mEnableLength, dkc_CircularMemoryStream::mEnd, dkc_CircularMemoryStream::mStart, と NULL.

00148                                                                        {
00149 
00150     if(NULL==ptr || NULL==ptr->mBuffer){return edk_ArgumentException;}
00151 
00152     ptr->mEnableLength = 0;
00153     ptr->mEnd = 0;
00154 
00155     ptr->mStart = 0;
00156 
00157 
00158     return edk_SUCCEEDED;
00159 }

DKC_EXTERN int WINAPI dkcCircularMemoryStreamRead DKC_CIRCULAR_MEMORYSTREAM ptr,
void *  buffer,
size_t  size,
size_t *  readsize
 

streamをリードする。freadみたいなもの

引数:
readsize[out] 実際に読んだサイズを返す。NULLを渡してもOK.
覚え書き:
・指定したサイズ(size)よりもストリームバッファのサイズが小さかった場合 readsizeに実際に読んだサイズを入れます。 ・Readしたデータは取り出したデータとして処理され、 そのバッファ内容は次のデータを保存する領域として再利用されます。 つまり、一度Readしたデータは二度と取り出せません。

dkcCircularMemoryStream.c105 行で定義されています。

参照先 dkcCircularMemoryStreamReadLogic(), と FALSE.

00106 {
00107     return dkcCircularMemoryStreamReadLogic(ptr,buffer,size,readsize,FALSE);
00108 }

DKC_EXTERN int WINAPI dkcCircularMemoryStreamReference DKC_CIRCULAR_MEMORYSTREAM ptr,
void *  buffer,
size_t  size,
size_t *  readsize
 

中を覗き見るだけ。引数についてはdkcCircularMemoryStreamRead()を見るべし。

dkcCircularMemoryStream.c110 行で定義されています。

参照先 dkcCircularMemoryStreamReadLogic(), と TRUE.

00111 {
00112     return dkcCircularMemoryStreamReadLogic(ptr,buffer,size,readsize,TRUE);
00113 }

DKC_EXTERN int WINAPI dkcCircularMemoryStreamWrite DKC_CIRCULAR_MEMORYSTREAM ptr,
const void *  buffer,
size_t  size
 

streamをライトする。fwriteみたいなもの

覚え書き:
内部ストリームバッファは円型です。いわいるRingBufferって奴です。 dkcCircularMemoryStreamWriteしたらdkcCircularMemoryStreamReadしてデータを出してあげましょう。 そうしなければ、いずれ、円型バッファの有効データが一杯になってこの関数は失敗します。 C言語版 boost::circular_bufferみたいなものですね^^;(といいますか、また車輪の再開発してるし・・・。

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

参照先 isDoubleProcess(), dkc_CircularMemoryStream::mBuffer, dkc_CircularMemoryStream::mEnableLength, dkc_CircularMemoryStream::mEnd, dkc_CircularMemoryStream::mSize, と NULL.

00117                                                                                                       {
00118     if(NULL==ptr || NULL==buffer || 0==size ) return edk_ArgumentException;
00119     //DxLibを参考にしました。この場をお借りしてお礼申し上げます。m(_ _)m
00120     
00121     //error check
00122     if(ptr->mSize - ptr->mEnableLength < size) return edk_FAILED;
00123 
00124     // 2回に分けて格納しなければならないかどうかで処理を分岐
00125     if(isDoubleProcess(ptr->mEnd,size,ptr->mSize))
00126     {
00127         // 2回に別けて格納する場合の処理
00128         memcpy( (char *)ptr->mBuffer + ptr->mEnd, buffer, ptr->mSize - ptr->mEnd ) ;
00129         memcpy( ptr->mBuffer, (char *)buffer + ( ptr->mSize - ptr->mEnd ), size - ( ptr->mSize - ptr->mEnd ) ) ;
00130         //dkcStreamWrite(ptr->mBuffer,buffer,ptr->mSize - ptr->mEnd);
00131         //dkcStreamSeek(ptr->mBuffer,0,edkcStreamSeekSet);//オフセットを最初にする。
00132         //dkcStreamWrite(ptr->mBuffer,(char *)buffer + ( ptr->mSize - ptr->mEnd ),size - ( ptr->mSize - ptr->mEnd ));
00133         ptr->mEnd = size - ( ptr->mSize - ptr->mEnd ) ;
00134     }else{
00135         // 1回で格納する場合の処理
00136         memcpy( (char *)ptr->mBuffer + ptr->mEnd, buffer, size ) ;
00137         //dkcStreamWrite(ptr->mBuffer,buffer,size);
00138         ptr->mEnd += size ;
00139     }
00140 
00141 
00142     // 格納しているデータの量を増やす
00143     ptr->mEnableLength += size;
00144     return edk_SUCCEEDED;
00145 }

DKC_INLINE size_t dkcCirculerMemoryStreamEOF DKC_CIRCULAR_MEMORYSTREAM ptr  ) 
 

dkcCircularMemoryStream.h98 行で定義されています。

参照先 dkc_CircularMemoryStream::mEnd, と dkc_CircularMemoryStream::mSize.

00099 {
00100     return ptr->mSize == ptr->mEnd;
00101 }

DKC_INLINE int dkcCirculerMemoryStreamSeek DKC_CIRCULAR_MEMORYSTREAM ptr,
long  offset,
long  origin
 

todo test まだテストして無いよ^^;

dkcCircularMemoryStream.h104 行で定義されています。

参照先 dkcCheckOverflow32, edkcCirculerMemoryStreamSeekCurrent, edkcCirculerMemoryStreamSeekEnd, edkcCirculerMemoryStreamSeekSet, dkc_CircularMemoryStream::mEnableLength, dkc_CircularMemoryStream::mEnd, dkc_CircularMemoryStream::mSize, dkc_CircularMemoryStream::mStart, と TRUE.

00105 {
00106     long point;
00107     size_t change;
00108     switch(origin){
00109     case edkcCirculerMemoryStreamSeekCurrent:
00110         point = ptr->mStart;
00111         break;
00112     case edkcCirculerMemoryStreamSeekEnd:
00113         point = ptr->mEnd;
00114         break;
00115     case edkcCirculerMemoryStreamSeekSet:
00116         point = 0;
00117         break;
00118     default:
00119         return edk_ArgumentException;
00120     }
00121     //有効なリングバッファ内に収まるサイズになるように
00122     change = offset % ptr->mEnableLength;
00123     change = (point + change);
00124 
00125     if(TRUE==dkcCheckOverflow32(ptr->mStart ,change)){
00126         return edk_FAILED;
00127     }
00128     /*//if(!(ptr->mSize > change)){
00129     if(!(ptr->mSize >= change)){
00130         return edk_FAILED;
00131     }*/
00132     if( ptr->mStart + change > ptr->mEnd)
00133     {
00134         return edk_FAILED;
00135     }
00136     ptr->mSize += change;
00137     return edk_SUCCEEDED;
00138 }

DKC_INLINE size_t dkcCirculerMemoryStreamSize DKC_CIRCULAR_MEMORYSTREAM ptr  ) 
 

dkcCircularMemoryStream.h94 行で定義されています。

参照先 dkc_CircularMemoryStream::mEnableLength.

00095 {
00096     return ptr->mEnableLength;
00097 }

DKC_INLINE size_t dkcCirculerMemoryStreamTell DKC_CIRCULAR_MEMORYSTREAM ptr  ) 
 

dkcCircularMemoryStream.h90 行で定義されています。

参照先 dkc_CircularMemoryStream::mStart.

00091 {
00092     return ptr->mStart;
00093 }

DKC_EXTERN int WINAPI dkcFreeCircularMemoryStream DKC_CIRCULAR_MEMORYSTREAM **  ptr  ) 
 

dkcCircularMemoryStream.c32 行で定義されています。

参照先 dkcFree(), と NULL.

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


dkutil_cに対してMon Jan 16 00:40:52 2006に生成されました。  doxygen 1.4.4