SophiaFramework UNIVERSE 5.3 |
SFXRingBuffer クラスは、リングバッファを表すクラスです。
リングバッファとは、概念的に環状に配置されたメモリを表します。
リングバッファには、リングバッファ上を時計回りに進む書き込みポインタと読み込みポインタがあります。 書き込みポインタ経由でリングバッファにデータを書き込むと、書き込みポインタは進みます。 読み込みポインタ経由でリングバッファからデータを読み込むと、読み込みポインタは進みます。
注意 | |
---|---|
読み込みポインタは書き込みポインタの位置を越えることができません。 逆に、書き込みポインタは読み込みポインタの位置を越えることができません。 |
リングバッファのメモリは、SFXRingBuffer::Allocate 関数で割り当てます。 一度割り当てたバッファメモリのサイズは変更できません。
データの書き込み/読み込みは SFXRingBuffer::Write / SFXRingBuffer::Read 関数で行います。
リングバッファに割り当てられたバッファメモリのサイズは、SFXRingBuffer::GetSize 関数で取得できます。 現在書き込み/読み込み可能なサイズは、 SFXRingBuffer::GetWritableSize / SFXRingBuffer::GetReadableSize 関数で取得できます。
割り当てられたメモリは、デストラクタにより自動的に解放されますが、 SFXRingBuffer::Free 関数を使用して明示的にメモリを解放することも可能です。 SFXRingBuffer::Free 関数を呼び出した後で SFXRingBuffer::Allocate 関数を再度呼び出せば、 リングバッファのサイズを変更できますが、以前にリングバッファに書き込まれたデータは失われます。
リングバッファが内部で使用している書き込み/読み込みポインタを直接使用する場合は、 SFXRingBuffer::GetWritableBuffer / SFXRingBuffer::SeekWrite / SFXRingBuffer::GetReadableBuffer / SFXRingBuffer::SeekRead 関数を使用してください。
SFXRingBuffer ring; // リングバッファ UInt32 wsize; // リングバッファに書き込み可能なサイズ UInt32 rsize; // リングバッファから読み込み可能なサイズ // リングバッファのサイズを 256 バイトに設定する(256 バイトのメモリを割り当てる) ring.Allocate(256); // メモリ割り当て直後はバッファの内容は空 wsize = ring.GetWritableSize(); // wsize = 256 rsize = ring.GetReadableSize(); // rsize = 0 SInt32 n = 123; ring.Write(&n, sizeof(n)); // 4 バイトの符号付整数(n = 123)を書き込む wsize = ring.GetWritableSize(); // wsize = 252 rsize = ring.GetReadableSize(); // rsize = 4 SInt32 m; ring.Read(&m, sizeof(m)); // 4 バイトの符号付整数(m = 123)を読み込む
コンストラクタ/デストラクタ |
---|
SFXRingBuffer( Void ) SFXRingBuffer クラスのコンストラクタです。
|
~SFXRingBuffer( Void ) SFXRingBuffer クラスのデストラクタです。
|
パブリック関数 | |
---|---|
SFCError |
Allocate(
UInt32 size
) このリングバッファに指定されたサイズのメモリを割り当てます。
|
static SFXRingBufferConstRef |
EmptyInstance( Void ) 空のリングバッファを取得します。
|
SInt32 |
FirstIndexOf(
SFXBufferConstRef buffer
, SInt32 index = SINT32_MINIMUM
) 検索開始位置から書き込みポインタまでこのリングバッファを検索して、指定されたデータと一致する最初のインデックスを取得します。
|
SInt32 |
FirstIndexOf(
VoidConstPtr buffer
, UInt32 size
, SInt32 index = SINT32_MINIMUM
) 検索開始位置から書き込みポインタまでこのリングバッファを検索して、指定されたデータと一致する最初のインデックスを取得します。
|
SInt32 |
FirstIndexOf(
Byte byte
, SInt32 index = SINT32_MINIMUM
) 検索開始位置から書き込みポインタまでこのリングバッファを検索して、指定されたデータと一致する最初のインデックスを取得します。
|
Void |
Free( Void ) このリングバッファに割り当てられたメモリを解放します。
|
VoidConstPtr |
GetReadableBuffer(
UInt32Ptr size
) このリングバッファに割り当てられている内部バッファメモリの読み込みポインタを取得します。
|
UInt32 |
GetReadableSize( Void ) このリングバッファから読み込み可能なデータの合計サイズを取得します。[単位: バイト]
|
UInt32 |
GetSize( Void ) このリングバッファに割り当てられている内部バッファメモリのサイズを取得します。
|
VoidPtr |
GetWritableBuffer(
UInt32Ptr size
) このリングバッファに割り当てられている内部バッファメモリの書き込みポインタを取得します。
|
UInt32 |
GetWritableSize( Void ) このリングバッファに書き込み可能なデータの合計サイズを取得します。[単位: バイト]
|
SInt32 |
LastIndexOf(
SFXBufferConstRef buffer
, SInt32 index = SINT32_MAXIMUM
) 検索開始位置から読み込みポインタまでこのリングバッファを検索して、指定されたデータと一致する最後のインデックスを取得します。
|
SInt32 |
LastIndexOf(
VoidConstPtr buffer
, UInt32 buffer
, SInt32 index = SINT32_MAXIMUM
) 検索開始位置から読み込みポインタまでこのリングバッファを検索して、指定されたデータと一致する最後のインデックスを取得します。
|
SInt32 |
LastIndexOf(
Byte byte
, SInt32 index = SINT32_MAXIMUM
) 検索開始位置から読み込みポインタまでこのリングバッファを検索して、指定されたデータと一致する最後のインデックスを取得します。
|
SFCError |
Read(
VoidPtr buffer
, UInt32 size
) このリングバッファからデータを読み込みます。
|
SFCError |
Read(
SFXBufferPtr buffer
) このリングバッファからデータを読み込みます。
|
Void |
Reset( Void ) このリングバッファに書き込まれたデータをクリアします。
|
SFCError |
SeekRead(
UInt32 size
) このリングバッファ用ストリームの読み込みポインタを指定されたサイズ分だけ進めます。
|
SFCError |
SeekWrite(
UInt32 size
) このリングバッファ用ストリームの書き込みポインタを指定されたサイズ分だけ進めます。
|
SFCError |
Write(
VoidConstPtr buffer
, UInt32 size
) このリングバッファにデータを書き込みます。
|
SFCError |
Write(
SFXBufferConstRef buffer
) このリングバッファにデータを書き込みます。
|
[ public, explicit ] SFXRingBuffer(Void);
注意 | |
---|---|
SFXBuffer::SFXBuffer コンストラクタとは異なり、 このコンストラクタではバッファメモリの割り当ては行われません。 そのため、 SFXRingBuffer::Allocate 関数を呼び出してバッファメモリを割り当てる必要があります。 |
[ public ] ~SFXRingBuffer(Void);
注意 | |
---|---|
バッファメモリが割り当てられている場合は、 SFXRingBuffer::Free 関数を呼び出して解放します。 |
この関数は、このリングバッファに指定されたサイズのメモリ(内部バッファメモリ)を割り当てます。
注意 | |
---|---|
メモリの割り当てを行わず、このクラスの他の関数を呼び出した場合の挙動は未定義です。 |
注意事項 | |
---|---|
この関数を実行する前にリングバッファの内部バッファメモリが保持していた内容は破棄されます。 一度割り当てたリングバッファのサイズは変更できません。 |
SFXRingBuffer ring;
// 256 バイトのメモリをリングバッファに割り当てる
if (ring.Allocate(256) == SFERR_NO_ERROR) {
...
}
[ public, static ] SFXRingBufferConstRef EmptyInstance(Void);
空のリングバッファを表すインスタンスを取得します。
[ public, const ] SInt32 FirstIndexOf( SFXBufferConstRef buffer // 検索するバッファ SInt32 index = SINT32_MINIMUM // 検索開始位置 );
[ public, const ] SInt32 FirstIndexOf( VoidConstPtr buffer // 検索するバッファ UInt32 size // 検索するバッファのサイズ SInt32 index = SINT32_MINIMUM // 検索開始位置 );
[ public, const ] SInt32 FirstIndexOf( Byte byte // 検索する Byte データ SInt32 index = SINT32_MINIMUM // 検索開始位置 );
この関数は、検索開始位置(デフォルト値: 読み込みポインタ)から書き込みポインタまでこのリングバッファを検索し、 指定されたデータが見つかった読み込みポインタから最初の位置(インデックス)を取得します。
index 引数に読み込みポインタ以外の検索開始位置を指定できます。
注意 | |
---|---|
読み込みポインタのインデックス値を 0 とします。 書き込みポインタが指すデータは検索に含まれません。 |
static ByteConst data[] = { '1', '2', '3', '4', '5', '6', '7', '8' }; SFXRingBuffer ring; SFXBuffer buffer; // リングバッファのサイズを 256 バイトに設定する if (ring.Allocate(256) == SFERR_NO_ERROR) { // 8 バイトのデータを書き込む if (ring.Write(data, sizeof(data)) == SFERR_NO_ERROR) { // 文字列を基点から検索してインデックスを取得する TRACE("FirstIndexOf('2') = %d", ring.FirstIndexOf('2')); // FirstIndexOf('2') = 1 TRACE("FirstIndexOf('9') = %d", ring.FirstIndexOf('9')); // FirstIndexOf('9') = -1 } }
[ public ] Void Free(Void);
この関数は、SFXRingBuffer::Allocate 関数によりこのリングバッファに割り当てられたメモリ(内部バッファメモリ)を解放します。
注意 | |
---|---|
バッファメモリが割り当てられていない場合は何も行いません。 |
SFXRingBuffer ring; // 256 バイトのバッファメモリを割り当てる if (ring.Allocate(256) == SFERR_NO_ERROR) { ... ring.Free(); // 明示的なバッファメモリの解放 }
[ public, const ] VoidConstPtr GetReadableBuffer( UInt32Ptr size // 内部バッファから直接読み込み可能なデータのサイズを返す );
この関数は、このリングバッファに割り当てられている内部バッファメモリの読み込みポインタを取得します。
この関数を実行すると、 取得した読み込みポインタ経由で内部バッファメモリから 1 回で直接読み込み可能なデータのサイズが size 引数に設定されます。
このポインタと size 引数に返された値を使用して、内部バッファメモリから直接データを読み込むことができます。
Tip | |
---|---|
下の使用例にあるように、 この関数はリングバッファ内の読み込み可能なデータをストリームに出力するときに使用します。 |
注意事項 | |
---|---|
リングバッファの特性上、 読み込みポインタの値が書き込みポインタの値よりも大きく、かつ、 書き込みポインタの値が 0 でない場合、 size 引数に返される内部バッファから直接読み込み可能なデータのサイズは SFXRingBuffer::GetReadableSize 関数の戻り値であるリングバッファから読み込み可能なデータの合計サイズよりも小さくなります。 この場合、 SFXRingBuffer::GetReadableSize 関数で返されるサイズのデータを読み込むには、 SFXRingBuffer::GetReadableBuffer 関数と SFXRingBuffer::SeekRead 関数を 2 回呼び出す必要があります。 詳細は以下の通りです。 buffer[]: リングバッファの内部バッファ B_SIZE: 内部バッファサイズ r_ptr: 読み込みポインタ w_ptr: 書き込みポインタ [T] 0 ≦ r_ptr ≦ w_ptr ≦ B_SIZE - 1 のとき: この関数を実行した後、戻り値として "&buffer[r_ptr]" が返り、 size 引数には "w_ptr - r_ptr" が設定されます。 一方、SFXRingBuffer::GetReadableSize 関数の戻り値も "w_ptr - r_ptr" です。 この場合は、1 回の SFXRingBuffer::GetReadableBuffer 関数と SFXRingBuffer::SeekRead 関数の呼び出しで、 SFXRingBuffer::GetReadableSize 関数の戻り値のサイズのデータを読み込めます。 [U] 0 = w_ptr < r_ptr ≦ B_SIZE - 1 のとき: この関数を実行した後、戻り値として "&buffer[r_ptr]" が返り、 size 引数には "B_SIZE - r_ptr" が設定されます。 一方、SFXRingBuffer::GetReadableSize 関数の戻り値も "B_SIZE - r_ptr" です。 この場合も、1 回の SFXRingBuffer::GetReadableBuffer 関数と SFXRingBuffer::SeekRead 関数の呼び出しで、 SFXRingBuffer::GetReadableSize 関数の戻り値のサイズのデータを読み込めます。 [V] 0 < w_ptr < r_ptr ≦ B_SIZE - 1 のとき: この関数を実行した後、 戻り値として "&buffer[r_ptr]" が返り、size 引数には "B_SIZE - r_ptr" が設定されます。 一方、SFXRingBuffer::GetReadableSize 関数の戻り値は、"B_SIZE - r_ptr + w_ptr" ですが、 この値は "w_ptr ≠ 0" なので SFXRingBuffer::GetReadableSize 関数の戻り値と異なります。 この後、"SFXRingBuffer::SeekRead(B_SIZE - r_ptr);" を実行すると、 "r_ptr = 0" となり、"0 = r_ptr < w_ptr ≦ B_SIZE - 1" となります。 ここで、もう一度(合計 2 回)、SFXRingBuffer::GetReadableBuffer 関数と SFXRingBuffer::SeekRead 関数の呼び出すと、 最初の SFXRingBuffer::GetReadableSize 関数の戻り値のサイズのデータを読み込むことが可能になります。 |
リングバッファから読み込み可能なすべてのデータをストリームに出力するコードは以下の通りです。
Void WriteRingBufferToFile(SFXBinaryStreamWriterRef stream, SFXRingBufferRef ring) { UInt32 totalSize; // リングバッファから読み込み可能なデータの総サイズ UInt32 readableSize; // 内部バッファから 1 度の操作で読み込み可能なデータのサイズ VoidPtr readPtr; // 読み込みポインタ totalSize = ring.GetReadableSize(); readPtr = ring.GetReadableBuffer(&readableSize); stream.Write(readPtr, readableSize); ring.SeekRead(readPtr, readableSize); if (totalSize -= readableSize > 0) { readPtr = ring.GetReadableBuffer(&readableSize); stream.Write(readPtr, readableSize); } }
SFXRingBuffer::GetReadableSize | SFXRingBuffer::SeekRead | SFXRingBuffer::GetWritableBuffer | SFXHeap
[ public, const ] UInt32 GetReadableSize(Void);
このリングバッファから読み込み可能なデータの合計サイズ[単位: バイト]
この関数は、現在このリングバッファから読み込み可能なデータの合計サイズを取得します。[単位: バイト]
SFXRingBuffer::GetReadableBuffer 関数の size 引数に返される値との違い | |
---|---|
SFXRingBuffer::GetReadableBuffer 関数の size 引数に返される値は、 読み込みポインタを使用してリングバッファの内部バッファメモリ(SFXHeap<Byte> 型)から直接読み込めるデータのサイズです。 一般に、以下の不等式が成り立ちます。詳細は SFXRingBuffer::GetReadableBuffer 関数の解説を参照してください。 リングバッファから読み込み可能なデータの合計サイズ ≧ 内部バッファメモリから直接読み込み可能なデータのサイズ |
static ByteConst data[] = { '1', '2', '3', '4', '5', '6', '7', '8' }; SFXRingBuffer ring; SFXBuffer buffer; // リングバッファのサイズを 256 バイトに設定する if (ring.Allocate(256) == SFERR_NO_ERROR) { TRACE("GetSize = %d", ring.GetSize()); // GetSize = 256 TRACE("GetWritableSize = %d", ring.GetWritableSize()); // GetWritableSize = 256 TRACE("GetReadableSize = %d", ring.GetReadableSize()); // GetReadableSize = 0 // 8 バイトのデータをリングバッファに書き込む if (ring.Write(data, sizeof(data)) == SFERR_NO_ERROR) { TRACE("GetSize = %d", ring.GetSize()); // GetSize = 256 TRACE("GetWritableSize = %d", ring.GetWritableSize()); // GetWritableSize = 248 TRACE("GetReadableSize = %d", ring.GetReadableSize()); // GetReadableSize = 8 // 読み込み用バッファのサイズを 4 バイトに設定する buffer.SetSize(4); // 4 バイトのデータをリングバッファから読み込む if (ring.Read(&buffer) == SFERR_NO_ERROR) { TRACE("GetSize = %d", ring.GetSize()); // GetSize = 256 TRACE("GetWritableSize = %d", ring.GetWritableSize()); // GetWritableSize = 252 TRACE("GetReadableSize = %d", ring.GetReadableSize()); // GetReadableSize = 4 } } }
SFXRingBuffer::Read | SFXRingBuffer::GetReadableBuffer | SFXRingBuffer::GetWritableSize | SFXHeap
[ public, const ] UInt32 GetSize(Void);
この関数は、SFXRingBuffer::Allocate 関数によりこのリングバッファに割り当てられている内部バッファメモリのサイズを取得します。
注意 | |
---|---|
リングバッファの特性から、
SFXRingBuffer::GetSize() == SFXRingBuffer::GetWritableSize() + SFXRingBuffer::GetReadableSize()となります。 |
static ByteConst data[] = { '1', '2', '3', '4', '5', '6', '7', '8' }; SFXRingBuffer ring; SFXBuffer buffer; // リングバッファのサイズを 256 バイトに設定する if (ring.Allocate(256) == SFERR_NO_ERROR) { TRACE("GetSize = %d", ring.GetSize()); // GetSize = 256 TRACE("GetWritableSize = %d", ring.GetWritableSize()); // GetWritableSize = 256 TRACE("GetReadableSize = %d", ring.GetReadableSize()); // GetReadableSize = 0 // 8 バイトのデータを書き込む if (ring.Write(data, sizeof(data)) == SFERR_NO_ERROR) { TRACE("GetSize = %d", ring.GetSize()); // GetSize = 256 TRACE("GetWritableSize = %d", ring.GetWritableSize()); // GetWritableSize = 248 TRACE("GetReadableSize = %d", ring.GetReadableSize()); // GetReadableSize = 8 // 読み込み用のバッファを確保する buffer.SetSize(4); // 4 バイトのデータを読み込む if (ring.Read(&buffer) == SFERR_NO_ERROR) { TRACE("GetSize = %d", ring.GetSize()); // GetSize = 256 TRACE("GetWritableSize = %d", ring.GetWritableSize()); // GetWritableSize = 252 TRACE("GetReadableSize = %d", ring.GetReadableSize()); // GetReadableSize = 4 } } }
この関数は、このリングバッファに割り当てられている内部バッファメモリの書き込みポインタを取得します。
この関数を実行すると、 取得した書き込みポインタ経由で内部バッファメモリに 1 回で直接書き込み可能なデータのサイズが size 引数に設定されます。
このポインタと size 引数に返された値を使用して、内部バッファメモリに直接データを書き込むことができます。
Tip | |
---|---|
下の使用例にあるように、 この関数はストリームから読み込み可能なデータをリングバッファに書き込むときに使用します。 |
注意事項 | |
---|---|
リングバッファの特性上、 書き込みポインタの値が読み込みポインタの値よりも大きく、かつ、 読み込みポインタの値が 0 でない場合、 size 引数に返される内部バッファに直接書き込み可能なデータのサイズは SFXRingBuffer::GetWritableSize 関数の戻り値であるリングバッファに書き込み可能なデータの合計サイズよりも小さくなります。 この場合、 SFXRingBuffer::GetWritableSize 関数で返されるサイズのデータを書き込むには、 SFXRingBuffer::GetWritableBuffer 関数と SFXRingBuffer::SeekWrite 関数を 2 回呼び出す必要があります。 詳細は以下の通りです。 buffer[]: リングバッファの内部バッファ B_SIZE: 内部バッファのサイズ r_ptr: 読み込みポインタ w_ptr: 書き込みポインタ [T] 0 ≦ w_ptr ≦ r_ptr ≦ B_SIZE - 1 のとき: この関数を実行した後、戻り値として "&buffer[w_ptr]" が返り、 size 引数には "r_ptr - w_ptr" が設定されます。 一方、SFXRingBuffer::GetWritableSize 関数の戻り値も "r_ptr - w_ptr" です。 この場合は、1 回の SFXRingBuffer::GetWritableBuffer 関数と SFXRingBuffer::SeekWrite 関数の呼び出しで、 SFXRingBuffer::GetWritableSize 関数の戻り値のサイズのデータを書き込めます。 [U] 0 = r_ptr < w_ptr ≦ B_SIZE - 1 のとき: この関数を実行した後、戻り値として "&buffer[w_ptr]" が返り、 size 引数には "B_SIZE - w_ptr" が設定されます。 一方、SFXRingBuffer::GetWritableSize 関数の戻り値も "B_SIZE - w_ptr" です。 この場合も、1 回の SFXRingBuffer::GetWritableBuffer 関数と SFXRingBuffer::SeekWrite 関数の呼び出しで、 SFXRingBuffer::GetWritableSize 関数の戻り値のサイズのデータを書き込めます。 [V] 0 < r_ptr < w_ptr ≦ B_SIZE - 1 のとき: この関数を実行した後、 戻り値として "&buffer[w_ptr]" が返り、size 引数には "B_SIZE - w_ptr" が設定されます。 一方、SFXRingBuffer::GetWritableSize 関数の戻り値は、"B_SIZE - w_ptr + r_ptr" です。 この値は "r_ptr ≠ 0" なので SFXRingBuffer::GetWritableSize 関数の戻り値と異なります。 この後、"SFXRingBuffer::SeekWrite(B_SIZE - w_ptr);" を実行すると、 "w_ptr = 0" となり、"0 = w_ptr < r_ptr ≦ B_SIZE - 1" となります。 ここで、もう一度(合計 2 回)、SFXRingBuffer::GetWritableBuffer 関数と SFXRingBuffer::SeekWrite 関数の呼び出すと、 最初の SFXRingBuffer::GetWritableSize 関数の戻り値のサイズのデータを書き込むことが可能になります。 |
ストリームから読み込んで、書き込み可能なデータをリングバッファに書き込むコードは以下の通りです。
Void WriteRingBufferFromFile(SFXBinaryStreamReaderRef stream, SFXRingBufferRef ring) { UInt32 totalSize; // リングバッファに書き込み可能なデータの総サイズ UInt32 availSize; // ファイルから読み込み可能なデータの総サイズ UInt32 writableSize; // 内部バッファに 1 度の操作で書き込み可能なデータのサイズ VoidPtr writePtr; // 書き込みポインタ UInt32 writtenSize; // 実際に書き込んだサイズ totalSize = ring.GetWritableSize(); availSize = stream.GetReadableSize(); if (availSize > 0) { writePtr = ring.GetWritableBuffer(&writableSize); writtenSize = (availSize < writableSize) ? availSize : writableSize; stream.Read(writePtr, writtenSize); ring.SeekWrite(writePtr, writtenSize); totalSize -= writtenSize; availSize -= writtenSize; } if (totalSize > 0 && availSize > 0) { writePtr = ring.GetWritableBuffer(&writableSize); writtenSize = (availSize < writableSize) ? availSize : writableSize; stream.Read(writePtr, writtenSize); ring.SeekWrite(writePtr, writtenSize); } }
SFXRingBuffer::GetWritableSize | SFXRingBuffer::SeekWrite | SFXRingBuffer::GetReadableBuffer | SFXHeap
[ public, const ] UInt32 GetWritableSize(Void);
このリングバッファに書き込み可能なデータの合計サイズ [単位: バイト]
この関数は、現在このリングバッファに書き込み可能なデータの合計サイズを取得します。[単位: バイト]
SFXRingBuffer::GetWritableBuffer 関数の size 引数に返される値との違い | |
---|---|
SFXRingBuffer::GetWritableBuffer 関数の size 引数に返される値は、 書き込みポインタを使用してリングバッファの内部バッファメモリ(SFXHeap<Byte> 型)に直接書き込めるデータのサイズです。 一般に、以下の不等式が成り立ちます。詳細は SFXRingBuffer::GetWritableBuffer 関数の解説を参照してください。 リングバッファに書き込み可能なデータの合計サイズ ≧ 内部バッファメモリに直接書き込み可能なデータのサイズ |
static ByteConst data[] = { '1', '2', '3', '4', '5', '6', '7', '8' }; SFXRingBuffer ring; SFXBuffer buffer; // リングバッファのサイズを 256 バイトに設定する if (ring.Allocate(256) == SFERR_NO_ERROR) { TRACE("GetSize = %d", ring.GetSize()); // GetSize = 256 TRACE("GetWritableSize = %d", ring.GetWritableSize()); // GetWritableSize = 256 TRACE("GetReadableSize = %d", ring.GetReadableSize()); // GetReadableSize = 0 // 8 バイトのデータをリングバッファに書き込む if (ring.Write(data, sizeof(data)) == SFERR_NO_ERROR) { TRACE("GetSize = %d", ring.GetSize()); // GetSize = 256 TRACE("GetWritableSize = %d", ring.GetWritableSize()); // GetWritableSize = 248 TRACE("GetReadableSize = %d", ring.GetReadableSize()); // GetReadableSize = 8 // 読み込み用バッファのサイズを 4 バイトに設定する buffer.SetSize(4); // 4 バイトのデータをリングバッファから読み込む if (ring.Read(&buffer) == SFERR_NO_ERROR) { TRACE("GetSize = %d", ring.GetSize()); // GetSize = 256 TRACE("GetWritableSize = %d", ring.GetWritableSize()); // GetWritableSize = 252 TRACE("GetReadableSize = %d", ring.GetReadableSize()); // GetReadableSize = 4 } } }
SFXRingBuffer::Write | SFXRingBuffer::GetWritableBuffer | SFXRingBuffer::GetReadableSize | SFXHeap
[ public, const ] SInt32 LastIndexOf( SFXBufferConstRef buffer // 検索するバッファ SInt32 index = SINT32_MAXIMUM // 検索開始位置 );
[ public, const ] SInt32 LastIndexOf( VoidConstPtr buffer // 検索するバッファ UInt32 buffer // 検索するバッファのサイズ SInt32 index = SINT32_MAXIMUM // 検索開始位置 );
[ public, const ] SInt32 LastIndexOf( Byte byte // 検索する Byte データ SInt32 index = SINT32_MAXIMUM // 検索開始位置 );
この関数は検索開始位置(デフォルト値: 書き込みポインタ)から読み込みポインタまでこのリングバッファを検索し、 指定されたデータが見つかった読み込みポインタから最後の位置(インデックス)を取得します。
index 引数に書き込みポインタ以外の検索開始位置を指定できます。
注意 | |
---|---|
読み込みポインタのインデックス値を 0 とします。 書き込みポインタが指すデータは検索に含まれません。 |
static ByteConst data[] = { '1', '2', '3', '4', '5', '6', '7', '8' }; SFXRingBuffer ring; SFXBuffer buffer; // リングバッファのサイズを 256 バイトに設定する if (ring.Allocate(256) == SFERR_NO_ERROR) { // 8 バイトのデータを書き込む if (ring.Write(data, sizeof(data)) == SFERR_NO_ERROR) { // Byte データを終点から検索してインデックスを取得する TRACE("LastIndexOf('2') = %d", ring.LastIndexOf('2')); // LastIndexOf('2') = 1 TRACE("LastIndexOf('9') = %d", ring.LastIndexOf('9')); // LastIndexOf('9') = -1 } }
[ public ] SFCError Read( VoidPtr buffer // 読み込んだデータを格納するアドレス UInt32 size // 読み込むサイズ );
[ public ] SFCError Read( SFXBufferPtr buffer // 読み込むバッファ );
この関数は、このリングバッファから指定された引数にデータを読み込みます。
Tip | |
---|---|
SFXRingBuffer::GetReadableSize 関数の戻り値のサイズまでのデータを読み込むことが可能です。 |
注意 | |
---|---|
buffer 引数に SFXBuffer クラスを指定するときは、 この関数を呼び出す前に SFXBuffer::SetSize 関数を使用してこのリングバッファから読み込むデータのサイズを指定する必要があります。 buffer 引数(size 引数)のサイズが SFXRingBuffer::GetReadableSize 関数の戻り値を超えるときは、 SFERR_FAILED を返します。 このリングバッファの内部バッファメモリが buffer 引数のメモリ領域の一部を含む場合は、 SFERR_INVALID_PARAM を返します。 |
static ByteConst data[] = { '1', '2', '3', '4', '5', '6', '7', '8' }; SFXRingBuffer ring; SFXBuffer buffer; // リングバッファのサイズを 256 バイトに設定する if (ring.Allocate(256) == SFERR_NO_ERROR) { // 8 バイトのデータをリングバッファに書き込む if (ring.Write(data, sizeof(data)) == SFERR_NO_ERROR) { // 読み込み用バッファのサイズを 4 バイトに設定する buffer.SetSize(4); // 4 バイトのデータをリングバッファから読み込む if (ring.Read(&buffer) == SFERR_NO_ERROR) { // バッファの内容を表示する TRACE("%c, %c, %c, %c", buffer[0], buffer[1], buffer[2], buffer[3]); // 1, 2, 3, 4 } } }
[ public ] Void Reset(Void);
この関数は、このリングバッファに書き込まれたデータをクリアします。
注意 | |
---|---|
この関数を実行した直後、 読み込み可能なサイズは 0 になり、書き込み可能なサイズはバッファサイズに等しくなります。 |
この関数は、このリングバッファ用ストリームの読み込みポインタを指定されたサイズ分だけ進めます。
static ByteConst data[] = { '1', '2', '3', '4', '5', '6', '7', '8' }; SFXRingBuffer ring; SFXBuffer buffer; // リングバッファのサイズを 256 バイトに設定する if (ring.Allocate(256) == SFERR_NO_ERROR) { // 8 バイトのデータをリングバッファに書き込む if (ring.Write(data, sizeof(data)) == SFERR_NO_ERROR) { // 読み込み用バッファのサイズを 4 バイトに設定する buffer.SetSize(4); // リングバッファの読み込みポインタを 2 だけ進める ring.SeekRead(2); // 4 バイトのデータをリングバッファから読み込む if (ring.Read(&buffer) == SFERR_NO_ERROR) { // バッファの内容を表示する TRACE("%c, %c, %c, %c", buffer[0], buffer[1], buffer[2], buffer[3]); // 3, 4, 5, 6 } } }
この関数は、このリングバッファ用ストリームの書き込みポインタを指定されたサイズ分だけ進めます。
static ByteConst data[] = { '1', '2', '3', '4', '5', '6', '7', '8' }; SFXRingBuffer ring; SFXBuffer buffer; // リングバッファのサイズを 256 バイトに設定する if (ring.Allocate(256) == SFERR_NO_ERROR) { // 書き込みポインタを 2 だけ進める ring.SeekWrite(2); // 8 バイトのデータをリングバッファに書き込む if (ring.Write(data, sizeof(data)) == SFERR_NO_ERROR) { // 読み込み用バッファのサイズを 4 バイトに設定する buffer.SetSize(4); // 4 バイトのデータをリングバッファから読み込む if (ring.Read(&buffer) == SFERR_NO_ERROR) { // バッファの内容を表示する TRACE("%c, %c, %c, %c", buffer[0], buffer[1], buffer[2], buffer[3]); // , , 1, 2 } } }
[ public ] SFCError Write( VoidConstPtr buffer // 書き込むデータへのポインタ UInt32 size // 書き込むサイズ );
[ public ] SFCError Write( SFXBufferConstRef buffer // 書き込むバッファ );
この関数は、このリングバッファに引数に指定されたデータを書き込みます。
Tip | |
---|---|
このリングバッファに SFXRingBuffer::GetWritableSize 関数の戻り値のサイズまでのデータを書き込むことが可能です。 |
注意 | |
---|---|
buffer 引数(size 引数)のサイズが SFXRingBuffer::GetWritableSize 関数の戻り値よりも大きい場合は、 SFERR_FAILED を返します。 このリングバッファの内部バッファメモリが buffer 引数のメモリ領域の一部を含む場合は、 SFERR_INVALID_PARAM を返します。 |
static ByteConst data[] = { '1', '2', '3', '4', '5', '6', '7', '8' }; SFXRingBuffer ring; SFXBuffer buffer; // リングバッファのサイズを 256 バイトに設定する if (ring.Allocate(256) == SFERR_NO_ERROR) { // 8 バイトのデータをリングバッファに書き込む if (ring.Write(data, sizeof(data)) == SFERR_NO_ERROR) { // 読み込み用バッファのサイズを 4 バイトに設定する buffer.SetSize(4); // 4 バイトのデータをリングバッファから読み込む if (ring.Read(&buffer) == SFERR_NO_ERROR) { // バッファの内容を表示する TRACE("%c, %c, %c, %c", buffer[0], buffer[1], buffer[2], buffer[3]); // 1, 2, 3, 4 } } }
Copyright(c) 2002 - 2024 Sophia Cradle Incorporated All Rights Reserved. |