バッファはメモリを抽象化したもので、データの読み書きに用いる。
バッファのインターフェースは Buffer抽象クラスで定義されている。
以降の節で、よく使う関数を簡単に説明する。
ランダムアクセスは、シーケンシャルアクセス操作を使った後に読み書き位置(カーソル)を戻すことで行う。カーソルを操作するメソッドが定義されている。
カーソルはユーザーの用意する Cursor オブジェクトに記憶する。 一つの Cursor に一つの位置を記憶させることができる。複数の Cursor を用いれば複数の位置を記憶できる。
一つでも mark() されているバッファは、読み込み完了した領域の再利用が行われない。 メモリ効率のためには、不要になった記憶は解除する必要がある。
解除は unmark() か Cursor のデストラクタで行うことができる。
効率的なデータ読み書きのために、バッファ内部のメモリへ直にアクセスすることができる。
struct IoVec {
void* ptr;
uint32_t size;
};
getReadBuffers(), getWriteBuffers() をして得たメモリへ読み書きした場合、skipWrite(), skipRead() を呼んで明示的に位置を移動させるのを忘れないように。
なお、型指定の読み書きAPI(writeUInt8() など)を使った場合の、メモリ上の表現は隠蔽されている。 バイトオーダーやアラインメントで異なるであろうし、将来的に簡単な圧縮を行うかもしれない。 このため、getReadBuffers/getWriteBuffers で得たメモリ内容の操作は、単純にバイト列として扱うべきである。