Boost logo

Boost Users :

Subject: [Boost-users] [iostreams] changing char_type of bzip2_compressor
From: Matthias Vallentin (vallentin_at_[hidden])
Date: 2010-10-15 00:47:09


I am having trouble with typedef'ing a custom bzip2_compressor that
works with unsigned char instead of plain char. This is the pipeline:

    typedef boost::uint8_t uint8

    typedef boost::iostreams::filtering_stream<
        boost::iostreams::input, uint8> filtering_istream;

    typedef boost::iostreams::filtering_stream<
        boost::iostreams::output, uint8> filtering_ostream;

    typedef boost::iostreams::basic_bzip2_compressor<
        std::allocator<uint8>> bzip2_compressor;

    // FIXME: The bzip2_compressor as defined above does not fit in
    // the pipeline, what is the correct way to typedef it?
    std::vector<uint8> raw;
    auto range = boost::make_iterator_range(start, end); // args of type uint8*.
    filtering_istream in(range);
    filtering_ostream out;
-> out.push(bzip2_compressor());
    out.push(boost::iostreams::back_inserter(raw));
    boost::iostreams::copy(in, out);

The line with the arrow causes the following errors below, presumable
due to an incorrect typedef of the basic_bzip2_compressor. I could not
find the correct way to typedef it by crawling through the bzip2.hpp
header file of the iostreams library. Any ideas? I am using g++ 4.6 with
-std=gnu++0x for C++0x support.

   Matthias

Error subset:

[..]
../boost/iostreams/chain.hpp:258: error: no matching function for call to 'std::list<boost::iostreams::detail::linked_streambuf<unsigned char, std::char_traits<unsigned char> >*, std::allocator<boost::iostreams::detail::linked_streambuf<unsigned char, std::char_traits<unsigned char> >*> >::push_back(std::auto_ptr<boost::iostreams::stream_buffer<boost::iostreams::basic_bzip2_compressor<std::allocator<unsigned char> >, std::char_traits<unsigned char>, std::allocator<unsigned char>, boost::iostreams::output> >::element_type*)'
[..]
/opt/local/include/gcc46/c++/bits/streambuf.tcc:89: error: invalid conversion from 'std::basic_streambuf<char, std::char_traits<unsigned char> >::char_type*' to '__gnu_cxx::char_traits<unsigned char>::char_type*' [-fpermissive]
/opt/local/include/gcc46/c++/bits/char_traits.h:188: error: initializing argument 1 of 'static __gnu_cxx::char_traits<_CharT>::char_type* __gnu_cxx::char_traits<_CharT>::copy(__gnu_cxx::char_traits<_CharT>::char_type*, const char_type*, std::size_t) [with _CharT = unsigned char, __gnu_cxx::char_traits<_CharT>::char_type = unsigned char, std::size_t = long unsigned int]' [-fpermissive]
/opt/local/include/gcc46/c++/bits/streambuf.tcc:89: error: invalid conversion from 'const char_type*' to 'const char_type*' [-fpermissive]
/opt/local/include/gcc46/c++/bits/char_traits.h:188: error: initializing argument 2 of 'static __gnu_cxx::char_traits<_CharT>::char_type* __gnu_cxx::char_traits<_CharT>::copy(__gnu_cxx::char_traits<_CharT>::char_type*, const char_type*, std::size_t) [with _CharT = unsigned char, __gnu_cxx::char_traits<_CharT>::char_type = unsigned char, std::size_t = long unsigned int]' [-fpermissive]
/opt/local/include/gcc46/c++/bits/streambuf.tcc: In member function 'std::streamsize std::basic_streambuf<_CharT, _Traits>::xsgetn(std::basic_streambuf<_CharT, _Traits>::char_type*, std::streamsize) [with _CharT = char, _Traits = std::char_traits<unsigned char>, std::streamsize = long int, std::basic_streambuf<_CharT, _Traits>::char_type = char]':
[..]
.._client.cc:170: instantiated from here
/opt/local/include/gcc46/c++/bits/streambuf.tcc:55: error: invalid conversion from 'std::basic_streambuf<char, std::char_traits<unsigned char> >::char_type*' to '__gnu_cxx::char_traits<unsigned char>::char_type*' [-fpermissive]
/opt/local/include/gcc46/c++/bits/char_traits.h:188: error: initializing argument 1 of 'static __gnu_cxx::char_traits<_CharT>::char_type* __gnu_cxx::char_traits<_CharT>::copy(__gnu_cxx::char_traits<_CharT>::char_type*, const char_type*, std::size_t) [with _CharT = unsigned char, __gnu_cxx::char_traits<_CharT>::char_type = unsigned char, std::size_t = long unsigned int]' [-fpermissive]
/opt/local/include/gcc46/c++/bits/streambuf.tcc:55: error: invalid conversion from 'std::basic_streambuf<char, std::char_traits<unsigned char> >::char_type*' to 'const char_type*' [-fpermissive]
/opt/local/include/gcc46/c++/bits/char_traits.h:188: error: initializing argument 2 of 'static __gnu_cxx::char_traits<_CharT>::char_type* __gnu_cxx::char_traits<_CharT>::copy(__gnu_cxx::char_traits<_CharT>::char_type*, const char_type*, std::size_t) [with _CharT = unsigned char, __gnu_cxx::char_traits<_CharT>::char_type = unsigned char, std::size_t = long unsigned int]' [-fpermissive]


Boost-users list run by williamkempf at hotmail.com, kalb at libertysoft.com, bjorn.karlsson at readsoft.com, gregod at cs.rpi.edu, wekempf at cox.net