#include 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); } std::unique_ptr std_out() { return std::make_unique(stdout); } std::unique_ptr std_err() { return std::make_unique(stderr); } std::vector read_full(istream && stream) { std::size_t size = 0; std::vector result(1024); while (true) { if (result.size() == size) result.resize(result.size() * 2); std::size_t count = stream.read(result.data() + size, result.size() - size); if (count == 0) break; size += count; } result.resize(size); return result; } }