psemek/libs/io/source/stream.cpp

67 lines
1.1 KiB
C++

#include <psemek/io/file_stream.hpp>
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()
{
return std::make_unique<file_istream>(stdin);
}
std::unique_ptr<ostream> std_out()
{
return std::make_unique<file_ostream>(stdout);
}
std::unique_ptr<ostream> std_err()
{
return std::make_unique<file_ostream>(stderr);
}
std::vector<char> read_full(istream && stream)
{
std::size_t size = 0;
std::vector<char> 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;
}
}