1 /* 2 * Copyright Andrey Semashev 2007 - 2015. 3 * Distributed under the Boost Software License, Version 1.0. 4 * (See accompanying file LICENSE_1_0.txt or copy at 5 * http://www.boost.org/LICENSE_1_0.txt) 6 */ 7 /*! 8 * \file attr_output_impl.hpp 9 * \author Andrey Semashev 10 * \date 12.08.2012 11 * 12 * \brief This header is the Boost.Log library implementation, see the library documentation 13 * at http://www.boost.org/doc/libs/release/libs/log/doc/html/index.html. 14 */ 15 16 #ifndef BOOST_LOG_DETAIL_ATTR_OUTPUT_IMPL_HPP_INCLUDED_ 17 #define BOOST_LOG_DETAIL_ATTR_OUTPUT_IMPL_HPP_INCLUDED_ 18 19 #include <boost/mpl/is_sequence.hpp> 20 #include <boost/phoenix/core/actor.hpp> 21 #include <boost/log/detail/config.hpp> 22 #include <boost/log/expressions/attr.hpp> 23 #include <boost/log/utility/functional/bind_to_log.hpp> 24 #include <boost/log/detail/attr_output_terminal.hpp> 25 #include <boost/log/detail/header.hpp> 26 27 #ifdef BOOST_HAS_PRAGMA_ONCE 28 #pragma once 29 #endif 30 31 namespace boost { 32 33 BOOST_LOG_OPEN_NAMESPACE 34 35 namespace expressions { 36 37 namespace aux { 38 39 template< typename LeftT, typename T, typename FallbackPolicyT, typename TagT > 40 struct make_output_expression 41 { 42 //! Resulting expression 43 typedef attribute_output_terminal< LeftT, T, FallbackPolicyT, to_log_fun< TagT > > type; 44 45 //! Creates the output expression 46 template< typename RightT > makeboost::expressions::aux::make_output_expression47 static BOOST_FORCEINLINE type make(LeftT const& left, RightT const& right) 48 { 49 return type(left, right.get_name(), to_log_fun< TagT >(), right.get_fallback_policy()); 50 } 51 }; 52 53 template< typename LeftT, typename RightT, typename ValueT = typename RightT::value_type, bool IsSequenceV = mpl::is_sequence< ValueT >::value > 54 struct make_output_actor; 55 56 template< template< typename > class ActorT, typename LeftExprT, typename RightT, typename ValueT > 57 struct make_output_actor< ActorT< LeftExprT >, RightT, ValueT, false > 58 { 59 typedef make_output_expression< 60 ActorT< LeftExprT >, 61 ValueT, 62 typename RightT::fallback_policy, 63 typename RightT::tag_type 64 > make_expression; 65 66 typedef ActorT< typename make_expression::type > type; 67 makeboost::expressions::aux::make_output_actor68 static BOOST_FORCEINLINE type make(ActorT< LeftExprT > const& left, RightT const& right) 69 { 70 type res = {{ make_expression::make(left, right) }}; 71 return res; 72 } 73 }; 74 75 template< template< typename > class ActorT, typename LeftExprT, typename RightT, typename ValueT > 76 struct make_output_actor< ActorT< LeftExprT >, RightT, ValueT, true > 77 { 78 typedef attribute_output_terminal< ActorT< LeftExprT >, ValueT, typename RightT::fallback_policy, to_log_fun< typename RightT::tag_type > > expression_type; 79 80 typedef ActorT< expression_type > type; 81 makeboost::expressions::aux::make_output_actor82 static BOOST_FORCEINLINE type make(ActorT< LeftExprT > const& left, RightT const& right) 83 { 84 type res = {{ expression_type(left, right.get_name(), to_log_fun< typename RightT::tag_type >(), right.get_fallback_policy()) }}; 85 return res; 86 } 87 }; 88 89 } // namespace aux 90 91 #define BOOST_LOG_AUX_OVERLOAD(left_ref, right_ref)\ 92 template< typename LeftExprT, typename T, typename FallbackPolicyT, typename TagT >\ 93 BOOST_FORCEINLINE typename aux::make_output_actor< phoenix::actor< LeftExprT >, attribute_actor< T, FallbackPolicyT, TagT, phoenix::actor > >::type\ 94 operator<< (phoenix::actor< LeftExprT > left_ref left, attribute_actor< T, FallbackPolicyT, TagT, phoenix::actor > right_ref right)\ 95 {\ 96 return aux::make_output_actor< phoenix::actor< LeftExprT >, attribute_actor< T, FallbackPolicyT, TagT, phoenix::actor > >::make(left, right);\ 97 } 98 99 #include <boost/log/detail/generate_overloads.hpp> 100 101 #undef BOOST_LOG_AUX_OVERLOAD 102 103 } // namespace expressions 104 105 BOOST_LOG_CLOSE_NAMESPACE // namespace log 106 107 } // namespace boost 108 109 #include <boost/log/detail/footer.hpp> 110 111 #endif // BOOST_LOG_DETAIL_ATTR_OUTPUT_IMPL_HPP_INCLUDED_ 112