Add io stream read/write_all

This commit is contained in:
Nikita Lisitsa 2022-06-11 13:55:13 +03:00
parent 142d15fdcb
commit ef5b8479ea
2 changed files with 30 additions and 1 deletions

View file

@ -11,6 +11,7 @@ namespace psemek::io
struct istream struct istream
{ {
virtual std::size_t read(char * p, std::size_t size) = 0; 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() {} virtual ~istream() {}
}; };
@ -18,6 +19,7 @@ namespace psemek::io
struct ostream struct ostream
{ {
virtual std::size_t write(char const * p, std::size_t size) = 0; 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 void flush() {}
virtual ~ostream() {} virtual ~ostream() {}

View file

@ -3,6 +3,34 @@
namespace psemek::io 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<istream> std_in() std::unique_ptr<istream> std_in()
{ {
return std::make_unique<file_istream>(stdin); return std::make_unique<file_istream>(stdin);
@ -18,5 +46,4 @@ namespace psemek::io
return std::make_unique<file_ostream>(stderr); return std::make_unique<file_ostream>(stderr);
} }
} }