5#include <boost/serialization/serialization.hpp>
6#include <boost/serialization/vector.hpp>
7#include <boost/archive/text_iarchive.hpp>
8#include <boost/archive/text_oarchive.hpp>
9#include <boost/iostreams/filtering_streambuf.hpp>
10#include <boost/iostreams/filter/bzip2.hpp>
17 const size_t split_limit = 8*1024;
19 void write_vector(std::ostream& os,
const std::vector<T>& data)
21 boost::iostreams::filtering_streambuf<boost::iostreams::output> filter;
22 filter.push(boost::iostreams::bzip2_compressor());
24 std::ostream out(&filter);
26 boost::archive::text_oarchive oa(out);
27 if (data.size() <= split_limit) {
31 for (
size_t p=0; p<data.size(); p+=split_limit) {
32 std::vector<T> tmp(data.begin()+p,
33 data.begin()+std::min(p+split_limit,
43write(std::ostream& os,
const std::vector<int>& data)
45 write_vector(os, data);
48write(std::ostream& os,
const std::vector<double>& data)
50 write_vector(os, data);
56 : state(new
State(is))
67 boost::iostreams::filtering_streambuf<boost::iostreams::input>
filter;
68 std::unique_ptr<std::istream>
in;
69 std::unique_ptr<boost::archive::text_iarchive>
ia;
70 explicit State(std::istream &is)
74 filter.push(boost::iostreams::bzip2_decompressor());
76 in.reset(
new std::istream(&filter));
77 ia.reset(
new boost::archive::text_iarchive(*in));
84 return static_cast<bool>(*in);
90read(std::vector<T>& data)
92 return state->read_vector(data);
109 explicit State(std::istream& is) : reader(is), cur(0),
failed(!is)
115 return cur < data.size();
120 throw std::logic_error(
"no data in BinaryReader::read");
125 if (cur < data.size())
131 }
catch (boost::archive::archive_exception& e) {
133 std::cerr <<
"read failed in BinaryReader " << e.what();
142 : state(new
State(is))
153 return state->hasNext();
159 return state->failed;
164 return state->read();
BinaryElementReader(std::istream &is)
static size_t blockSize()
BinaryReader(std::istream &is)
bool read(std::vector< T > &data)
boost::iostreams::filtering_streambuf< boost::iostreams::input > filter
bool read_vector(std::vector< T > &data)
std::unique_ptr< std::istream > in
std::unique_ptr< boost::archive::text_iarchive > ia
static void write(std::ostream &, const std::vector< int > &data)