From ef5b8479ea9f61e6ad5459d313bdcac2024e97fb Mon Sep 17 00:00:00 2001 From: lisyarus Date: Sat, 11 Jun 2022 13:55:13 +0300 Subject: [PATCH] Add io stream read/write_all --- libs/io/include/psemek/io/stream.hpp | 2 ++ libs/io/source/stream.cpp | 29 +++++++++++++++++++++++++++- 2 files changed, 30 insertions(+), 1 deletion(-) diff --git a/libs/io/include/psemek/io/stream.hpp b/libs/io/include/psemek/io/stream.hpp index 9ba9a0ed..11330526 100644 --- a/libs/io/include/psemek/io/stream.hpp +++ b/libs/io/include/psemek/io/stream.hpp @@ -11,6 +11,7 @@ namespace psemek::io struct istream { virtual std::size_t read(char * p, std::size_t size) = 0; + virtual std::size_t read_all(char * p, std::size_t size); virtual ~istream() {} }; @@ -18,6 +19,7 @@ namespace psemek::io struct ostream { virtual std::size_t write(char const * p, std::size_t size) = 0; + virtual std::size_t write_all(char const * p, std::size_t size); virtual void flush() {} virtual ~ostream() {} diff --git a/libs/io/source/stream.cpp b/libs/io/source/stream.cpp index bac3795d..3def2dbb 100644 --- a/libs/io/source/stream.cpp +++ b/libs/io/source/stream.cpp @@ -3,6 +3,34 @@ namespace psemek::io { + std::size_t istream::read_all(char * p, std::size_t size) + { + auto left = size; + while (left > 0) + { + auto s = read(p, left); + if (s == 0) + throw istream_end{}; + p += s; + left -= s; + } + return size; + } + + std::size_t ostream::write_all(char const * p, std::size_t size) + { + auto left = size; + while (left > 0) + { + auto s = write(p, left); + if (s == 0) + throw ostream_end{}; + p += s; + left -= s; + } + return size; + } + std::unique_ptr std_in() { return std::make_unique(stdin); @@ -18,5 +46,4 @@ namespace psemek::io return std::make_unique(stderr); } - }