27 #if !defined(SEQAN3_HAS_BZIP2) && !defined(SEQAN3_HEADER_TEST)
28 #error "This file cannot be used when building without BZIP2-support."
31 #if defined(SEQAN3_HAS_BZIP2)
36 namespace seqan3::contrib
43 const size_t BZ2_OUTPUT_DEFAULT_BUFFER_SIZE = 4096;
47 typename Tr = std::char_traits<Elem>,
48 typename ElemA = std::allocator<Elem>,
49 typename ByteT = char,
50 typename ByteAT = std::allocator<ByteT>
52 class basic_bz2_ostreambuf :
53 public std::basic_streambuf<Elem, Tr>
56 typedef std::basic_streambuf< Elem, Tr > basic_streambuf_type;
57 typedef std::basic_ostream<Elem, Tr>& ostream_reference;
58 typedef ElemA char_allocator_type;
59 typedef ByteT byte_type;
60 typedef ByteAT byte_allocator_type;
61 typedef byte_type* byte_buffer_type;
62 typedef typename Tr::char_type char_type;
63 typedef typename Tr::int_type int_type;
64 typedef std::vector<byte_type, byte_allocator_type > byte_vector_type;
65 typedef std::vector<char_type, char_allocator_type > char_vector_type;
67 using basic_streambuf_type::epptr;
68 using basic_streambuf_type::pbase;
69 using basic_streambuf_type::pptr;
72 ostream_reference ostream_,
73 size_t block_size_100k_ ,
79 ~basic_bz2_ostreambuf();
82 int_type overflow (int_type c);
84 std::streamsize flush(
int flush_mode);
87 uint64_t get_in_size()
const
89 return ((uint64_t)m_bzip2_stream.total_in_hi32 << 32)
90 + m_bzip2_stream.total_in_lo32;
92 uint64_t get_out_size()
const
94 return ((uint64_t)m_bzip2_stream.total_out_hi32 << 32)
95 + m_bzip2_stream.total_out_lo32;
98 bool bzip2_to_stream( char_type*, std::streamsize);
99 size_t fill_input_buffer();
101 ostream_reference m_ostream;
102 bz_stream m_bzip2_stream;
104 byte_vector_type m_output_buffer;
105 char_vector_type m_buffer;
119 basic_bz2_ostreambuf<
120 Elem,Tr,ElemA,ByteT,ByteAT
121 >:: basic_bz2_ostreambuf(
122 ostream_reference ostream_,
123 size_t block_size_100k_,
130 m_output_buffer(buffer_size_,0),
131 m_buffer(buffer_size_,0)
133 m_bzip2_stream.bzalloc=NULL;
134 m_bzip2_stream.bzfree=NULL;
136 m_bzip2_stream.next_in=NULL;
137 m_bzip2_stream.avail_in=0;
138 m_bzip2_stream.avail_out=0;
139 m_bzip2_stream.next_out=NULL;
141 m_err=BZ2_bzCompressInit(
143 std::min( 9,
static_cast<int>(block_size_100k_) ),
144 std::min( 4,
static_cast<int>(verbosity_) ),
145 std::min( 250,
static_cast<int>(work_factor_) )
148 this->setp( &(m_buffer[0]), &(m_buffer[m_buffer.size()-1]));
158 basic_bz2_ostreambuf<
159 Elem,Tr,ElemA,ByteT,ByteAT
160 >::~basic_bz2_ostreambuf()
164 m_err=BZ2_bzCompressEnd(&m_bzip2_stream);
174 int basic_bz2_ostreambuf<
175 Elem,Tr,ElemA,ByteT,ByteAT
178 if ( this->pptr() && this->pptr() > this->pbase())
180 int c = overflow( EOF);
196 typename basic_bz2_ostreambuf<
197 Elem,Tr,ElemA,ByteT,ByteAT
199 basic_bz2_ostreambuf<
200 Elem,Tr,ElemA,ByteT,ByteAT
202 typename basic_bz2_ostreambuf<
203 Elem,Tr,ElemA,ByteT,ByteAT
207 int w =
static_cast<int>(this->pptr() - this->pbase());
212 if ( bzip2_to_stream( this->pbase(), w)) {
213 this->setp( this->pbase(), this->epptr());
226 bool basic_bz2_ostreambuf<
227 Elem,Tr,ElemA,ByteT,ByteAT
229 typename basic_bz2_ostreambuf<
230 Elem,Tr,ElemA,ByteT,ByteAT
232 std::streamsize buffer_size_
235 std::streamsize written_byte_size=0, total_written_byte_size = 0;
237 m_bzip2_stream.next_in=(byte_buffer_type)buffer_;
238 m_bzip2_stream.avail_in=buffer_size_*
sizeof(
char_type);
239 m_bzip2_stream.avail_out=
static_cast<unsigned int>(m_output_buffer.size());
240 m_bzip2_stream.next_out=&(m_output_buffer[0]);
245 m_err = BZ2_bzCompress (&m_bzip2_stream, BZ_RUN );
247 if (m_err == BZ_RUN_OK || m_err == BZ_STREAM_END)
249 written_byte_size=
static_cast<std::streamsize
>(m_output_buffer.size()) - m_bzip2_stream.avail_out;
250 total_written_byte_size+=written_byte_size;
253 (
const char_type*) &(m_output_buffer[0]),
254 static_cast<std::streamsize
>( written_byte_size/
sizeof(
char_type) )
258 if ( (remainder = written_byte_size%
sizeof(
char_type))!=0)
262 &(m_output_buffer[0]),
263 &(m_output_buffer[written_byte_size-remainder]),
268 m_bzip2_stream.avail_out=
static_cast<unsigned int>(m_output_buffer.size()-remainder);
269 m_bzip2_stream.next_out=&m_output_buffer[remainder];
272 while (m_bzip2_stream.avail_in != 0 && m_err == BZ_RUN_OK);
274 return m_err == BZ_RUN_OK || m_err == BZ_FLUSH_OK;
284 std::streamsize basic_bz2_ostreambuf<
285 Elem,Tr,ElemA,ByteT,ByteAT
286 >::flush(
int flush_mode)
288 std::streamsize written_byte_size=0, total_written_byte_size=0;
290 int const buffer_size =
static_cast< int >( pptr() - pbase() );
292 m_bzip2_stream.next_in=(byte_buffer_type)pbase();
293 m_bzip2_stream.avail_in=
static_cast< unsigned int >(buffer_size*
sizeof(
char_type));
294 m_bzip2_stream.avail_out=
static_cast< unsigned int >(m_output_buffer.size());
295 m_bzip2_stream.next_out=&(m_output_buffer[0]);
300 m_err = BZ2_bzCompress (&m_bzip2_stream, flush_mode);
301 if (m_err == BZ_FINISH_OK || m_err == BZ_STREAM_END)
304 static_cast<std::streamsize
>(m_output_buffer.size())
305 - m_bzip2_stream.avail_out;
306 total_written_byte_size+=written_byte_size;
309 (
const char_type*) &(m_output_buffer[0]),
310 static_cast<std::streamsize
>( written_byte_size/
sizeof(
char_type)*
sizeof(char) )
314 if ( (remainder = written_byte_size%
sizeof(
char_type))!=0)
318 &(m_output_buffer[0]),
319 &(m_output_buffer[written_byte_size-remainder]),
324 m_bzip2_stream.avail_out=
static_cast<unsigned int>(m_output_buffer.size()-remainder);
325 m_bzip2_stream.next_out=&(m_output_buffer[remainder]);
327 }
while (m_err == BZ_FINISH_OK);
331 return total_written_byte_size;
340 typename Tr = std::char_traits<Elem>,
341 typename ElemA = std::allocator<Elem>,
342 typename ByteT = char,
343 typename ByteAT = std::allocator<ByteT>
345 class basic_bz2_ostreambase :
virtual public std::basic_ios<Elem,Tr>
348 typedef std::basic_ostream<Elem, Tr>& ostream_reference;
349 typedef basic_bz2_ostreambuf<
350 Elem,Tr,ElemA,ByteT,ByteAT> bzip2_streambuf_type;
352 basic_bz2_ostreambase(
353 ostream_reference ostream_,
354 size_t block_size_100k_ ,
359 : m_buf(ostream_,block_size_100k_, verbosity_, work_factor_, buffer_size_)
364 bzip2_streambuf_type* rdbuf() {
return &m_buf; };
367 bzip2_streambuf_type m_buf;
376 typename Tr = std::char_traits<Elem>,
377 typename ElemA = std::allocator<Elem>,
378 typename ByteT = char,
379 typename ByteAT = std::allocator<ByteT>
381 class basic_bz2_ostream :
382 public basic_bz2_ostreambase<Elem,Tr,ElemA,ByteT,ByteAT>,
383 public std::basic_ostream<Elem,Tr>
386 typedef basic_bz2_ostreambase<
387 Elem,Tr,ElemA,ByteT,ByteAT> bzip2_ostreambase_type;
388 typedef std::basic_ostream<Elem,Tr> ostream_type;
389 typedef ostream_type& ostream_reference;
392 ostream_reference ostream_,
393 size_t block_size_100k_ = 9,
394 size_t verbosity_ = 0,
395 size_t work_factor_ = 30,
396 size_t buffer_size_ = BZ2_OUTPUT_DEFAULT_BUFFER_SIZE
399 bzip2_ostreambase_type(ostream_,block_size_100k_, verbosity_, work_factor_,buffer_size_),
400 ostream_type(bzip2_ostreambase_type::rdbuf())
405 basic_bz2_ostream& add_header();
406 basic_bz2_ostream& zflush()
408 this->flush(); this->rdbuf()->flush();
return *
this;
413 void _Add_vtordisp1() { }
414 void _Add_vtordisp2() { }
422 typedef basic_bz2_ostream<char> bz2_ostream;
423 typedef basic_bz2_ostream<wchar_t> bz2_wostream;
Adaptations of algorithms from the Ranges TS.
typename stream::int_type int_type
Declares the associated int type.
typename stream::char_type char_type
Declares the associated char type.