22 #ifndef SEQAN3_HAS_BZIP2
23 #error "This file cannot be used when building without BZIP2-support."
34 namespace seqan3::contrib
41 const size_t BZ2_INPUT_DEFAULT_BUFFER_SIZE = 4096;
47 typename ByteT = char,
50 class basic_bz2_istreambuf :
55 typedef ElemA char_allocator_type;
56 typedef ByteT byte_type;
57 typedef ByteAT byte_allocator_type;
58 typedef byte_type* byte_buffer_type;
59 typedef typename Tr::char_type char_type;
60 typedef typename Tr::int_type int_type;
65 istream_reference istream_,
68 size_t read_buffer_size_,
69 size_t input_buffer_size_
72 ~basic_bz2_istreambuf();
76 istream_reference get_istream() {
return m_istream;};
77 bz_stream& get_bzip2_stream() {
return m_bzip2_stream;};
78 int get_zerr()
const {
return m_err;};
81 void put_back_from_bzip2_stream();
82 size_t fill_input_buffer();
84 istream_reference m_istream;
85 bz_stream m_bzip2_stream;
87 byte_vector_type m_input_buffer;
88 char_vector_type m_buffer;
102 basic_bz2_istreambuf<
103 Elem,Tr,ElemA,ByteT,ByteAT
104 >::basic_bz2_istreambuf(
105 istream_reference istream_,
108 size_t read_buffer_size_,
109 size_t input_buffer_size_
113 m_input_buffer(input_buffer_size_),
114 m_buffer(read_buffer_size_)
117 m_bzip2_stream.bzalloc=NULL;
118 m_bzip2_stream.bzfree=NULL;
120 m_bzip2_stream.next_in=NULL;
121 m_bzip2_stream.avail_in=0;
122 m_bzip2_stream.avail_out=0;
123 m_bzip2_stream.next_out=NULL;
126 m_err=BZ2_bzDecompressInit (
128 std::min(4,
static_cast<int>(verbosity_)),
129 static_cast<int>(small_)
145 size_t basic_bz2_istreambuf<
146 Elem,Tr,ElemA,ByteT,ByteAT
147 >::fill_input_buffer()
149 m_bzip2_stream.next_in=&(m_input_buffer[0]);
154 return m_bzip2_stream.avail_in=m_istream.gcount()*
sizeof(
char_type);
164 void basic_bz2_istreambuf<
165 Elem,Tr,ElemA,ByteT,ByteAT
166 >::put_back_from_bzip2_stream()
168 if (m_bzip2_stream.avail_in==0)
171 m_istream.clear( std::ios::goodbit );
173 -
static_cast<int>(m_bzip2_stream.avail_in),
177 m_bzip2_stream.avail_in=0;
188 basic_bz2_istreambuf<
189 Elem,Tr,ElemA,ByteT,ByteAT
190 >::~basic_bz2_istreambuf()
192 BZ2_bzDecompressEnd(&m_bzip2_stream);
202 typename basic_bz2_istreambuf<
203 Elem,Tr,ElemA,ByteT,ByteAT
205 basic_bz2_istreambuf<
206 Elem,Tr,ElemA,ByteT,ByteAT
209 if ( this->gptr() && ( this->gptr() < this->egptr()))
210 return *
reinterpret_cast<unsigned char *
>( this->gptr());
212 int n_putback =
static_cast<int>(this->gptr() - this->eback());
216 &(m_buffer[0]) + (4 - n_putback),
217 this->gptr() - n_putback,
221 int num = unbzip2_from_stream(
230 &(m_buffer[0]) + (4 - n_putback),
232 &(m_buffer[0]) + 4 + num);
235 return*
reinterpret_cast<unsigned char *
>( this->gptr());
247 Elem,Tr,ElemA,ByteT,ByteAT
248 >::unbzip2_from_stream(
253 m_bzip2_stream.next_out=(byte_buffer_type)buffer_;
254 m_bzip2_stream.avail_out=buffer_size_*
sizeof(
char_type);
255 size_t count =m_bzip2_stream.avail_in;
259 if (m_bzip2_stream.avail_in==0)
260 count=fill_input_buffer();
262 if (m_bzip2_stream.avail_in)
264 m_err = BZ2_bzDecompress( &m_bzip2_stream );
266 }
while (m_err==BZ_OK && m_bzip2_stream.avail_out != 0 &&
count != 0);
268 if (m_err == BZ_STREAM_END)
269 put_back_from_bzip2_stream();
271 return buffer_size_ - m_bzip2_stream.avail_out/
sizeof(
char_type);
282 typename ByteT = char,
285 class basic_bz2_istreambase :
virtual public std::basic_ios<Elem,Tr>
289 typedef basic_bz2_istreambuf<
290 Elem,Tr,ElemA,ByteT,ByteAT> unbzip2_streambuf_type;
292 basic_bz2_istreambase(
293 istream_reference ostream_,
296 size_t read_buffer_size_,
297 size_t input_buffer_size_
310 unbzip2_streambuf_type*
rdbuf() {
return &m_buf; };
313 unbzip2_streambuf_type m_buf;
324 typename ByteT = char,
327 class basic_bz2_istream :
328 public basic_bz2_istreambase<Elem,Tr,ElemA,ByteT,ByteAT>,
332 typedef basic_bz2_istreambase<
333 Elem,Tr,ElemA,ByteT,ByteAT> bzip2_istreambase_type;
335 typedef istream_type& istream_reference;
336 typedef unsigned char byte_type;
339 istream_reference istream_,
340 size_t verbosity_ = 0,
342 size_t read_buffer_size_ = BZ2_INPUT_DEFAULT_BUFFER_SIZE,
343 size_t input_buffer_size_ = BZ2_INPUT_DEFAULT_BUFFER_SIZE
346 bzip2_istreambase_type(istream_,verbosity_, small_, read_buffer_size_, input_buffer_size_),
347 istream_type(bzip2_istreambase_type::rdbuf())
351 void _Add_vtordisp1() { }
352 void _Add_vtordisp2() { }
360 typedef basic_bz2_istream<char> bz2_istream;
361 typedef basic_bz2_istream<wchar_t> bz2_wistream;