diff options
author | vng <viktor.govako@gmail.com> | 2011-12-13 12:43:05 +0400 |
---|---|---|
committer | Alex Zolotarev <alex@maps.me> | 2015-09-23 01:30:11 +0300 |
commit | a8faed31f84deb6c8215dd0a446433c2a4d485ca (patch) | |
tree | 5b81e308f01f32acd929c7a1f65ee7cfd8017641 /coding/reader_writer_ops.cpp | |
parent | a43ef7fe5afa21d18333a78295511e0d59824a87 (diff) |
Add rw_ops::Reverse.
Diffstat (limited to 'coding/reader_writer_ops.cpp')
-rw-r--r-- | coding/reader_writer_ops.cpp | 27 |
1 files changed, 27 insertions, 0 deletions
diff --git a/coding/reader_writer_ops.cpp b/coding/reader_writer_ops.cpp new file mode 100644 index 0000000000..93dff6e8f4 --- /dev/null +++ b/coding/reader_writer_ops.cpp @@ -0,0 +1,27 @@ +#include "reader_writer_ops.hpp" + +namespace rw_ops +{ + void Reverse(Reader const & src, Writer & dest) + { + // Read from end, reverse and write directly. + + size_t const bufSz = 1024; + vector<char> buffer(bufSz); + + uint64_t pos = src.Size(); + while (pos > 0) + { + size_t const sz = pos > bufSz ? bufSz : pos; + ASSERT_GREATER_OR_EQUAL(pos, sz, ()); + + src.Read(pos - sz, &buffer[0], sz); + + std::reverse(buffer.begin(), buffer.begin() + sz); + + dest.Write(&buffer[0], sz); + + pos -= sz; + } + } +} |