summaryrefslogtreecommitdiff
path: root/boost/log/utility/setup/console.hpp
diff options
context:
space:
mode:
Diffstat (limited to 'boost/log/utility/setup/console.hpp')
-rw-r--r--boost/log/utility/setup/console.hpp243
1 files changed, 243 insertions, 0 deletions
diff --git a/boost/log/utility/setup/console.hpp b/boost/log/utility/setup/console.hpp
new file mode 100644
index 0000000000..fadde4e9b6
--- /dev/null
+++ b/boost/log/utility/setup/console.hpp
@@ -0,0 +1,243 @@
+/*
+ * 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 console.hpp
+ * \author Andrey Semashev
+ * \date 16.05.2008
+ *
+ * The header contains implementation of convenience functions for enabling logging to console.
+ */
+
+#ifndef BOOST_LOG_UTILITY_SETUP_CONSOLE_HPP_INCLUDED_
+#define BOOST_LOG_UTILITY_SETUP_CONSOLE_HPP_INCLUDED_
+
+#include <iostream>
+#include <boost/smart_ptr/shared_ptr.hpp>
+#include <boost/smart_ptr/make_shared_object.hpp>
+#include <boost/core/null_deleter.hpp>
+#include <boost/log/detail/config.hpp>
+#include <boost/log/detail/sink_init_helpers.hpp>
+#ifndef BOOST_LOG_NO_THREADS
+#include <boost/log/sinks/sync_frontend.hpp>
+#else
+#include <boost/log/sinks/unlocked_frontend.hpp>
+#endif
+#include <boost/log/sinks/text_ostream_backend.hpp>
+#include <boost/log/keywords/format.hpp>
+#include <boost/log/keywords/filter.hpp>
+#include <boost/log/keywords/auto_flush.hpp>
+#include <boost/log/detail/header.hpp>
+
+#ifdef BOOST_HAS_PRAGMA_ONCE
+#pragma once
+#endif
+
+
+#ifndef BOOST_LOG_DOXYGEN_PASS
+#ifndef BOOST_LOG_NO_THREADS
+#define BOOST_LOG_CONSOLE_SINK_FRONTEND_INTERNAL sinks::synchronous_sink
+#else
+#define BOOST_LOG_CONSOLE_SINK_FRONTEND_INTERNAL sinks::unlocked_sink
+#endif
+#endif // BOOST_LOG_DOXYGEN_PASS
+
+namespace boost {
+
+BOOST_LOG_OPEN_NAMESPACE
+
+namespace aux {
+
+// The function creates and initializes the sink
+template< typename CharT, typename ArgsT >
+shared_ptr<
+ BOOST_LOG_CONSOLE_SINK_FRONTEND_INTERNAL<
+ sinks::basic_text_ostream_backend< CharT >
+ >
+> add_console_log(std::basic_ostream< CharT >& strm, ArgsT const& args)
+{
+ shared_ptr< std::basic_ostream< CharT > > pStream(&strm, boost::null_deleter());
+
+ typedef sinks::basic_text_ostream_backend< CharT > backend_t;
+ shared_ptr< backend_t > pBackend = boost::make_shared< backend_t >();
+
+ pBackend->add_stream(pStream);
+ pBackend->auto_flush(args[keywords::auto_flush | false]);
+
+ typedef BOOST_LOG_CONSOLE_SINK_FRONTEND_INTERNAL< backend_t > sink_t;
+ shared_ptr< sink_t > pSink = boost::make_shared< sink_t >(pBackend);
+
+ aux::setup_filter(*pSink, args,
+ typename is_void< typename parameter::binding< ArgsT, keywords::tag::filter, void >::type >::type());
+
+ aux::setup_formatter(*pSink, args,
+ typename is_void< typename parameter::binding< ArgsT, keywords::tag::format, void >::type >::type());
+
+ core::get()->add_sink(pSink);
+
+ return pSink;
+}
+
+template< typename CharT >
+struct default_console_stream;
+
+#ifdef BOOST_LOG_USE_CHAR
+template< >
+struct default_console_stream< char >
+{
+ static std::ostream& get() { return std::clog; }
+};
+#endif // BOOST_LOG_USE_CHAR
+
+#ifdef BOOST_LOG_USE_WCHAR_T
+template< >
+struct default_console_stream< wchar_t >
+{
+ static std::wostream& get() { return std::wclog; }
+};
+#endif // BOOST_LOG_USE_WCHAR_T
+
+} // namespace aux
+
+#ifndef BOOST_LOG_DOXYGEN_PASS
+
+template< typename CharT >
+inline shared_ptr<
+ BOOST_LOG_CONSOLE_SINK_FRONTEND_INTERNAL<
+ sinks::basic_text_ostream_backend< CharT >
+ >
+> add_console_log()
+{
+ return aux::add_console_log(
+ aux::default_console_stream< CharT >::get(), keywords::auto_flush = false);
+}
+
+
+template< typename CharT >
+inline shared_ptr<
+ BOOST_LOG_CONSOLE_SINK_FRONTEND_INTERNAL<
+ sinks::basic_text_ostream_backend< CharT >
+ >
+> add_console_log(std::basic_ostream< CharT >& strm)
+{
+ return aux::add_console_log(strm, keywords::auto_flush = false);
+}
+
+template< typename CharT, typename ArgT1 >
+inline shared_ptr<
+ BOOST_LOG_CONSOLE_SINK_FRONTEND_INTERNAL<
+ sinks::basic_text_ostream_backend< CharT >
+ >
+> add_console_log(std::basic_ostream< CharT >& strm, ArgT1 const& arg1)
+{
+ return aux::add_console_log(strm, arg1);
+}
+
+template< typename CharT, typename ArgT1, typename ArgT2 >
+inline shared_ptr<
+ BOOST_LOG_CONSOLE_SINK_FRONTEND_INTERNAL<
+ sinks::basic_text_ostream_backend< CharT >
+ >
+> add_console_log(std::basic_ostream< CharT >& strm, ArgT1 const& arg1, ArgT2 const& arg2)
+{
+ return aux::add_console_log(strm, (arg1, arg2));
+}
+
+template< typename CharT, typename ArgT1, typename ArgT2, typename ArgT3 >
+inline shared_ptr<
+ BOOST_LOG_CONSOLE_SINK_FRONTEND_INTERNAL<
+ sinks::basic_text_ostream_backend< CharT >
+ >
+> add_console_log(std::basic_ostream< CharT >& strm, ArgT1 const& arg1, ArgT2 const& arg2, ArgT3 const& arg3)
+{
+ return aux::add_console_log(strm, (arg1, arg2, arg3));
+}
+
+#else // BOOST_LOG_DOXYGEN_PASS
+
+/*!
+ * The function constructs sink for the specified console stream and adds it to the core
+ *
+ * \param strm One of the standard console streams: <tt>std::cout</tt>, <tt>std::cerr</tt> or <tt>std::clog</tt>
+ * (or the corresponding wide-character analogues).
+ * \param args Optional additional named arguments for the sink initialization. The following arguments are supported:
+ * \li \c filter Specifies a filter to install into the sink. May be a string that represents a filter,
+ * or a filter lambda expression.
+ * \li \c format Specifies a formatter to install into the sink. May be a string that represents a formatter,
+ * or a formatter lambda expression (either streaming or Boost.Format-like notation).
+ * \li \c auto_flush A boolean flag that shows whether the sink should automatically flush the stream
+ * after each written record.
+ * \return Pointer to the constructed sink.
+ */
+template< typename CharT, typename... ArgsT >
+shared_ptr<
+ BOOST_LOG_CONSOLE_SINK_FRONTEND_INTERNAL<
+ sinks::basic_text_ostream_backend< CharT >
+ >
+> add_console_log(std::basic_ostream< CharT >& strm, ArgsT... const& args);
+
+/*!
+ * Equivalent to: <tt>add_console_log(std::clog);</tt> or <tt>add_console_log(std::wclog);</tt>,
+ * depending on the \c CharT type.
+ *
+ * \overload
+ */
+template< typename CharT, typename... ArgsT >
+shared_ptr<
+ BOOST_LOG_CONSOLE_SINK_FRONTEND_INTERNAL<
+ sinks::basic_text_ostream_backend< CharT >
+ >
+> add_console_log(ArgsT... const& args);
+
+#endif // BOOST_LOG_DOXYGEN_PASS
+
+#ifdef BOOST_LOG_USE_CHAR
+
+/*!
+ * The function constructs sink for the <tt>std::clog</tt> stream and adds it to the core
+ *
+ * \overload
+ *
+ * \return Pointer to the constructed sink.
+ */
+inline shared_ptr<
+ BOOST_LOG_CONSOLE_SINK_FRONTEND_INTERNAL<
+ sinks::text_ostream_backend
+ >
+> add_console_log()
+{
+ return add_console_log(std::clog);
+}
+
+#endif // BOOST_LOG_USE_CHAR
+
+#ifdef BOOST_LOG_USE_WCHAR_T
+
+/*!
+ * The function constructs sink for the <tt>std::wclog</tt> stream and adds it to the core
+ *
+ * \return Pointer to the constructed sink.
+ */
+inline shared_ptr<
+ BOOST_LOG_CONSOLE_SINK_FRONTEND_INTERNAL<
+ sinks::wtext_ostream_backend
+ >
+> wadd_console_log()
+{
+ return add_console_log(std::wclog);
+}
+
+#endif // BOOST_LOG_USE_WCHAR_T
+
+BOOST_LOG_CLOSE_NAMESPACE // namespace log
+
+} // namespace boost
+
+#undef BOOST_LOG_CONSOLE_SINK_FRONTEND_INTERNAL
+
+#include <boost/log/detail/footer.hpp>
+
+#endif // BOOST_LOG_UTILITY_SETUP_CONSOLE_HPP_INCLUDED_