diff --git a/coding/read_write_utils.hpp b/coding/read_write_utils.hpp index b7bf10a14a..580990aa9d 100644 --- a/coding/read_write_utils.hpp +++ b/coding/read_write_utils.hpp @@ -114,4 +114,21 @@ namespace rw if (count > 0) sink.Write(&v[0], count * sizeof(ValueT)); } + + template + void ReadAndWrite(ReaderT & reader, WriterT & writer, size_t bufferSize = 4*1024) + { + uint64_t size = reader.Size(); + vector buffer(min(bufferSize, static_cast(size))); + + while (size > 0) + { + size_t const curr = min(bufferSize, static_cast(size)); + + reader.Read(&buffer[0], curr); + writer.Write(&buffer[0], curr); + + size -= curr; + } + } } diff --git a/coding/reader.hpp b/coding/reader.hpp index 9aa5d5fff8..e0605e541b 100644 --- a/coding/reader.hpp +++ b/coding/reader.hpp @@ -182,7 +182,7 @@ public: { if (m_pos + size > m_reader.Size()) { - size_t remainingSize = static_cast(m_reader.Size() - m_pos); + size_t const remainingSize = static_cast(Size()); m_reader.Read(m_pos, p, remainingSize); m_pos = m_reader.Size(); MYTHROW1(SourceOutOfBoundsException, remainingSize, ()); @@ -204,6 +204,11 @@ public: return m_pos; } + uint64_t Size() const + { + return (m_reader.Size() - m_pos); + } + ReaderT const & Reader() const { return m_reader;