From 7a8f07016cdb8cc300cafe3ce83ffb4fd0c44504 Mon Sep 17 00:00:00 2001 From: Jonathan Turkanis Date: Fri, 20 May 2005 05:50:40 +0000 Subject: [PATCH] moved from directory filter [SVN r29096] --- include/boost/iostreams/tee.hpp | 158 ++++++++++++++++++++++++++++++++ 1 file changed, 158 insertions(+) create mode 100755 include/boost/iostreams/tee.hpp diff --git a/include/boost/iostreams/tee.hpp b/include/boost/iostreams/tee.hpp new file mode 100755 index 0000000..855e1a8 --- /dev/null +++ b/include/boost/iostreams/tee.hpp @@ -0,0 +1,158 @@ +// (C) Copyright Jonathan Turkanis 2005. +// Distributed under the Boost Software License, Version 1.0. (See accompanying +// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt.) + +// See http://www.boost.org/libs/iostreams for documentation. + +#ifndef BOOST_IOSTREAMS_TEE_HPP_INCLUDED +#define BOOST_IOSTREAMS_TEE_HPP_INCLUDED + +#if defined(_MSC_VER) && (_MSC_VER >= 1020) +# pragma once +#endif + +#include // BOOST_DEDUCE_TYPENAME. +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +namespace boost { namespace iostreams { + +// +// Template name: tee_filter. +// Template paramters: +// Device - A blocking Sink. +// +template +class tee_filter : public detail::basic_adapter { +public: + typedef typename detail::param_type::type param_type; + typedef typename char_type_of::type char_type; + struct category + : multichar_output_filter_tag, + closable_tag, + flushable_tag, + localizable_tag, + optimally_buffered_tag + { }; + + BOOST_STATIC_ASSERT(( + is_convertible< // Using mode_of causes failures on VC6-7.0. + BOOST_DEDUCED_TYPENAME iostreams::category_of::type, output + >::value + )); + + explicit tee_filter(param_type dev) + : detail::basic_adapter(dev) + { } + + template + std::streamsize write(Sink& snk, const char_type* s, std::streamsize n) + { + std::streamsize result = iostreams::write(snk, s, n); + iostreams::write(this->component(), s, result); + return result; + } + + template + void close( Next&, + BOOST_IOS::openmode which = + BOOST_IOS::in | BOOST_IOS::out ) + { iostreams::close(this->component(), which); } + + template + bool flush(Sink& snk) + { + bool r1 = iostreams::flush(snk); + bool r2 = iostreams::flush(this->component()); + return r1 && r2; + } +}; +BOOST_IOSTREAMS_PIPABLE(tee_filter, 1) + +// +// Template name: tee_device. +// Template paramters: +// Sink1 - A blocking Sink. +// Sink2 - A blocking Sink. +// +template +class tee_device : public detail::basic_adapter { +public: + typedef typename detail::param_type::type param_type1; + typedef typename detail::param_type::type param_type2; + typedef typename detail::param_type::type value_type1; + typedef typename detail::param_type::type value_type2; + typedef typename char_type_of::type char_type; + BOOST_STATIC_ASSERT(( + is_same< + char_type, + BOOST_DEDUCED_TYPENAME char_type_of::type + >::value + )); + BOOST_STATIC_ASSERT(( + is_convertible< // Using mode_of causes failures on VC6-7.0. + BOOST_DEDUCED_TYPENAME iostreams::category_of::type, output + >::value + )); + BOOST_STATIC_ASSERT(( + is_convertible< // Using mode_of causes failures on VC6-7.0. + BOOST_DEDUCED_TYPENAME iostreams::category_of::type, output + >::value + )); + struct category + : output, + closable_tag, + flushable_tag, + localizable_tag, + optimally_buffered_tag + { }; + explicit tee_filter(param_type dev) + : detail::basic_adapter(dev) + { } + std::streamsize write(const char_type* s, std::streamsize n) + { + iostreams::write(sink1_, s, n); + iostreams::write(sink2_, s, n); + return n; + } + void close(BOOST_IOS::openmode which = BOOST_IOS::in | BOOST_IOS::out) + { + external_closer close2(sink2_, which); + external_closer close1(sink1_, which); + } + bool flush() + { + bool r1 = iostreams::flush(sink1_); + bool r2 = iostreams::flush(sink2_); + return r1 && r2; + } + template + void imbue(const Locale& loc) + { + iostreams::imbue(sink1_); + iostreams::imbue(sink2_); + } +private: + value_type1 sink1_; + value_type2 sink2_; +}; + +template +tee_filter tee(const Sink& snk) +{ return tee_filter(snk); } + +template +tee_device tee(const Sink1& sink1, const Sink2& sink2) +{ return tee_device(sink1, sink2); } + +} } // End namespaces iostreams, boost. + +#endif // #ifndef BOOST_IOSTREAMS_TEE_HPP_INCLUDED