smplbuf
内部が配列構造のコンテナクラスです。初期化時にバッファの最大サイズを決定しますが、その最大サイズまでの範囲で可変長の配列として振る舞います。
template <typename T, int N> smplbuf_local
template <typename T> smplbuf_attach
template <typename T> smplbuf_heapsmplbufは要素の型Tとメモリの確保方法allocで指定したメモリ領域に対して配列の操作を提供するコンテナクラスです。allocの指定は煩雑であるためusingを用いた別名定義が行っています。
オブジェクトの宣言例です。宣言の直後に初期化用のメソッド呼び出しを行います。いずれも初期化直後の最大サイズは128バイトで、サイズは0です。必要に応じてサイズを拡張しながら使用します。
// 内部に固定配列
smplbuf_local<uint8_t, 128> b1;
b1.init_local();
// すでにある配列を利用する
uint8_t buf[128];
smplbuf_attach<uint8_t> b2;
b2.attach(buf, 0, 128);
// ヒープに確保する
smplbuf_heap<uint8_t> b3;
b3.init_heap(128); 上記のuint8_t型に限り別名定義があります。
template <int N>
smplbuf_u8
// smplbuf<uint8_t, alloc_local<uint8_t, N>>
smplbuf_u8_attach
// smplbuf<uint8_t, alloc_attach<uint8_t>>
smplbuf_u8_heap
// smplbuf<uint8_t, alloc_heap<uint8_t>>通常の配列のように[]演算子などを用いて要素にアクセスできますし、イテレータを用いたアクセスも可能です。
smplbuf_u8<32> b1;
b1.reserve(5);
b1[0] = 1;
b1[1] = 4;
b1[2] = 9;
b1[3] = 16;
b1[4] = 25;
for(uint8_t x : b1) {
  Serial << int(x) << ",";
}smplbufはストリーム(stream)インタフェースも有しているため、いくつかのストリーム用のメソッドを使用することができます。
smplbuf_u8<32> b1;
b1 << uint8_t(0x01)
   << uint32_t(0x1234abd);push_back()メソッドを定義しています。末尾にデータを追記するタイプのアルゴリズムが使用可能になります。
宣言・初期化
smplbuf_local<T,N>
smplbuf_local<T,N>::init_local()
smplbuf_attach<T>
smplbuf_attach<T>::attach(T* buf, uint16_t size, uint16_t N)
smplbuf_heap<T>
smplbuf_heap<T>::init_heap(uint16_t N)
// 例
// 内部に固定配列
smplbuf_local<uint8_t, 128> b1;
b1.init_local();
// すでにある配列を利用する
uint8_t buf[128];
smplbuf_attach<uint8_t> b2;
b2.attach(buf, 0, 128);
// ヒープに確保する
smplbuf_heap<uint8_t> b3;
b3.init_heap(128); 型TでサイズNのコンテナを宣言します。宣言後に初期化のメソッドを呼び出します。
smplbuf_attachでは、使用するバッファの先頭ポインタT* bufと配列の初期サイズsizeと最大サイズNを指定します。
smplbuf_localのみ、ローカルオブジェクトとして宣言する場合は、初期化メソッド.init_local()を省略できます。
alloc_localでグローバルオブジェクトを生成する場合は、smplbufコンテナの使用前に.init_local()メソッドを呼び出します。
初期化子リスト
void in_some_func() {
    smplbuf_local<uint8_t, 5> b1;
    b1.init_local();
    
    b1 = { 0, 1, 2, 3, 4 };
    
    smplbuf_local<uint8_t, 5> b2{0, 1, 2, 3, 4};
}初期化子リスト(イニシャライザリスト){ ... } によるメンバーの初期化をできます。smplbuf_localのローカル宣言でのコンストラクタでの利用を除き、初期化のメソッドを呼び出した後に有効です。
- 代入演算子の右辺値 ( - smplbuf_local,- smplbuf_attach,- smplbuf_heap)
- コンストラクタ( - smplbuf_localのローカル宣言、グローバル宣言は不可)
メソッド
append(), push_back(), pop_back()
inline bool append(T&& c)
inline bool append(const T& c)
inline void push_back(T&& c)
inline void push_back(const T& c)末尾にメンバーcを追加します。append()の戻り値はboolで、バッファが一杯で追加できないときにfalseが返ります。
pop_back()は末尾のエントリを抹消します。
empty(), size(), capacity()
inline bool empty()
inline bool is_end()
inline uint16_t size()
inline uint16_t capacity()empty()は配列に要素が格納されていない場合にtrueを戻します。is_end()は反対に配列サイズ一杯まで要素が格納されているときにtrueを戻します。
size()は配列の要素数を返します。
capacity()は配列の最大格納数を返します。
reserve(), reserve_hear(), redim()
inline bool reserve(uint16_t len)
inline void reserve_head(uint16_t len)
inline void redim(uint16_t len)reserve()は配列のサイズを拡張します。配列が格納されていない領域はデフォルトで初期化されます。
reserve_hear()は配列の先頭部に指定したサイズの領域を確保します。コンテナオブジェクトからは参照できない領域となります。例えばパケットペイロードのヘッダ部分を読み飛ばした部分配列にアクセスするようなコンテナとして利用できるようにします。確保した領域を戻しすべてアクセスできるようにコンテナを戻すには確保時と同じ負の値を与えます。
redim()は利用領域のサイズを変更します。reserve()と違い、未使用領域の初期化を行いません。
operator []
inline T& operator [] (int i) 
inline T operator [] (int i) const要素にアクセスします。
iに負の値を与えるとバッファー末尾からの要素となります。-1の場合は末尾の要素、-2は末尾から一つ手前となります。
to_stream()
inline std::pair<T*, T*> to_stream()
//例
smplbuf_local<uint8_t, 10> b1;
b1.init_local();
b1 = { 0x30, 0x31, 0x32, 0x33 };
Serial << b1.to_stream();
// Output->0123ストリームへの出力目的で利用します。
ストリーム (stream)
inline size_t write(int n)
inline static void vOutput(char out, void* vp)
inline void flush(void)上記の実装を行っています。
- <<演算子を用いて配列にデータを書き込む
- printfのアルゴリズムを用いた関数を持ちて配列にデータを書き込む 
- flush()によりバッファの末尾にヌル文字を書きこむ(配列のサイズは変更しません)
最終更新