summaryrefslogtreecommitdiff
path: root/boost/log/expressions/formatters/format.hpp
diff options
context:
space:
mode:
Diffstat (limited to 'boost/log/expressions/formatters/format.hpp')
-rw-r--r--boost/log/expressions/formatters/format.hpp128
1 files changed, 128 insertions, 0 deletions
diff --git a/boost/log/expressions/formatters/format.hpp b/boost/log/expressions/formatters/format.hpp
new file mode 100644
index 0000000000..c5d7917453
--- /dev/null
+++ b/boost/log/expressions/formatters/format.hpp
@@ -0,0 +1,128 @@
+/*
+ * 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 <string>
+#include <boost/mpl/bool.hpp>
+#include <boost/phoenix/core/actor.hpp>
+#include <boost/phoenix/core/terminal_fwd.hpp>
+#include <boost/phoenix/core/is_nullary.hpp>
+#include <boost/phoenix/core/environment.hpp>
+#include <boost/fusion/sequence/intrinsic/at_c.hpp>
+#include <boost/log/detail/config.hpp>
+#include <boost/log/detail/format.hpp>
+#include <boost/log/detail/custom_terminal_spec.hpp>
+#include <boost/log/detail/header.hpp>
+
+#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 <boost/log/detail/footer.hpp>
+
+#endif // BOOST_LOG_EXPRESSIONS_FORMATTERS_FORMAT_HPP_INCLUDED_