I am trying to use a zlib_decompressor
to decompress data through an istreambuf_iterator
. I couldn't find an in built way to use an input iterator as input to a stream (please point out a way if one exists already) so I wrote this source:
template <class cha_type, class iterator_type>
class IteratorSource {
public:
typedef cha_type char_type;
typedef boost::iostreams::source_tag category;
iterator_type& i;
iterator_type eof;
IteratorSource(iterator_type& it, iterator_type end) : i(it), eof(end) {
}
std::streamsize read(char* s, std::streamsize n) {
for(int j = 0; j < n; j++) {
if(i == eof) {
std::cout << "Reached eof after " << j << " bytes\n";
return -1;
}
char next = *i++;
std::cout << "Reading " << next << "\n";
*s++ = next;
}
return n;
}
};
And used it like this:
int main() {
std::vector<char> data_back = {'\x78', '\x9c', '\x73', '\x04', '\x00', '\x00', '\x42', '\x00', '\x42'};
auto start = data_back.begin();
IteratorSource<char, decltype(data_back)::iterator> data(start, data_back.end());
boost::iostreams::filtering_istreambuf def;
def.push(boost::iostreams::zlib_decompressor());
def.push(data);
boost::iostreams::copy(def, std::cout);
return 0;
}
To give this output:
Reading x
Reading �
Reading s
Reading
Reading
Reading
Reading B
Reading
Reading B
Reached eof after 9 bytes
terminate called after throwing an instance of 'boost::exception_detail::clone_impl<boost::exception_detail::error_info_injector<boost::iostreams::zlib_error> >'
what(): zlib error
Aborted (core dumped)
I am not sure why this is producing an error because loading from a file works fine.