Chris@16: // (C) Copyright 2008 CodeRage, LLC (turkanis at coderage dot com) Chris@16: // (C) Copyright 2003-2007 Jonathan Turkanis Chris@16: // Distributed under the Boost Software License, Version 1.0. (See accompanying Chris@16: // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt.) Chris@16: Chris@16: // See http://www.boost.org/libs/iostreams for documentation. Chris@16: Chris@16: #ifndef BOOST_IOSTREAMS_PIPABLE_HPP_INCLUDED Chris@16: #define BOOST_IOSTREAMS_PIPABLE_HPP_INCLUDED Chris@16: Chris@16: #if defined(_MSC_VER) && (_MSC_VER >= 1020) Chris@16: # pragma once Chris@16: #endif Chris@16: Chris@16: #include // BOOST_MSVC. Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: #if BOOST_WORKAROUND(BOOST_MSVC, < 1300) Chris@16: # include Chris@16: #endif Chris@16: Chris@16: #define BOOST_IOSTREAMS_PIPABLE(filter, arity) \ Chris@16: template< BOOST_PP_ENUM_PARAMS(arity, typename T) \ Chris@16: BOOST_PP_COMMA_IF(arity) typename Component> \ Chris@16: ::boost::iostreams::pipeline< \ Chris@16: ::boost::iostreams::detail::pipeline_segment< \ Chris@16: filter BOOST_IOSTREAMS_TEMPLATE_ARGS(arity, T) \ Chris@16: >, \ Chris@16: Component \ Chris@16: > operator|( const filter BOOST_IOSTREAMS_TEMPLATE_ARGS(arity, T)& f, \ Chris@16: const Component& c ) \ Chris@16: { \ Chris@16: typedef ::boost::iostreams::detail::pipeline_segment< \ Chris@16: filter BOOST_IOSTREAMS_TEMPLATE_ARGS(arity, T) \ Chris@16: > segment; \ Chris@16: return ::boost::iostreams::pipeline \ Chris@16: (segment(f), c); \ Chris@16: } \ Chris@16: /**/ Chris@16: Chris@16: namespace boost { namespace iostreams { Chris@16: Chris@16: template Chris@16: struct pipeline; Chris@16: Chris@16: namespace detail { Chris@16: Chris@16: #if BOOST_WORKAROUND(BOOST_MSVC, <= 1300) Chris@16: struct pipeline_base { }; Chris@16: Chris@16: template Chris@16: struct is_pipeline Chris@16: : is_base_and_derived Chris@16: { }; Chris@16: #endif Chris@16: #if BOOST_WORKAROUND(__BORLANDC__, < 0x600) Chris@16: template Chris@16: struct is_pipeline : mpl::false_ { }; Chris@16: Chris@16: template Chris@16: struct is_pipeline< pipeline > : mpl::true_ { }; Chris@16: #endif Chris@16: Chris@16: template Chris@16: class pipeline_segment Chris@16: #if BOOST_WORKAROUND(BOOST_MSVC, <= 1300) Chris@16: : pipeline_base Chris@16: #endif Chris@16: { Chris@16: public: Chris@16: pipeline_segment(const Component& component) Chris@16: : component_(component) Chris@16: { } Chris@16: template Chris@16: void for_each(Fn fn) const { fn(component_); } Chris@16: template Chris@16: void push(Chain& chn) const { chn.push(component_); } Chris@16: private: Chris@16: pipeline_segment operator=(const pipeline_segment&); Chris@16: const Component& component_; Chris@16: }; Chris@16: Chris@16: } // End namespace detail. Chris@16: Chris@16: //------------------Definition of Pipeline------------------------------------// Chris@16: Chris@16: template Chris@16: struct pipeline : Pipeline { Chris@16: typedef Pipeline pipeline_type; Chris@16: typedef Component component_type; Chris@16: pipeline(const Pipeline& p, const Component& component) Chris@16: : Pipeline(p), component_(component) Chris@16: { } Chris@16: template Chris@16: void for_each(Fn fn) const Chris@16: { Chris@16: Pipeline::for_each(fn); Chris@16: fn(component_); Chris@16: } Chris@16: template Chris@16: void push(Chain& chn) const Chris@16: { Chris@16: Pipeline::push(chn); Chris@16: chn.push(component_); Chris@16: } Chris@16: const Pipeline& tail() const { return *this; } Chris@16: const Component& head() const { return component_; } Chris@16: private: Chris@16: pipeline operator=(const pipeline&); Chris@16: const Component& component_; Chris@16: }; Chris@16: Chris@16: template Chris@16: pipeline, Component> Chris@16: operator|(const pipeline& p, const Component& cmp) Chris@16: { Chris@16: BOOST_STATIC_ASSERT(is_filter::value); Chris@16: return pipeline, Component>(p, cmp); Chris@16: } Chris@16: Chris@16: } } // End namespaces iostreams, boost. Chris@16: Chris@16: #endif // #ifndef BOOST_IOSTREAMS_PIPABLE_HPP_INCLUDED