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