#pragma once #if !defined(MIJIN_LOGGING_STREAM_SINK_HPP_INCLUDED) #define MIJIN_LOGGING_STREAM_SINK_HPP_INCLUDED 1 #include "./formatting.hpp" #include "../io/stream.hpp" #include "../util/traits.hpp" namespace mijin { template requires(allocator_type>) class BaseStreamSink : public BaseFormattingLogSink { public: using base_t = BaseFormattingLogSink; using typename base_t::char_t; using typename base_t::allocator_t; using typename base_t::formatter_ptr_t; using typename base_t::message_t; using stream_ptr_t = DynamicPointer; private: stream_ptr_t mStream; int mMinStderrLevel = MIJIN_LOG_LEVEL_VALUE_WARNING; public: explicit BaseStreamSink(not_null_t formatter, allocator_t allocator = {}) MIJIN_NOEXCEPT_IF(std::is_nothrow_move_constructible_v) : base_t(std::move(formatter), std::move(allocator)) {} explicit BaseStreamSink(not_null_t stream, not_null_t formatter, allocator_t allocator = {}) MIJIN_NOEXCEPT_IF(std::is_nothrow_move_constructible_v) : base_t(std::move(formatter), std::move(allocator)), mStream(std::move(stream)) {} void setStream(not_null_t stream) { mStream = std::move(stream).release(); } void handleMessageFormatted(const message_t& /* message */, const char_t* formatted) MIJIN_NOEXCEPT override { if (!mStream) { return; } (void) mStream->writeSpan(std::basic_string_view(formatted)); (void) mStream->write('\n'); mStream->flush(); } }; #define SINK_SET_ARGS(chr_type) chr_type, std::char_traits, TAllocator, TDeleter MIJIN_DEFINE_CHAR_VERSIONS_TMPL(StreamSink, MIJIN_FORMATTING_SINK_COMMON_ARGS, SINK_SET_ARGS) #undef SINK_SET_ARGS } // namespace mijin #endif // !defined(MIJIN_LOGGING_STREAM_SINK_HPP_INCLUDED)