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,
43 write(std::ostream& os,
const std::vector<int>& data)
45 write_vector(os, data);
48 write(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 boost::scoped_ptr<std::istream>
in;
69 boost::scoped_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));
83 return (*ia) >> data, *in;
91 return state->read_vector(data);
108 explicit State(std::istream& is) : reader(is), cur(0), failed(!is)
114 return cur < data.size();
119 throw std::logic_error(
"no data in BinaryReader::read");
124 if (cur < data.size())
129 failed = ! reader.read(data);
130 }
catch (boost::archive::archive_exception& e) {
132 std::cerr <<
"read failed in BinaryReader " << e.what();
141 : state(new
State(is))
152 return state->hasNext();
158 return state->failed;
163 return state->read();