c++boostinput-filter

seekable input filter definition


Using boost, I need a seekable input filter that will operate on bytes read from an ifstream. This is what I currently have:

struct my_filter : boost::iostreams::seekable_filter
{
    template<typename Source>
    int get(Source& src)
    {
        int byte = boost::iostreams::get(src);
        if(byte != EOF && byte != boost::iostreams::WOULD_BLOCK)
        {
            // Do something with byte
        }
        return byte;
    }

    template<typename Sink>
    bool put(Sink&, char)
    {
        // No need to actually implement put because this filter is only used with ifstream
        return true;
    }

    template<typename T>
    std::streampos seek(T& t, boost::iostreams::stream_offset off, std::ios_base::seekdir way, std::ios_base::openmode which = std::ios_base::in | std::ios_base::out)
    {
        return boost::iostreams::seek(t, off, way, which);
    }
};

It works but I would like to get rid of the useless put method. The boost documentation here http://www.boost.org/doc/libs/1_60_0/libs/iostreams/doc/concepts/filter.html says there is an InputSeekableFilter refinement of Filter but I can't seem to understand how to use it (there are no input_seekable_filter_tag or input_seekable_filter structs that I could use).


Solution

  • Answered by llonesmiz on boost-users:

    "boost::iostreams::seekable_filter" seems to just be a typedef for "boost::iostreams::filter<boost::iostreams::seekable>". I don't know for sure, but I think it would make sense that deriving your "struct my_filter" from "boost::iostreams::filter<boost::iostreams::input_seekable>" would accomplish what you want.