22 #ifndef SHORE_STREAMS_TRANSPOSE_HPP__
23 #define SHORE_STREAMS_TRANSPOSE_HPP__
29 #include <boost/iostreams/concepts.hpp>
30 #include <boost/iostreams/traits.hpp>
38 class block_transposition
42 typedef shore::stream_slicer::slice slice;
47 std::vector<const char *> m_lines;
54 block_transposition(
const block_transposition &other);
55 block_transposition &operator=(
const block_transposition &other);
59 block_transposition();
60 ~block_transposition();
62 void transpose(
const slice &s,
const bool change_first_line);
64 const slice ¤t()
const;
67 class output_transposer
73 block_transposition m_blktr;
74 block_transposition::slice m_slice;
78 output_transposer(
const output_transposer &other);
79 output_transposer &operator=(
const output_transposer &other);
83 output_transposer(std::ostream &os,
const size_t bs);
86 std::streamsize write(
const char* s,std::streamsize n);
90 class transposing_sink
91 :
public boost::iostreams::sink
95 output_transposer *m_otr;
99 transposing_sink(output_transposer *
const otr);
101 std::streamsize write(
const char* s,std::streamsize n);
105 class transposing_ostream
106 :
public boost::iostreams::stream<transposing_sink>
110 output_transposer m_otr;
114 transposing_ostream(std::ostream *os,
const size_t bs);
115 ~transposing_ostream();
118 class input_backtransposer
123 int64_t m_streamsize;
124 bool m_is_transposed;
128 block_transposition m_blktr;
136 shore::stream_slicer::slice m_slice;
139 input_backtransposer(
const input_backtransposer &other);
140 input_backtransposer &operator=(
const input_backtransposer &other);
144 input_backtransposer(std::istream &in,int64_t stream_size=-1);
145 ~input_backtransposer();
147 std::streamsize read(
char* s,std::streamsize n);
149 std::streampos seek(boost::iostreams::stream_offset off,
150 std::ios_base::seekdir way);
152 int64_t stream_size()
const;
155 class backtransposing_source
156 :
public boost::iostreams::device<boost::iostreams::input_seekable>
160 input_backtransposer *m_ibt;
164 backtransposing_source(input_backtransposer *
const ibt);
166 std::streamsize read(
char* s,std::streamsize n);
168 std::streampos seek(boost::iostreams::stream_offset off,
169 std::ios_base::seekdir way);
172 class backtransposing_istream
173 :
public boost::iostreams::stream<backtransposing_source>
177 input_backtransposer m_ibt;
181 backtransposing_istream(std::istream* is,
const int64_t streamsize=-1);
182 ~backtransposing_istream();
184 int64_t stream_size()
const;
189 #endif // SHORE_STREAMS_TRANSPOSE_HPP__