From a566a22cbc4dd5c1f26256ae7bf380af93a62b14 Mon Sep 17 00:00:00 2001 From: Maxime Coste Date: Sat, 31 Jul 2021 09:44:24 +1000 Subject: [PATCH] Expose BufferedWriter --- src/file.cc | 37 ------------------------------------- src/file.hh | 38 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 38 insertions(+), 37 deletions(-) diff --git a/src/file.cc b/src/file.cc index 4c7658be..cca59393 100644 --- a/src/file.cc +++ b/src/file.cc @@ -279,43 +279,6 @@ void write_to_file(StringView filename, StringView data) write(fd, data); } -struct BufferedWriter -{ - BufferedWriter(int fd) - : m_fd{fd}, m_exception_count{std::uncaught_exceptions()} {} - - ~BufferedWriter() noexcept(false) - { - if (m_pos != 0 and m_exception_count == std::uncaught_exceptions()) - Kakoune::write(m_fd, {m_buffer, m_pos}); - } - - void write(StringView data) - { - while (not data.empty()) - { - const ByteCount length = data.length(); - const ByteCount write_len = std::min(length, size - m_pos); - memcpy(m_buffer + (int)m_pos, data.data(), (int)write_len); - m_pos += write_len; - if (m_pos == size) - { - Kakoune::write(m_fd, {m_buffer, size}); - m_pos = 0; - } - data = data.substr(write_len); - } - } - -private: - static constexpr ByteCount size = 4096; - int m_fd; - int m_exception_count; - ByteCount m_pos = 0; - char m_buffer[(int)size]; -}; - - void write_buffer_to_fd(Buffer& buffer, int fd) { auto eolformat = buffer.options()["eolformat"].get(); diff --git a/src/file.hh b/src/file.hh index 849b14f4..6a8f0f84 100644 --- a/src/file.hh +++ b/src/file.hh @@ -10,6 +10,7 @@ #include #include +#include namespace Kakoune { @@ -121,6 +122,43 @@ CandidateList complete_filename(StringView prefix, const Regex& ignore_regex, CandidateList complete_command(StringView prefix, ByteCount cursor_pos = -1); +template +struct BufferedWriter +{ + BufferedWriter(int fd) + : m_fd{fd}, m_exception_count{std::uncaught_exceptions()} {} + + ~BufferedWriter() noexcept(false) + { + if (m_pos != 0 and m_exception_count == std::uncaught_exceptions()) + Kakoune::write(m_fd, {m_buffer, m_pos}); + } + + void write(StringView data) + { + while (not data.empty()) + { + const ByteCount length = data.length(); + const ByteCount write_len = std::min(length, size - m_pos); + memcpy(m_buffer + (int)m_pos, data.data(), (int)write_len); + m_pos += write_len; + if (m_pos == size) + { + Kakoune::write(m_fd, {m_buffer, size}); + m_pos = 0; + } + data = data.substr(write_len); + } + } + +private: + static constexpr ByteCount size = buffer_size; + int m_fd; + int m_exception_count; + ByteCount m_pos = 0; + char m_buffer[(int)size]; +}; + } #endif // file_hh_INCLUDED