It can be confusing to maintain two separate filters — one for input and the other for output — to implement the same filtering algorithm. One way to avoid this is to use the filter helpers mentioned above. The filter helpers produce filters which can be used for either input or output, but not both simultaneously. Such filters are called Dual-Use Filters.
A Dual-Use Filter can be produced by merging the implementations of an InputFilter and an OutputFilter, and giving the resulting class a category convertible to dual_use_filter_tag
. For example, you can implement a shell comments Filter as a Dual-Use Filter as follows:
#include <boost/iostreams/char_traits.hpp> // EOF, WOULD_BLOCK #include <boost/iostreams/concepts.hpp> // input_filter #include <boost/iostreams/operations.hpp> // get namespace boost { namespace iostreams { namespace example { class shell_comments_input_filter : public dual_use_filter { public: explicit shell_comments_input_filter(char comment_char = '#') : comment_char_(comment_char), skip_(false) { } template<typename Source> int get(Source& src) { /* same as shell_comments_input_filter::get() */ } template<typename Sink> bool put(Sink& dest, int c) { /* same as shell_comments_output_filter::put() */ } template<typename Device> void close(Device&, std::ios_base::openmode) { skip_ = false; } private: char comment_char_; bool skip_; }; } } } // End namespace boost::iostreams:example
When a filtering stream or stream buffer containing a Closable Dual-Use Filter is closed, the Filter's member function close
is called with one of the values std::ios_base::in
or std::ios_base::out
as the second function argument, indicating whether the Filter was used for input or output.
© Copyright 2008 CodeRage, LLC
© Copyright 2004-2007 Jonathan Turkanis
Use, modification, and distribution are subject to the Boost Software License, Version 2.0. (See accompanying file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)