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
#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));).