#ifndef ENCODER_H #define ENCODER_H #include #include #include #include #include #include class EncoderBase { friend class EncoderFilter; protected: typedef boost::function ReadFunc; virtual size_t encode(ReadFunc read, uint8_t *output, size_t output_size) = 0; public: typedef boost::shared_ptr p; virtual ~EncoderBase() {} }; //! Input filter to hold an encoder in a filter chain. class EncoderFilter : public boost::iostreams::multichar_input_filter { private: EncoderBase::p encoder; //! 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; EncoderFilter(EncoderBase::p encoder_); template std::streamsize read(Source& src, char *s, std::streamsize n) { return encoder->encode(ReadFunc(src), (uint8_t*)s, n); }; }; namespace encoder { void init(); EncoderFilter::p get_encoder(const std::string& name); }; #endif