#ifndef DECODER_H #define DECODER_H #include #include #include #include #include class DecoderBase { friend class DecoderFilter; protected: typedef boost::function ReadFunc; virtual size_t decode(ReadFunc read, uint8_t *output, size_t output_size) = 0; public: typedef boost::shared_ptr p; virtual ~DecoderBase() {} }; //! Input filter to hold a decoder in a filter chain. class DecoderFilter : public boost::iostreams::multichar_input_filter { private: DecoderBase::p decoder; //! Functor binding a source to a read function. template struct ReadFunc { T& s; ReadFunc(T& s_) : s(s_) {} std::size_t operator()(char* buf, std::size_t buf_size) { return boost::iostreams::read(s, buf, buf_size); } }; public: typedef boost::shared_ptr p; DecoderFilter(DecoderBase::p decoder_); template std::streamsize read(Source& src, char *s, std::streamsize n) { return decoder->decode(ReadFunc(src), (uint8_t*)s, n); } }; namespace decoder { void init(); DecoderFilter::p get_decoder(const std::string& name); }; #endif