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() メソッドの引数でサイズを指定する際には, バイト単位で指定する必要があります.
Template Parameters
- CharT
- 文字の型を指定します.
- Traits
- 文字列を扱うためのtraitsを指定します.デフォルト値は, std::char_traits<CharT>.
Construction and Member Functions
template <class Container> basic_ivstream(const Container& data); template <class Type> basic_ivstream(const Type* data, size_type n); virtual ~basic_ivstream() throw();
コンストラクタには,コンテナ,または配列を引数に指定します.コンテナの場合,std::vector のように begin()/end() メソッドを持っており,かつ領域が連続されたメモリ空間内に確保されてある必要があります. また,配列(または,new などで動的に確保した領域)を指定する場合は, 第 2 引数に要素数を指定する必要があります.