Mercurial > hg > vamp-build-and-test
diff DEPENDENCIES/generic/include/boost/log/sinks/text_multifile_backend.hpp @ 16:2665513ce2d3
Add boost headers
author | Chris Cannam |
---|---|
date | Tue, 05 Aug 2014 11:11:38 +0100 |
parents | |
children | c530137014c0 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/DEPENDENCIES/generic/include/boost/log/sinks/text_multifile_backend.hpp Tue Aug 05 11:11:38 2014 +0100 @@ -0,0 +1,201 @@ +/* + * Copyright Andrey Semashev 2007 - 2013. + * 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 text_multifile_backend.hpp + * \author Andrey Semashev + * \date 09.06.2009 + * + * The header contains implementation of a text multi-file sink backend. + */ + +#ifndef BOOST_LOG_SINKS_TEXT_MULTIFILE_BACKEND_HPP_INCLUDED_ +#define BOOST_LOG_SINKS_TEXT_MULTIFILE_BACKEND_HPP_INCLUDED_ + +#include <ios> +#include <string> +#include <locale> +#include <ostream> +#include <boost/mpl/if.hpp> +#include <boost/mpl/bool.hpp> +#include <boost/type_traits/is_same.hpp> +#include <boost/filesystem/path.hpp> +#include <boost/log/detail/config.hpp> +#include <boost/log/detail/light_function.hpp> +#include <boost/log/detail/cleanup_scope_guard.hpp> +#include <boost/log/sinks/basic_sink_backend.hpp> +#include <boost/log/utility/formatting_ostream.hpp> +#include <boost/log/detail/header.hpp> + +#ifdef BOOST_HAS_PRAGMA_ONCE +#pragma once +#endif + +namespace boost { + +BOOST_LOG_OPEN_NAMESPACE + +namespace sinks { + +namespace file { + + /*! + * An adapter class that allows to use regular formatters as file name generators. + */ + template< typename FormatterT > + class file_name_composer_adapter + { + public: + //! Functor result type + typedef filesystem::path result_type; + //! File name character type + typedef result_type::string_type::value_type native_char_type; + //! The adopted formatter type + typedef FormatterT formatter_type; + //! Formatting stream type + typedef basic_formatting_ostream< native_char_type > stream_type; + + private: + //! The adopted formatter + formatter_type m_Formatter; + //! Formatted file name storage + mutable result_type::string_type m_FileName; + //! Formatting stream + mutable stream_type m_FormattingStream; + + public: + /*! + * Initializing constructor + */ + explicit file_name_composer_adapter(formatter_type const& formatter, std::locale const& loc = std::locale()) : + m_Formatter(formatter), + m_FormattingStream(m_FileName) + { + m_FormattingStream.exceptions(std::ios_base::badbit | std::ios_base::failbit); + m_FormattingStream.imbue(loc); + } + /*! + * Copy constructor + */ + file_name_composer_adapter(file_name_composer_adapter const& that) : + m_Formatter(that.m_Formatter), + m_FormattingStream(m_FileName) + { + m_FormattingStream.exceptions(std::ios_base::badbit | std::ios_base::failbit); + m_FormattingStream.imbue(that.m_FormattingStream.getloc()); + } + /*! + * Assignment + */ + file_name_composer_adapter& operator= (file_name_composer_adapter const& that) + { + m_Formatter = that.m_Formatter; + return *this; + } + + /*! + * The operator generates a file name based on the log record + */ + result_type operator() (record_view const& rec) const + { + boost::log::aux::cleanup_guard< stream_type > cleanup1(m_FormattingStream); + boost::log::aux::cleanup_guard< result_type::string_type > cleanup2(m_FileName); + + m_Formatter(rec, m_FormattingStream); + m_FormattingStream.flush(); + + return result_type(m_FileName); + } + }; + + /*! + * The function adopts a log record formatter into a file name generator + */ + template< typename FormatterT > + inline file_name_composer_adapter< FormatterT > as_file_name_composer( + FormatterT const& fmt, std::locale const& loc = std::locale()) + { + return file_name_composer_adapter< FormatterT >(fmt, loc); + } + +} // namespace file + + +/*! + * \brief An implementation of a text multiple files logging sink backend + * + * The sink backend puts formatted log records to one of the text files. + * The particular file is chosen upon each record's attribute values, which allows + * to distribute records into individual files or to group records related to + * some entity or process in a separate file. + */ +class text_multifile_backend : + public basic_formatted_sink_backend< char > +{ + //! Base type + typedef basic_formatted_sink_backend< char > base_type; + +public: + //! Character type + typedef base_type::char_type char_type; + //! String type to be used as a message text holder + typedef base_type::string_type string_type; + + //! File name composer functor type + typedef boost::log::aux::light_function< filesystem::path (record_view const&) > file_name_composer_type; + +private: + //! \cond + + struct implementation; + implementation* m_pImpl; + + //! \endcond + +public: + /*! + * Default constructor. The constructed sink backend has no file name composer and + * thus will not write any files. + */ + BOOST_LOG_API text_multifile_backend(); + + /*! + * Destructor + */ + BOOST_LOG_API ~text_multifile_backend(); + + /*! + * The method sets file name composer functional object. Log record formatters are accepted, too. + * + * \param composer File name composer functor + */ + template< typename ComposerT > + void set_file_name_composer(ComposerT const& composer) + { + set_file_name_composer_internal(composer); + } + + /*! + * The method writes the message to the sink + */ + BOOST_LOG_API void consume(record_view const& rec, string_type const& formatted_message); + +private: +#ifndef BOOST_LOG_DOXYGEN_PASS + //! The method sets the file name composer + BOOST_LOG_API void set_file_name_composer_internal(file_name_composer_type const& composer); +#endif // BOOST_LOG_DOXYGEN_PASS +}; + +} // namespace sinks + +BOOST_LOG_CLOSE_NAMESPACE // namespace log + +} // namespace boost + +#include <boost/log/detail/footer.hpp> + +#endif // BOOST_LOG_SINKS_TEXT_MULTIFILE_BACKEND_HPP_INCLUDED_