From 46e00067db2b6bde9549d356a5aa9d7d15fac658 Mon Sep 17 00:00:00 2001 From: Benichou Date: Thu, 26 Jan 2017 12:05:23 +0100 Subject: [PATCH] Fixed previous commit some bad files was previously commited --- include/spdlog/details/logger_impl.h | 1 + include/spdlog/details/stream_impl.h | 46 ++++++++++++++++ include/spdlog/stream.h | 82 +++++++++++++++++++++++----- 3 files changed, 115 insertions(+), 14 deletions(-) diff --git a/include/spdlog/details/logger_impl.h b/include/spdlog/details/logger_impl.h index 2de9d6d3..f5a733c3 100644 --- a/include/spdlog/details/logger_impl.h +++ b/include/spdlog/details/logger_impl.h @@ -200,6 +200,7 @@ inline void spdlog::logger::critical(const T& msg) inline spdlog::ostream spdlog::logger::log(level::level_enum lvl) { if (!should_log(lvl)) + return ostream(); return ostream(this, lvl); } diff --git a/include/spdlog/details/stream_impl.h b/include/spdlog/details/stream_impl.h index 23661e32..35bb2135 100644 --- a/include/spdlog/details/stream_impl.h +++ b/include/spdlog/details/stream_impl.h @@ -7,23 +7,69 @@ template spdlog::basic_streambuf::basic_streambuf(spdlog::logger* plogger, spdlog::level::level_enum lvl) : + m_plogger(plogger), + m_log_msg(nullptr, lvl) { + if (m_plogger) + { + const std::string& name = m_plogger->name(); + m_log_msg.logger_name = &name; + } } template spdlog::basic_streambuf::basic_streambuf(basic_streambuf&& rhs) : + m_plogger(std::move(rhs.m_plogger)), + m_log_msg(nullptr, rhs.m_log_msg.level) { + if (m_plogger) + { + m_log_msg.logger_name = std::move(rhs.m_log_msg.logger_name); + m_log_msg.time = std::move(rhs.m_log_msg.time); + m_log_msg.thread_id = std::move(rhs.m_log_msg.thread_id); + m_log_msg.raw = std::move(rhs.m_log_msg.raw); + m_log_msg.formatted = std::move(rhs.m_log_msg.formatted); + } } template spdlog::basic_streambuf::~basic_streambuf() { + if (!m_plogger) + return; + try + { + m_plogger->_sink_it(m_log_msg); + } + catch (const std::exception &ex) + { + m_plogger->error_handler()(ex.what()); + } + catch (...) + { + m_plogger->error_handler()("Unknown exception"); + } } template std::streamsize spdlog::basic_streambuf::xsputn(const char_type* __s, std::streamsize __n) { + if (!m_plogger) + return 0; + try + { + m_log_msg.raw << fmt::BasicStringRef(__s, __n); + } + catch (const std::exception &ex) + { + m_plogger->error_handler()(ex.what()); + } + catch (...) + { + m_plogger->error_handler()("Unknown exception"); + } + return __n; } diff --git a/include/spdlog/stream.h b/include/spdlog/stream.h index dc1f5179..dd5bce21 100644 --- a/include/spdlog/stream.h +++ b/include/spdlog/stream.h @@ -9,18 +9,72 @@ namespace spdlog { - - - - - - - - - - - - - - + class logger; + + template > + class basic_streambuf : public std::basic_streambuf + { + public: + typedef std::basic_streambuf _Mysb; + typedef CharT char_type; + typedef Traits traits_type; + typedef typename Traits::int_type int_type; + typedef typename Traits::pos_type pos_type; + typedef typename Traits::off_type off_type; + + basic_streambuf(logger* plogger, level::level_enum lvl); + basic_streambuf(basic_streambuf&& rhs); + virtual ~basic_streambuf(); + + basic_streambuf(const basic_streambuf&) = delete; + basic_streambuf& operator=(const basic_streambuf&) = delete; + basic_streambuf& operator=(basic_streambuf&&) = delete; + + protected: + virtual std::streamsize xsputn(const char_type* __s, std::streamsize __n) override; + + private: + logger* m_plogger; + details::log_msg m_log_msg; + }; + + template > + class basic_ostream : public std::basic_ostream < CharT, Traits > + { + public: + typedef std::basic_ostream _Mybase; + typedef CharT char_type; + typedef Traits traits_type; + typedef typename Traits::int_type int_type; + typedef typename Traits::pos_type pos_type; + typedef typename Traits::off_type off_type; + + basic_ostream() : _Mybase(&m_rdbuf), m_rdbuf(nullptr, level::critical) {} + basic_ostream(spdlog::logger* plogger, level::level_enum lvl) : _Mybase(&m_rdbuf), m_rdbuf(plogger, lvl) {} + basic_ostream(basic_ostream&& rhs_stream) : _Mybase(&m_rdbuf), m_rdbuf(std::move(rhs_stream.m_rdbuf)) {} + virtual ~basic_ostream() = default; + + basic_ostream(const basic_ostream&) = delete; + basic_ostream& operator=(const basic_ostream&) = delete; + + basic_ostream& operator=(basic_ostream&& rhs_stream) { swap(rhs_stream); return *this; } + + basic_streambuf* rdbuf() const + { + basic_streambuf* pBuf = _Mybase::rdbuf(); + if (!pBuf) + return const_cast*>(&m_rdbuf); + + return reinterpret_cast*>(pBuf); + } + + private: + basic_streambuf m_rdbuf; + }; + + typedef basic_streambuf streambuf; + typedef basic_streambuf wstreambuf; + + typedef basic_ostream ostream; + typedef basic_ostream wostream; }