Chris@16: /* Chris@101: * Copyright Andrey Semashev 2007 - 2015. Chris@16: * Distributed under the Boost Software License, Version 1.0. Chris@16: * (See accompanying file LICENSE_1_0.txt or copy at Chris@16: * http://www.boost.org/LICENSE_1_0.txt) Chris@16: */ Chris@16: /*! Chris@16: * \file attribute_output_terminal.hpp Chris@16: * \author Andrey Semashev Chris@16: * \date 06.11.2012 Chris@16: * Chris@16: * The header contains implementation of a generic output manipulator in template expressions. Chris@16: */ Chris@16: Chris@16: #ifndef BOOST_LOG_DETAIL_ATTR_OUTPUT_TERMINAL_HPP_INCLUDED_ Chris@16: #define BOOST_LOG_DETAIL_ATTR_OUTPUT_TERMINAL_HPP_INCLUDED_ Chris@16: Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: Chris@16: #ifdef BOOST_HAS_PRAGMA_ONCE Chris@16: #pragma once Chris@16: #endif Chris@16: Chris@16: namespace boost { Chris@16: Chris@16: BOOST_LOG_OPEN_NAMESPACE Chris@16: Chris@16: namespace expressions { Chris@16: Chris@16: namespace aux { Chris@16: Chris@16: //! Attribute stream output expression Chris@16: template< typename LeftT, typename T, typename FallbackPolicyT, typename ImplT > Chris@16: class attribute_output_terminal Chris@16: { Chris@16: private: Chris@16: //! Self type Chris@16: typedef attribute_output_terminal< LeftT, T, FallbackPolicyT, ImplT > this_type; Chris@16: //! Attribute value visitor invoker Chris@16: typedef value_visitor_invoker< T, FallbackPolicyT > visitor_invoker_type; Chris@16: //! Manipulator implementation Chris@16: typedef ImplT impl_type; Chris@16: Chris@16: public: Chris@16: //! Internal typedef for type categorization Chris@16: typedef void _is_boost_log_terminal; Chris@16: Chris@16: //! Result type definition Chris@16: template< typename > Chris@16: struct result; Chris@16: Chris@101: template< typename ThisT, typename ContextT > Chris@101: struct result< ThisT(ContextT) > Chris@16: { Chris@16: typedef typename remove_cv< typename remove_reference< ContextT >::type >::type context_type; Chris@16: typedef typename phoenix::evaluator::impl< Chris@16: typename LeftT::proto_base_expr&, Chris@16: context_type, Chris@16: phoenix::unused Chris@16: >::result_type type; Chris@16: }; Chris@16: Chris@16: private: Chris@16: //! Left argument actor Chris@16: LeftT m_left; Chris@16: //! Attribute name Chris@16: const attribute_name m_name; Chris@16: //! Attribute value visitor invoker Chris@16: visitor_invoker_type m_visitor_invoker; Chris@16: //! Manipulator implementation Chris@16: impl_type m_impl; Chris@16: Chris@16: public: Chris@16: //! Initializing constructor Chris@16: attribute_output_terminal(LeftT const& left, attribute_name const& name) : m_left(left), m_name(name) Chris@16: { Chris@16: } Chris@16: Chris@16: //! Initializing constructor Chris@16: attribute_output_terminal(LeftT const& left, attribute_name const& name, impl_type const& impl) : m_left(left), m_name(name), m_impl(impl) Chris@16: { Chris@16: } Chris@16: Chris@16: //! Initializing constructor Chris@16: template< typename U > Chris@16: attribute_output_terminal(LeftT const& left, attribute_name const& name, impl_type const& impl, U const& arg) : Chris@16: m_left(left), m_name(name), m_visitor_invoker(arg), m_impl(impl) Chris@16: { Chris@16: } Chris@16: Chris@16: //! Copy constructor Chris@16: attribute_output_terminal(attribute_output_terminal const& that) : Chris@16: m_left(that.m_left), m_name(that.m_name), m_visitor_invoker(that.m_visitor_invoker), m_impl(that.m_impl) Chris@16: { Chris@16: } Chris@16: Chris@16: //! Invokation operator Chris@16: template< typename ContextT > Chris@16: typename result< this_type(ContextT const&) >::type operator() (ContextT const& ctx) Chris@16: { Chris@16: typedef typename result< this_type(ContextT const&) >::type result_type; Chris@16: result_type strm = phoenix::eval(m_left, ctx); Chris@16: m_visitor_invoker(m_name, fusion::at_c< 0 >(phoenix::env(ctx).args()), binder1st< impl_type&, result_type >(m_impl, strm)); Chris@16: return strm; Chris@16: } Chris@16: Chris@16: //! Invokation operator Chris@16: template< typename ContextT > Chris@16: typename result< const this_type(ContextT const&) >::type operator() (ContextT const& ctx) const Chris@16: { Chris@16: typedef typename result< const this_type(ContextT const&) >::type result_type; Chris@16: result_type strm = phoenix::eval(m_left, ctx); Chris@16: m_visitor_invoker(m_name, fusion::at_c< 0 >(phoenix::env(ctx).args()), binder1st< impl_type const&, result_type >(m_impl, strm)); Chris@16: return strm; Chris@16: } Chris@16: Chris@16: BOOST_DELETED_FUNCTION(attribute_output_terminal()) Chris@16: }; Chris@16: Chris@16: } // namespace aux Chris@16: Chris@16: } // namespace expressions Chris@16: Chris@16: BOOST_LOG_CLOSE_NAMESPACE // namespace log Chris@16: Chris@16: #ifndef BOOST_LOG_DOXYGEN_PASS Chris@16: Chris@16: namespace phoenix { Chris@16: Chris@16: namespace result_of { Chris@16: Chris@16: template< typename LeftT, typename T, typename FallbackPolicyT, typename ImplT > Chris@16: struct is_nullary< custom_terminal< boost::log::expressions::aux::attribute_output_terminal< LeftT, T, FallbackPolicyT, ImplT > > > : Chris@16: public mpl::false_ Chris@16: { Chris@16: }; Chris@16: Chris@16: } // namespace result_of Chris@16: Chris@16: } // namespace phoenix Chris@16: Chris@16: #endif // !defined(BOOST_LOG_DOXYGEN_PASS) Chris@16: Chris@16: } // namespace boost Chris@16: Chris@16: #include Chris@16: Chris@16: #endif // BOOST_LOG_DETAIL_ATTR_OUTPUT_TERMINAL_HPP_INCLUDED_