28 #include <boost/algorithm/string/join.hpp>
29 #include <boost/assign/list_of.hpp>
30 #include <boost/bimap.hpp>
31 #include <boost/iostreams/copy.hpp>
32 #include <boost/iostreams/filter/bzip2.hpp>
33 #include <boost/iostreams/filter/gzip.hpp>
34 #include <boost/iostreams/filtering_streambuf.hpp>
35 #include <boost/range/adaptor/map.hpp>
36 #include <boost/range/algorithm/copy.hpp>
45 using char_iterator = std::vector<char>::iterator;
46 using uint8_iterator = std::vector<uint8_t>::iterator;
48 explicit OutputStream(Logger logger) : logger_(logger) {}
50 virtual std::string make_default_filename(
const std::string& default_filename) = 0;
51 virtual bool open_stream() = 0;
52 virtual void write(
const char* s, std::streamsize count) = 0;
53 virtual void close_stream() = 0;
59 template <
typename... TSerializerArgs>
64 : write_function_(write_function), instance_(instance) {}
66 virtual std::string make_default_filename(
const std::string& default_filename) = 0;
67 virtual void start_array() = 0;
68 virtual void serialize(TSerializerArgs... args) = 0;
69 virtual void end_array() = 0;
72 void write(
const std::string& str) { (instance_->*write_function_)(str.c_str(), str.length()); }
73 void write(
const std::vector<uint8_t>& data) {
74 (instance_->*write_function_)((
const char*)data.data(), data.size());
76 void (
OutputStream::*write_function_)(
const char*, std::streamsize);
79 template <
typename TSerializer,
typename TOutputStream>
80 friend class GndTruthSerializerImpl;
85 using OutputStream::OutputStream;
87 bool open_stream()
final {
return false; }
90 virtual bool open_file(
const std::string& filename,
const std::string& default_filename);
92 void write(
const char* s, std::streamsize count)
override { ofs_.write(s, count); }
93 void close_stream()
override;
101 using BasicFileOutputStream::BasicFileOutputStream;
103 std::string make_default_filename(
const std::string& default_filename)
override {
104 return default_filename;
115 bool open_file(
const std::string& filename,
const std::string& default_filename)
override;
117 void write(
const char* s, std::streamsize count)
override { out_.write(s, count); }
118 void close_stream()
override;
121 virtual void configure_filter() = 0;
124 boost::iostreams::filtering_streambuf<boost::iostreams::output> filter_;
130 using FilteringOutputStream::FilteringOutputStream;
132 std::string make_default_filename(
const std::string& default_filename)
override {
133 return default_filename +
".zip";
137 void configure_filter()
override {
138 filter_.push(boost::iostreams::gzip_compressor(
139 boost::iostreams::gzip_params(boost::iostreams::gzip::best_compression)));
145 using FilteringOutputStream::FilteringOutputStream;
147 std::string make_default_filename(
const std::string& default_filename)
override {
148 return default_filename +
".gz";
152 void configure_filter()
override {
153 filter_.push(boost::iostreams::gzip_compressor(
154 boost::iostreams::gzip_params(boost::iostreams::gzip::best_compression)));
160 using FilteringOutputStream::FilteringOutputStream;
162 std::string make_default_filename(
const std::string& default_filename)
override {
163 return default_filename +
".bz2";
167 void configure_filter()
override {
168 filter_.push(boost::iostreams::bzip2_compressor(
169 boost::iostreams::bzip2_params(boost::iostreams::bzip2::default_block_size)));
174 template <
typename TSerializer,
typename TOutputStream,
typename... TSerializerArgs>
178 : outputstream_(logger)
179 , serializer_((
void (
OutputStream::*)(
const char*, std::streamsize)) & TOutputStream::write,
184 virtual bool open_file(
const std::string& filename,
const std::string& default_filename) {
185 return outputstream_.open_file(filename, default_filename);
188 virtual void serialize(TSerializerArgs... args) { serializer_.serialize(args...); }
189 virtual void close_file() { outputstream_.close_stream(); }
192 TOutputStream outputstream_;
193 TSerializer serializer_;
197 template <
typename TSerializer,
typename TOutputStream,
typename... TSerializerArgs>
199 :
public FileSerializer<TSerializer, TOutputStream, TSerializerArgs...> {
206 bool open_file(
const std::string& filename,
const std::string& default_filename)
override {
207 bool ok = base::open_file(filename, default_filename);
214 void close_file()
override {
220 virtual void on_file_opened() = 0;
221 virtual void on_file_closing() = 0;
Definition: output_serializer.hpp:83
Definition: output_serializer.hpp:158
Definition: output_serializer.hpp:99
FileSerializer composes a TSerializer with a TOutputStream.
Definition: output_serializer.hpp:175
Definition: output_serializer.hpp:108
Definition: output_serializer.hpp:143
Definition: output_serializer.hpp:43
SequentialFileSerializer is a FileSerializer for sequences of objects of the same type.
Definition: output_serializer.hpp:199
Definition: output_serializer.hpp:60
Definition: output_serializer.hpp:128