forked from organicmaps/organicmaps
Add rw_ops::Reverse.
This commit is contained in:
parent
a43ef7fe5a
commit
a8faed31f8
5 changed files with 122 additions and 0 deletions
|
@ -27,6 +27,7 @@ SOURCES += \
|
|||
zip_reader.cpp \
|
||||
mmap_reader.cpp \
|
||||
reader_streambuf.cpp \
|
||||
reader_writer_ops.cpp
|
||||
|
||||
HEADERS += \
|
||||
internal/xmlparser.h \
|
||||
|
@ -81,3 +82,6 @@ HEADERS += \
|
|||
file_reader_stream.hpp \
|
||||
file_writer_stream.hpp \
|
||||
reader_streambuf.hpp \
|
||||
reader_writer_ops.hpp
|
||||
|
||||
|
||||
|
|
|
@ -37,7 +37,9 @@ SOURCES += ../../testing/testingmain.cpp \
|
|||
file_data_test.cpp \
|
||||
zip_reader_test.cpp \
|
||||
trie_test.cpp \
|
||||
reader_writer_ops_test.cpp
|
||||
|
||||
HEADERS += \
|
||||
reader_test.hpp \
|
||||
coder_test.hpp \
|
||||
|
||||
|
|
78
coding/coding_tests/reader_writer_ops_test.cpp
Normal file
78
coding/coding_tests/reader_writer_ops_test.cpp
Normal file
|
@ -0,0 +1,78 @@
|
|||
#include "../../base/SRC_FIRST.hpp"
|
||||
|
||||
#include "../../testing/testing.hpp"
|
||||
|
||||
#include "../../coding/reader_writer_ops.hpp"
|
||||
#include "../../coding/file_reader.hpp"
|
||||
#include "../../coding/file_writer.hpp"
|
||||
|
||||
#include "../../std/algorithm.hpp"
|
||||
|
||||
|
||||
namespace
|
||||
{
|
||||
void GetReverseForReaderAndTmpFile(Reader const & src, vector<char> & buffer)
|
||||
{
|
||||
char const * tmpFile = "reversed_file.tmp";
|
||||
|
||||
{
|
||||
FileWriter writer(tmpFile);
|
||||
rw_ops::Reverse(src, writer);
|
||||
}
|
||||
|
||||
{
|
||||
FileReader reader(tmpFile);
|
||||
buffer.clear();
|
||||
MemWriter<vector<char> > writer(buffer);
|
||||
rw_ops::Reverse(reader, writer);
|
||||
}
|
||||
|
||||
FileWriter::DeleteFileX(tmpFile);
|
||||
}
|
||||
|
||||
void FillRandFile(string const & fName, size_t count)
|
||||
{
|
||||
FileWriter writer(fName);
|
||||
|
||||
srand(666);
|
||||
|
||||
while (count-- > 0)
|
||||
{
|
||||
char const c = rand();
|
||||
writer.Write(&c, 1);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
UNIT_TEST(Reverse_Smoke)
|
||||
{
|
||||
{
|
||||
char arr[] = { 0xA, 0xB, 0xC, 0xD, 0xF };
|
||||
size_t const sz = ARRAY_SIZE(arr);
|
||||
|
||||
MemReader reader(&arr[0], sz);
|
||||
|
||||
vector<char> buffer;
|
||||
GetReverseForReaderAndTmpFile(reader, buffer);
|
||||
|
||||
TEST_EQUAL(buffer.size(), ARRAY_SIZE(arr), ());
|
||||
TEST(equal(arr, arr + ARRAY_SIZE(arr), buffer.begin()), ());
|
||||
}
|
||||
|
||||
char const * tmpFile = "random_file.tmp";
|
||||
|
||||
{
|
||||
FillRandFile(tmpFile, 10 * 1024 + 527);
|
||||
FileReader reader(tmpFile);
|
||||
|
||||
vector<char> buffer;
|
||||
GetReverseForReaderAndTmpFile(reader, buffer);
|
||||
|
||||
string str;
|
||||
reader.ReadAsString(str);
|
||||
TEST_EQUAL(str.size(), buffer.size(), ());
|
||||
TEST(equal(str.begin(), str.end(), buffer.begin()), ());
|
||||
|
||||
FileWriter::DeleteFileX(tmpFile);
|
||||
}
|
||||
}
|
27
coding/reader_writer_ops.cpp
Normal file
27
coding/reader_writer_ops.cpp
Normal file
|
@ -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;
|
||||
}
|
||||
}
|
||||
}
|
11
coding/reader_writer_ops.hpp
Normal file
11
coding/reader_writer_ops.hpp
Normal file
|
@ -0,0 +1,11 @@
|
|||
#pragma once
|
||||
|
||||
#include "reader.hpp"
|
||||
#include "writer.hpp"
|
||||
|
||||
namespace rw_ops
|
||||
{
|
||||
/// Do reverse bytes.
|
||||
/// Note! src and dest should be for different entities.
|
||||
void Reverse(Reader const & src, Writer & dest);
|
||||
}
|
Loading…
Add table
Reference in a new issue