blob: 458619017bf945581860118d2a92d6cf5ddb5a6b [file] [log] [blame]
/*
* Copyright Andrey Semashev 2007 - 2015.
* 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_ostream_backend.cpp
* \author Andrey Semashev
* \date 19.04.2007
*
* \brief This header is the Boost.Log library implementation, see the library documentation
* at http://www.boost.org/doc/libs/release/libs/log/doc/html/index.html.
*/
#include <vector>
#include <algorithm>
#include <boost/log/sinks/text_ostream_backend.hpp>
#include <boost/log/detail/header.hpp>
namespace boost {
BOOST_LOG_OPEN_NAMESPACE
namespace sinks {
//! Sink implementation
template< typename CharT >
struct basic_text_ostream_backend< CharT >::implementation
{
//! Type of the container that holds all aggregated streams
typedef std::vector< shared_ptr< stream_type > > ostream_sequence;
//! Output stream list
ostream_sequence m_Streams;
//! Auto-flush flag
bool m_fAutoFlush;
implementation() : m_fAutoFlush(false)
{
}
};
//! Constructor
template< typename CharT >
BOOST_LOG_API basic_text_ostream_backend< CharT >::basic_text_ostream_backend() : m_pImpl(new implementation())
{
}
//! Destructor (just to make it link from the shared library)
template< typename CharT >
BOOST_LOG_API basic_text_ostream_backend< CharT >::~basic_text_ostream_backend()
{
delete m_pImpl;
}
//! The method adds a new stream to the sink
template< typename CharT >
BOOST_LOG_API void basic_text_ostream_backend< CharT >::add_stream(shared_ptr< stream_type > const& strm)
{
typename implementation::ostream_sequence::iterator it =
std::find(m_pImpl->m_Streams.begin(), m_pImpl->m_Streams.end(), strm);
if (it == m_pImpl->m_Streams.end())
{
m_pImpl->m_Streams.push_back(strm);
}
}
//! The method removes a stream from the sink
template< typename CharT >
BOOST_LOG_API void basic_text_ostream_backend< CharT >::remove_stream(shared_ptr< stream_type > const& strm)
{
typename implementation::ostream_sequence::iterator it =
std::find(m_pImpl->m_Streams.begin(), m_pImpl->m_Streams.end(), strm);
if (it != m_pImpl->m_Streams.end())
m_pImpl->m_Streams.erase(it);
}
//! Sets the flag to automatically flush buffers after each logged line
template< typename CharT >
BOOST_LOG_API void basic_text_ostream_backend< CharT >::auto_flush(bool f)
{
m_pImpl->m_fAutoFlush = f;
}
//! The method writes the message to the sink
template< typename CharT >
BOOST_LOG_API void basic_text_ostream_backend< CharT >::consume(record_view const&, string_type const& message)
{
typename string_type::const_pointer const p = message.data();
typename string_type::size_type const s = message.size();
typename implementation::ostream_sequence::const_iterator
it = m_pImpl->m_Streams.begin(), end = m_pImpl->m_Streams.end();
for (; it != end; ++it)
{
stream_type* const strm = it->get();
if (strm->good())
{
strm->write(p, static_cast< std::streamsize >(s));
strm->put(static_cast< char_type >('\n'));
if (m_pImpl->m_fAutoFlush)
strm->flush();
}
}
}
//! The method flushes the associated streams
template< typename CharT >
BOOST_LOG_API void basic_text_ostream_backend< CharT >::flush()
{
typename implementation::ostream_sequence::const_iterator
it = m_pImpl->m_Streams.begin(), end = m_pImpl->m_Streams.end();
for (; it != end; ++it)
{
stream_type* const strm = it->get();
if (strm->good())
strm->flush();
}
}
//! Explicitly instantiate sink backend implementation
#ifdef BOOST_LOG_USE_CHAR
template class basic_text_ostream_backend< char >;
#endif
#ifdef BOOST_LOG_USE_WCHAR_T
template class basic_text_ostream_backend< wchar_t >;
#endif
} // namespace sinks
BOOST_LOG_CLOSE_NAMESPACE // namespace log
} // namespace boost
#include <boost/log/detail/footer.hpp>