#include "kapi/cio.hpp" #include #include #include #include #include #include #include #include namespace kstd::os { namespace { struct write_buffer final : kstd::bits::format::output_buffer { using output_stream = kapi::cio::output_stream; constexpr auto static size = 128uz; write_buffer(write_buffer const &) = delete; write_buffer(write_buffer &&) = delete; auto operator=(write_buffer const &) -> write_buffer & = delete; auto operator=(write_buffer &&) -> write_buffer & = delete; explicit write_buffer(output_stream stream) : m_stream{stream} {} ~write_buffer() noexcept final { flush(); } auto push(std::string_view text) -> void final { std::ranges::for_each(text, [this](auto c) { this->push(c); }); } auto push(char character) -> void final { if (m_position >= size) { flush(); } m_buffer.at(m_position++) = character; } private: auto flush() noexcept -> void { if (m_position > 0) { std::string_view chunk{m_buffer.data(), m_position}; kapi::cio::write(m_stream, chunk); m_position = 0; } } output_stream m_stream; std::array m_buffer{}; std::size_t m_position{}; }; } // namespace auto vprint(print_sink sink, std::string_view format, kstd::format_args args) -> void { auto writer = write_buffer{(sink == print_sink::stderr) ? kapi::cio::output_stream::stderr : kapi::cio::output_stream::stdout}; kstd::bits::format::vformat_to(writer, format, args); } } // namespace kstd::os