前のページ次のページ上に戻るホーム SophiaFramework UNIVERSE 5.3
SFXRingBuffer
リングバッファを表すクラスです。
#include <SFXRingBuffer.h.hpp>
class SFXRingBuffer;
SFMTYPEDEFCLASS(SFXRingBuffer)

協調図

SFXRingBuffer クラスの協調図

解説

SFXRingBuffer クラスは、リングバッファを表すクラスです。

リングバッファとは、概念的に環状に配置されたメモリを表します。

リングバッファには、リングバッファ上を時計回りに進む書き込みポインタと読み込みポインタがあります。 書き込みポインタ経由でリングバッファにデータを書き込むと、書き込みポインタは進みます。 読み込みポインタ経由でリングバッファからデータを読み込むと、読み込みポインタは進みます。

[Note] 注意
読み込みポインタは書き込みポインタの位置を越えることができません。 逆に、書き込みポインタは読み込みポインタの位置を越えることができません。

リングバッファのメモリは、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 )
このリングバッファにデータを書き込みます。

SFXRingBuffer::SFXRingBuffer
SFXRingBuffer クラスのコンストラクタです。
[ public, explicit ]
SFXRingBuffer(Void);

解説

[Caution] 注意
SFXBuffer::SFXBuffer コンストラクタとは異なり、 このコンストラクタではバッファメモリの割り当ては行われません。 そのため、 SFXRingBuffer::Allocate 関数を呼び出してバッファメモリを割り当てる必要があります。

参照

SFXRingBuffer::Allocate | SFXBuffer::SFXBuffer


SFXRingBuffer::~SFXRingBuffer
SFXRingBuffer クラスのデストラクタです。
[ public ]
~SFXRingBuffer(Void);

解説

[Note] 注意
バッファメモリが割り当てられている場合は、 SFXRingBuffer::Free 関数を呼び出して解放します。

参照

SFXRingBuffer::Free


SFXRingBuffer::Allocate
このリングバッファに指定されたサイズのメモリを割り当てます。
[ public ]
SFCError Allocate(
    UInt32 size   // 割り当てるメモリサイズ
);

戻り値

  • 成功したとき: SFERR_NO_ERROR
  • メモリ不足のとき: SFERR_NO_MEMORY

解説

この関数は、このリングバッファに指定されたサイズのメモリ(内部バッファメモリ)を割り当てます。

[Note] 注意

メモリの割り当てを行わず、このクラスの他の関数を呼び出した場合の挙動は未定義です。

[Caution] 注意事項

この関数を実行する前にリングバッファの内部バッファメモリが保持していた内容は破棄されます。

一度割り当てたリングバッファのサイズは変更できません。

使用例

SFXRingBuffer ring;

// 256 バイトのメモリをリングバッファに割り当てる
if (ring.Allocate(256) == SFERR_NO_ERROR) {

    ...
}

参照

SFXRingBuffer::Free | SFXRingBuffer::GetSize | SFXRingBuffer::SFXRingBuffer


SFXRingBuffer::EmptyInstance
空のリングバッファを取得します。
[ public, static ]
SFXRingBufferConstRef EmptyInstance(Void);

解説

空のリングバッファを表すインスタンスを取得します。


SFXRingBuffer::FirstIndexOf
検索開始位置から書き込みポインタまでこのリングバッファを検索して、指定されたデータと一致する最初のインデックスを取得します。
[ 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   // 検索開始位置
);

戻り値

  • 成功したとき: 見つかった位置のインデックス
  • 失敗したとき: -1

解説

この関数は、検索開始位置(デフォルト値: 読み込みポインタ)から書き込みポインタまでこのリングバッファを検索し、 指定されたデータが見つかった読み込みポインタから最初の位置(インデックス)を取得します。

index 引数に読み込みポインタ以外の検索開始位置を指定できます。

[Note] 注意

読み込みポインタのインデックス値を 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
    }
}

参照

SFXRingBuffer::LastIndexOf


SFXRingBuffer::Free
このリングバッファに割り当てられたメモリを解放します。
[ public ]
Void Free(Void);

解説

この関数は、SFXRingBuffer::Allocate 関数によりこのリングバッファに割り当てられたメモリ(内部バッファメモリ)を解放します。

[Note] 注意
バッファメモリが割り当てられていない場合は何も行いません。

使用例

SFXRingBuffer ring;

// 256 バイトのバッファメモリを割り当てる
if (ring.Allocate(256) == SFERR_NO_ERROR) {
    ...
    
    ring.Free();  // 明示的なバッファメモリの解放
}

参照

SFXRingBuffer::Allocate


SFXRingBuffer::GetReadableBuffer
このリングバッファに割り当てられている内部バッファメモリの読み込みポインタを取得します。
[ public, const ]
VoidConstPtr GetReadableBuffer(
    UInt32Ptr size   // 内部バッファから直接読み込み可能なデータのサイズを返す
);

解説

この関数は、このリングバッファに割り当てられている内部バッファメモリの読み込みポインタを取得します。

この関数を実行すると、 取得した読み込みポインタ経由で内部バッファメモリから 1 回で直接読み込み可能なデータのサイズが size 引数に設定されます。

このポインタと size 引数に返された値を使用して、内部バッファメモリから直接データを読み込むことができます。

[Tip] Tip
下の使用例にあるように、 この関数はリングバッファ内の読み込み可能なデータをストリームに出力するときに使用します。
[Caution] 注意事項

リングバッファの特性上、 読み込みポインタの値が書き込みポインタの値よりも大きく、かつ、 書き込みポインタの値が 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


SFXRingBuffer::GetReadableSize
このリングバッファから読み込み可能なデータの合計サイズを取得します。[単位: バイト]
[ public, const ]
UInt32 GetReadableSize(Void);

戻り値

このリングバッファから読み込み可能なデータの合計サイズ[単位: バイト]

解説

この関数は、現在このリングバッファから読み込み可能なデータの合計サイズを取得します。[単位: バイト]

[Note] 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


SFXRingBuffer::GetSize
このリングバッファに割り当てられている内部バッファメモリのサイズを取得します。
[ public, const ]
UInt32 GetSize(Void);

解説

この関数は、SFXRingBuffer::Allocate 関数によりこのリングバッファに割り当てられている内部バッファメモリのサイズを取得します。

[Note] 注意
リングバッファの特性から、
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

        }
    }
}

参照

SFXRingBuffer::Allocate | SFXRingBuffer::GetReadableSize | SFXRingBuffer::GetWritableSize


SFXRingBuffer::GetWritableBuffer
このリングバッファに割り当てられている内部バッファメモリの書き込みポインタを取得します。
[ public ]
VoidPtr GetWritableBuffer(
    UInt32Ptr size   // 内部バッファメモリに直接書き込み可能なデータのサイズを返す
);

解説

この関数は、このリングバッファに割り当てられている内部バッファメモリの書き込みポインタを取得します。

この関数を実行すると、 取得した書き込みポインタ経由で内部バッファメモリに 1 回で直接書き込み可能なデータのサイズが size 引数に設定されます。

このポインタと size 引数に返された値を使用して、内部バッファメモリに直接データを書き込むことができます。

[Tip] Tip
下の使用例にあるように、 この関数はストリームから読み込み可能なデータをリングバッファに書き込むときに使用します。
[Caution] 注意事項

リングバッファの特性上、 書き込みポインタの値が読み込みポインタの値よりも大きく、かつ、 読み込みポインタの値が 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


SFXRingBuffer::GetWritableSize
このリングバッファに書き込み可能なデータの合計サイズを取得します。[単位: バイト]
[ public, const ]
UInt32 GetWritableSize(Void);

戻り値

このリングバッファに書き込み可能なデータの合計サイズ [単位: バイト]

解説

この関数は、現在このリングバッファに書き込み可能なデータの合計サイズを取得します。[単位: バイト]

[Note] 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


SFXRingBuffer::LastIndexOf
検索開始位置から読み込みポインタまでこのリングバッファを検索して、指定されたデータと一致する最後のインデックスを取得します。
[ 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   // 検索開始位置
);

戻り値

  • 成功したとき: 見つかった位置のインデックス
  • 失敗したとき: -1

解説

この関数は検索開始位置(デフォルト値: 書き込みポインタ)から読み込みポインタまでこのリングバッファを検索し、 指定されたデータが見つかった読み込みポインタから最後の位置(インデックス)を取得します。

index 引数に書き込みポインタ以外の検索開始位置を指定できます。

[Note] 注意

読み込みポインタのインデックス値を 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
    }
}

参照

SFXRingBuffer::FirstIndexOf


SFXRingBuffer::Read
このリングバッファからデータを読み込みます。
[ public ]
SFCError Read(
    VoidPtr buffer   // 読み込んだデータを格納するアドレス
    UInt32 size      // 読み込むサイズ
);
[ public ]
SFCError Read(
    SFXBufferPtr buffer   // 読み込むバッファ
);

戻り値

  • 成功したとき: SFERR_NO_ERROR
  • このリングバッファの内部バッファメモリと buffer 引数のメモリ領域が共通部分を持つとき: SFERR_INVALID_PARAM
  • buffer 引数(size 引数)のサイズが SFXRingBuffer::GetReadableSize 関数の戻り値を超えるとき: SFERR_FAILED

解説

この関数は、このリングバッファから指定された引数にデータを読み込みます。

[Tip] Tip
SFXRingBuffer::GetReadableSize 関数の戻り値のサイズまでのデータを読み込むことが可能です。
[Caution] 注意

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
                
        }
    }
}

参照

SFXRingBuffer::Write | SFXRingBuffer::GetReadableSize | SFXBuffer::SetSize | SFXBuffer


SFXRingBuffer::Reset
このリングバッファに書き込まれたデータをクリアします。
[ public ]
Void Reset(Void);

解説

この関数は、このリングバッファに書き込まれたデータをクリアします。

[Note] 注意
この関数を実行した直後、 読み込み可能なサイズは 0 になり、書き込み可能なサイズはバッファサイズに等しくなります。

参照

SFXRingBuffer::GetSize | SFXRingBuffer::GetReadableSize | SFXRingBuffer::GetWritableSize


SFXRingBuffer::SeekRead
このリングバッファ用ストリームの読み込みポインタを指定されたサイズ分だけ進めます。
[ public ]
SFCError SeekRead(
    UInt32 size   // 読み込みポインタを進めるサイズ
);

戻り値

解説

この関数は、このリングバッファ用ストリームの読み込みポインタを指定されたサイズ分だけ進めます。

使用例

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
                
        }
    }
}

参照

SFXRingBuffer::GetReadableBuffer | SFXRingBuffer::GetReadableSize


SFXRingBuffer::SeekWrite
このリングバッファ用ストリームの書き込みポインタを指定されたサイズ分だけ進めます。
[ public ]
SFCError SeekWrite(
    UInt32 size   // 書き込みポインタを進めるサイズ
);

戻り値

解説

この関数は、このリングバッファ用ストリームの書き込みポインタを指定されたサイズ分だけ進めます。

使用例

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
                
        }
    }
}

参照

SFXRingBuffer::GetWritableBuffer | SFXRingBuffer::GetWritableSize


SFXRingBuffer::Write
このリングバッファにデータを書き込みます。
[ public ]
SFCError Write(
    VoidConstPtr buffer   // 書き込むデータへのポインタ
    UInt32 size           // 書き込むサイズ
);
[ public ]
SFCError Write(
    SFXBufferConstRef buffer   // 書き込むバッファ
);

戻り値

  • 成功したとき: SFERR_NO_ERROR
  • このリングバッファの内部バッファメモリと buffer 引数のメモリ領域が共通部分を持つとき: SFERR_INVALID_PARAM
  • buffer 引数(size 引数)のサイズが SFXRingBuffer::GetWritableSize 関数の戻り値を超えるとき: SFERR_FAILED

解説

この関数は、このリングバッファに引数に指定されたデータを書き込みます。

[Tip] Tip
このリングバッファに SFXRingBuffer::GetWritableSize 関数の戻り値のサイズまでのデータを書き込むことが可能です。
[Caution] 注意

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
                
        }
    }
}

参照

SFXRingBuffer::Read | SFXRingBuffer::GetWritableSize | SFXBuffer