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

# 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内のカウンタを０にして事実上すべてクリアーにする。
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.h の 14 行で定義されています。
    00014                              {
    00016     edkcCirculerMemoryStreamSeekCurrent = edkcSeekCurrent,
    00018     edkcCirculerMemoryStreamSeekEnd = edkcSeekEnd,
    00020     edkcCirculerMemoryStreamSeekSet = edkcSeekSet,
    00021
    00022
    00023 };

## 関数

DKC_EXTERN DKC_CIRCULAR_MEMORYSTREAM* WINAPI dkcAllocCircularMemoryStream | ( | size_t | size | ) |

| dkcCircularMemoryStream.c の 11 行で定義されています。 参照先 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.c の 170 行で定義されています。 参照先 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内のカウンタを０にして事実上すべてクリアーにする。 dkcCircularMemoryStream.c の 148 行で定義されています。 参照先 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.c の 105 行で定義されています。 参照先 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.c の 110 行で定義されています。 参照先 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.c の 117 行で定義されています。 参照先 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     // ２回に分けて格納しなければならないかどうかで処理を分岐
    00125     if(isDoubleProcess(ptr->mEnd,size,ptr->mSize))
    00126     {
    00127         // ２回に別けて格納する場合の処理
    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         // １回で格納する場合の処理
    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.h の 98 行で定義されています。 参照先 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.h の 104 行で定義されています。 参照先 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.h の 94 行で定義されています。 参照先 dkc_CircularMemoryStream::mEnableLength.
    00095 {
    00096     return ptr->mEnableLength;
    00097 }

DKC_INLINE size_t dkcCirculerMemoryStreamTell | ( | DKC_CIRCULAR_MEMORYSTREAM * | ptr | ) |

| dkcCircularMemoryStream.h の 90 行で定義されています。 参照先 dkc_CircularMemoryStream::mStart.
    00091 {
    00092     return ptr->mStart;
    00093 }

DKC_EXTERN int WINAPI dkcFreeCircularMemoryStream | ( | DKC_CIRCULAR_MEMORYSTREAM ** | ptr | ) |

| dkcCircularMemoryStream.c の 32 行で定義されています。 参照先 dkcFree(), と NULL.
    00032                                                                        {
    00033     if(NULL==ptr || NULL==*ptr){return edk_ArgumentException;}
    00034     dkcFree((void **)&(*ptr)->mBuffer);
    00035     return dkcFree((void **)ptr);
    00036 }