From e7c999c3dda7946c2076d31137f583db8321445b Mon Sep 17 00:00:00 2001 From: lisyarus Date: Fri, 7 Oct 2022 23:37:04 +0300 Subject: [PATCH] Add io::read_full function to read whole input stream into std::vector --- libs/io/include/psemek/io/stream.hpp | 4 ++++ libs/io/source/stream.cpp | 18 ++++++++++++++++++ 2 files changed, 22 insertions(+) diff --git a/libs/io/include/psemek/io/stream.hpp b/libs/io/include/psemek/io/stream.hpp index 11330526..36128b5c 100644 --- a/libs/io/include/psemek/io/stream.hpp +++ b/libs/io/include/psemek/io/stream.hpp @@ -5,6 +5,8 @@ #include #include +#include + namespace psemek::io { @@ -29,4 +31,6 @@ namespace psemek::io std::unique_ptr std_out(); std::unique_ptr std_err(); + std::vector read_full(istream && stream); + } diff --git a/libs/io/source/stream.cpp b/libs/io/source/stream.cpp index 3def2dbb..11247f6e 100644 --- a/libs/io/source/stream.cpp +++ b/libs/io/source/stream.cpp @@ -46,4 +46,22 @@ namespace psemek::io 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; + } + }