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); } - }