/* * Copyright Andrey Semashev 2007 - 2014. * 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) */ /*! * \file formatters/format.hpp * \author Andrey Semashev * \date 15.11.2012 * * The header contains a generic log record formatter function. */ #ifndef BOOST_LOG_EXPRESSIONS_FORMATTERS_FORMAT_HPP_INCLUDED_ #define BOOST_LOG_EXPRESSIONS_FORMATTERS_FORMAT_HPP_INCLUDED_ #include #include #include #include #include #include #include #include #include #include #include #ifdef BOOST_HAS_PRAGMA_ONCE #pragma once #endif namespace boost { BOOST_LOG_OPEN_NAMESPACE namespace expressions { /*! * \brief Template expressions terminal node with Boost.Format-like formatter */ template< typename CharT > class format_terminal { public: //! Internal typedef for type categorization typedef void _is_boost_log_terminal; //! Character type typedef CharT char_type; //! Boost.Format formatter type typedef boost::log::aux::basic_format< char_type > format_type; //! String type typedef std::basic_string< char_type > string_type; //! Terminal result type typedef typename format_type::pump result_type; private: //! Formatter object mutable format_type m_format; public: //! Initializing constructor explicit format_terminal(const char_type* format) : m_format(format) {} //! Invokation operator template< typename ContextT > result_type operator() (ContextT const& ctx) const { return m_format.make_pump(fusion::at_c< 1 >(phoenix::env(ctx).args())); } BOOST_DELETED_FUNCTION(format_terminal()) }; /*! * The function generates a terminal node in a template expression. The node will perform log record formatting * according to the provided format string. */ template< typename CharT > BOOST_FORCEINLINE phoenix::actor< format_terminal< CharT > > format(const CharT* fmt) { typedef format_terminal< CharT > terminal_type; phoenix::actor< terminal_type > act = {{ terminal_type(fmt) }}; return act; } /*! * The function generates a terminal node in a template expression. The node will perform log record formatting * according to the provided format string. */ template< typename CharT, typename TraitsT, typename AllocatorT > BOOST_FORCEINLINE phoenix::actor< format_terminal< CharT > > format(std::basic_string< CharT, TraitsT, AllocatorT > const& fmt) { typedef format_terminal< CharT > terminal_type; phoenix::actor< terminal_type > act = {{ terminal_type(fmt.c_str()) }}; return act; } } // namespace expressions BOOST_LOG_CLOSE_NAMESPACE // namespace log #ifndef BOOST_LOG_DOXYGEN_PASS namespace phoenix { namespace result_of { template< typename CharT > struct is_nullary< custom_terminal< boost::log::expressions::format_terminal< CharT > > > : public mpl::false_ { }; } // namespace result_of } // namespace phoenix #endif } // namespace boost #include #endif // BOOST_LOG_EXPRESSIONS_FORMATTERS_FORMAT_HPP_INCLUDED_