SimpleBuffer

固定バッファ長の配列クラス

可変長の配列ですが、最大長は固定の配列クラスです。

template <class T, 
          class SOUT=_SimpleBuffer_DummyStreamOut,
          int is_string_type=0>
class SimpleBuffer : public SOUT

配列のメモリは、外部の固定バッファを参照する方法と、内部にコストラクタで確保する方法の2種類があります。

外部のバッファを参照する場合、参照先のメモリを安全に利用できるようユーザプログラムで管理しなければなりません。

template 引数

いくつかの派生クラスを定義するためtemplateによる定義となっています。

引数

意味

T

データ型

SOUT

IStreamOut 派生クラスを継承することで<<演算子などを用いたデータ追加を可能とします。 IStreamOutクラスを継承するとメンバー変数が増えるため、デフォルトはダミーとなっています。

is_sting_type

1を指定すると、文字列型 (uint8_twchar_t) の場合に、NUL終端を意識したコードを有効にします。

  • バッファを確保する際に終端文字分を余分に確保する

  • 固定長配列によるコピーコンストラクトなどではNUL文字までをコピー対象とする

メソッド

SimpleBuffer() - コストラクタ

SimpleBuffer()
SimpleBuffer(T* p, uint16_t u16len, uint16_t u16maxlen)
SimpleBuffer(uint16_t u16maxlen)

パラメータなしのコンストラクタは、バッファ未登録として初期化します。バッファが未登録の場合はlength_max()が0になります。このオブジェクトを配列として利用するにはattach()メソッドにより改めてバッファを登録する必要があります。

外部のバッファを参照する場合は、バッファへのポインタp、配列の初期長u16len、配列の最大長u16maxlenを指定します。

メモリを動的確保するにはu16maxlenのみを指定するコンストラクタを呼び出します。

代入演算子、コピーコンストラクタ

SimpleBuffer(const SimpleBuffer<T>& ref)
SimpleBuffer<T>& operator = (const SimpleBuffer<T>& ref)

コピー元が、外部メモリ参照の場合は、コピー元の参照先をそのままコピーします。

コピー元が、内部にメモリ確保している場合は、コピー元のメモリ領域をそのまま利用します。新たにメモリのコピーを作成するわけではありません。本クラスでの内部確保したメモリは、スマートポインタshared_ptrで管理されます。コピー先とコピー元すべてのオブジェクトが破棄された時点で、メモリ領域を破棄します。

attach()

void attach(T* p, uint16_t l, uint16_t lm)

配列の参照先を再設定します。

内部メモリ確保のオブジェクトの場合、内部メモリのスマートポインタを破棄しません。

一時的に部分配列として取り扱うといった使い方を想定します。以下の例では、128バイトの長さのbufを生成した後に、先頭17バイト目から末尾までの部分配列buf_subを生成しています。

SimpleBuffer<uint8_t> buf(128), buf_sub;

buf_sub = buf;
buf_sub.attach(buf.begin() + 16, 0, buf.max_length() - 16);

begin(), end()

T* begin()
T* end()

配列の先頭ポインタ、末尾+1のアドレスのポインタを返します。STLのアルゴリズムや範囲for文などで利用されます。

配列バッファの先頭ポインタを得るときにbegin()を用います。

append()

push_back()

push_back()

bool append(T c)
void push_back(T c) { append(c); }

配列の末尾に要素を追加します。要素が追加できないときはfalseが戻ります。

length(), length_max()

size(), capacity()

size(), capacity()

uint16_t length()
uint16_t size() { return length(); }

uint16_t length_max()
uint16_t capacity() { return length_max(); }

size()は配列の長さ、capacity()は配列の最大長を返します。

redim()

reserve()

reserve()

bool redim(uint16_t len)
bool reserve(uint16_t len) { return redim(len); }

配列の長さを変更します。現在の長さより大きくなる場合は要素型Tのデフォルトの初期化方法T{}にて初期化されます。数値型なら0です。

operator []

inline T& operator [] (int i)

配列へのアクセス手段を提供します。

インデックスiは、負の値の場合は配列の末尾からのインデックスとなります。-1が末尾になります。

最終更新