CLX C++ Libraries
Home >> vstream

Declarations

template <
    class CharT,
    class Traits = std::char_traits<CharT>
>
class basic_ivstream : public std::basic_istream<CharT, Traits>;

typedef basic_ivstream<char> ivstream;

Overview

手元に配列や(std::string, std::vector, std::deque などの)コンテナの形でデータ保持しているが, 使用したい関数(またはメソッド)のインターフェース(引数)は std::basic_istream と言うケースに遭遇する事があります.この時,簡単な解決策としては std::basic_stringstream を利用する事が挙げられますが,元のデータサイズが大きくなるとコピーのコストが高くなります.

ivstream は,配列やコンテナをストリームのように扱うためのクラスです. コンテナや配列をコンストラクタに指定して ivstream を生成すると,指定したデータの範囲内で, read(), seekg(), tellg() メソッドなどを実行する事のできる仮想入力ストリームが生成されます.

Example

example_vstream.cpp

#include <iostream>
#include <iterator>
#include <vector>
#include "clx/vstream.h"

template <class InStream, class Type>
bool getdata(InStream& in, Type& dest) {
    typedef typename InStream::char_type char_type;
    in.read(reinterpret_cast<char_type*>(&dest), sizeof(Type));
    if (in.gcount() <= 0) return false;
    return true;
}

int main(int argc, char* argv[]) {
    std::vector<int> v;
    for (int i = 0; i < 100; ++i) v.push_back(i);
    clx::ivstream vs(v);
    
    int data;
    vs.seekg(80);
    vs.seekg(-40, std::ios_base::end);
    while (getdata(vs, data)) std::cout << data << " ";
    std::cout << std::endl;
    
    return 0;
}

ivstream に指定するコンテナは std::vector<int> など char 型以外のコンテナも指定できますが, (basic_ivstream<char> の場合)read() メソッドや seekg() メソッドの引数でサイズを指定する際には, バイト単位で指定する必要があります.尚,ivstream には組み込み配列も上記と同じ形で指定する事が出来ます. 組み込み配列を指定するサンプルコードは, example_vstream_2.cpp を参照して下さい.

Template Parameters

CharT
文字の型を指定します.
Traits
文字列を扱うためのtraitsを指定します.デフォルト値は, std::char_traits<CharT>.

Construction and Member Functions

template <class InIter>
basic_ivstream(InIter first, InIter last);

template <class Container>
basic_ivstream(const Container& data);

virtual ~basic_ivstream() throw();

コンストラクタには,イテレータ,またはコンテナを引数に指定します.コンテナには,STL コンテナなどのように begin()/end() メソッドを持つクラス,または組み込み配列 (e.g., char hoge[256]) を指定する事ができます. ただし,コンテナを指定する場合,領域が連続されたメモリ空間内に確保されてある必要があります.

動的に確保した配列 (e.g., char* p = new char[256]) や配列の一部を仮想ストリームとして扱う場合には, その範囲の最初と最後のポインタを指定します (e.g., basic_ivstream vs(p, p + std::strlen(p));).

Reference

  1. 配列やコンテナをストリームとして扱う - Life like a clown