From 1540bdbcfcf12d78bf5721a83b5f36ce81952d45 Mon Sep 17 00:00:00 2001 From: eldritch horrors Date: Thu, 27 Jun 2024 21:23:50 +0200 Subject: [PATCH] libutil: allow construction of sources from generators Change-Id: I78ff8d0720f06bce731e26d5e1c53b1382bbd589 --- src/libutil/serialise.hh | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/src/libutil/serialise.hh b/src/libutil/serialise.hh index 3d35b128e..2a2568224 100644 --- a/src/libutil/serialise.hh +++ b/src/libutil/serialise.hh @@ -334,6 +334,31 @@ struct ChainSource : Source size_t read(char * data, size_t len) override; }; +struct GeneratorSource : Source +{ + GeneratorSource(Generator && g) : g(std::move(g)) {} + + virtual size_t read(char * data, size_t len) + { + while (!buf.size()) { + if (auto next = g.next()) { + buf = *next; + } else { + throw EndOfFile("coroutine has finished"); + } + } + + len = std::min(len, buf.size()); + memcpy(data, buf.data(), len); + buf = buf.subspan(len); + return len; + } + +private: + Generator g; + Bytes buf{}; +}; + std::unique_ptr sourceToSink(std::function fun); /**