72 lines
		
	
	
		
			2.3 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			72 lines
		
	
	
		
			2.3 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
 | 
						|
#pragma once
 | 
						|
 | 
						|
#if !defined(MIJIN_LOGGING_STDIO_SINK_HPP_INCLUDED)
 | 
						|
#define MIJIN_LOGGING_STDIO_SINK_HPP_INCLUDED 1
 | 
						|
 | 
						|
#include "./formatting.hpp"
 | 
						|
#include "../util/traits.hpp"
 | 
						|
 | 
						|
namespace mijin
 | 
						|
{
 | 
						|
template<MIJIN_FORMATTING_SINK_TMPL_ARGS_INIT>
 | 
						|
    requires(allocator_type<TAllocator<TChar>>)
 | 
						|
class BaseStdioSink : public BaseFormattingLogSink<MIJIN_FORMATTING_SINK_TMP_ARG_NAMES>
 | 
						|
{
 | 
						|
public:
 | 
						|
    using base_t = BaseFormattingLogSink<MIJIN_FORMATTING_SINK_TMP_ARG_NAMES>;
 | 
						|
    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;
 | 
						|
private:
 | 
						|
    int mMinStderrLevel = MIJIN_LOG_LEVEL_VALUE_WARNING;
 | 
						|
public:
 | 
						|
    explicit BaseStdioSink(not_null_t<formatter_ptr_t> formatter, allocator_t allocator = {})
 | 
						|
        MIJIN_NOEXCEPT_IF(std::is_nothrow_move_constructible_v<allocator_t>)
 | 
						|
        : base_t(std::move(formatter), std::move(allocator)) {}
 | 
						|
 | 
						|
    [[nodiscard]]
 | 
						|
    int getMinStderrLevel() const MIJIN_NOEXCEPT { return mMinStderrLevel; }
 | 
						|
 | 
						|
    void setMinStderrLevel(int level) MIJIN_NOEXCEPT { mMinStderrLevel = level; }
 | 
						|
 | 
						|
    void setMinStderrLevel(const BaseLogLevel<char_t>& level) MIJIN_NOEXCEPT { mMinStderrLevel = level.value; }
 | 
						|
 | 
						|
    void handleMessageFormatted(const message_t& message, const char_t* formatted) MIJIN_NOEXCEPT override
 | 
						|
    {
 | 
						|
        FILE* stream = (message.level->value >= mMinStderrLevel) ? stderr : stdout;
 | 
						|
        if constexpr (std::is_same_v<char_t, char>)
 | 
						|
        {
 | 
						|
            std::fputs(formatted, stream);
 | 
						|
            std::fputc('\n', stream);
 | 
						|
        }
 | 
						|
        else if constexpr (std::is_same_v<char_t, wchar_t>)
 | 
						|
        {
 | 
						|
            std::fputws(formatted, stream);
 | 
						|
            std::fputwc(L'\n', stream);
 | 
						|
        }
 | 
						|
        else if constexpr (sizeof(char_t) == sizeof(char))
 | 
						|
        {
 | 
						|
            // char8_t etc.
 | 
						|
            std::fputs(std::bit_cast<const char*>(formatted), stream);
 | 
						|
            std::fputc('\n', stream);
 | 
						|
        }
 | 
						|
        else
 | 
						|
        {
 | 
						|
            static_assert(always_false_v<char_t>, "Character type not supported.");
 | 
						|
        }
 | 
						|
        std::fflush(stream);
 | 
						|
    }
 | 
						|
};
 | 
						|
 | 
						|
#define SINK_SET_ARGS(chr_type) chr_type, std::char_traits<chr_type>, TAllocator, TDeleter
 | 
						|
 | 
						|
MIJIN_DEFINE_CHAR_VERSIONS_TMPL(StdioSink, MIJIN_FORMATTING_SINK_COMMON_ARGS, SINK_SET_ARGS)
 | 
						|
 | 
						|
#undef SINK_SET_ARGS
 | 
						|
} // namespace mijin
 | 
						|
 | 
						|
 | 
						|
#endif // !defined(MIJIN_LOGGING_STDIO_SINK_HPP_INCLUDED)
 |