From 8cbab227ec96fb59ff0d516de8cc590ef0aa507c Mon Sep 17 00:00:00 2001 From: Yury Melnichek Date: Mon, 8 Aug 2011 20:23:28 +0200 Subject: [PATCH] Add SharedMemReader. --- coding/coding_tests/reader_test.cpp | 14 +++++++++ coding/reader.hpp | 47 +++++++++++++++++++++++++++-- 2 files changed, 58 insertions(+), 3 deletions(-) diff --git a/coding/coding_tests/reader_test.cpp b/coding/coding_tests/reader_test.cpp index a0892e6788..bb0b55a85b 100644 --- a/coding/coding_tests/reader_test.cpp +++ b/coding/coding_tests/reader_test.cpp @@ -83,3 +83,17 @@ UNIT_TEST(FileReaderReadAsText) FileWriter::DeleteFileX(fName); } + +UNIT_TEST(SharedMemReader) +{ + SharedMemReader reader1(3); + TEST_EQUAL(reader1.Size(), 3, ()); + memcpy(reader1.Data(), "123", 3); + SharedMemReader reader2(reader1); + TEST_EQUAL(reader2.Size(), 3, ()); + string s1(3, '0'), s2(3, '0'); + reader1.Read(0, &s1[0], 3); + reader2.Read(0, &s2[0], 3); + TEST_EQUAL(s1, "123", ()); + TEST_EQUAL(s2, "123", ()); +} diff --git a/coding/reader.hpp b/coding/reader.hpp index 7db2627892..e69c636371 100644 --- a/coding/reader.hpp +++ b/coding/reader.hpp @@ -7,6 +7,7 @@ #include "../base/exception.hpp" #include "../base/macros.hpp" +#include "../std/shared_array.hpp" #include "../std/shared_ptr.hpp" #include "../std/string.hpp" #include "../std/memcpy.hpp" @@ -38,13 +39,13 @@ public: // Construct from block of memory. MemReader(void const * pData, size_t size) - : m_pData(static_cast(pData)), m_Size(size) + : m_pData(static_cast(pData)), m_size(size) { } inline uint64_t Size() const { - return m_Size; + return m_size; } inline void Read(uint64_t pos, void * p, size_t size) const @@ -56,18 +57,58 @@ public: inline MemReader SubReader(uint64_t pos, uint64_t size) const { ASSERT_LESS_OR_EQUAL(pos + size, Size(), (pos, size)); + ASSERT_LESS_OR_EQUAL(size, static_cast(-1), ()); return MemReader(m_pData + pos, static_cast(size)); } inline MemReader * CreateSubReader(uint64_t pos, uint64_t size) const { ASSERT_LESS_OR_EQUAL(pos + size, Size(), (pos, size)); + ASSERT_LESS_OR_EQUAL(size, static_cast(-1), ()); return new MemReader(m_pData + pos, static_cast(size)); } private: char const * m_pData; - size_t m_Size; + size_t m_size; +}; + +class SharedMemReader +{ +public: + explicit SharedMemReader(size_t size) : m_data(new char[size]), m_offset(0), m_size(size) {} + + inline char * Data() { return m_data.get() + m_offset; } + inline char const * Data() const { return m_data.get() + m_offset; } + inline uint64_t Size() const { return m_size; } + + inline void Read(uint64_t pos, void * p, size_t size) const + { + ASSERT_LESS_OR_EQUAL(pos + size, Size(), (pos, size)); + memcpy(p, Data() + pos, size); + } + + inline SharedMemReader SubReader(uint64_t pos, uint64_t size) const + { + ASSERT_LESS_OR_EQUAL(pos + size, Size(), (pos, size)); + ASSERT_LESS_OR_EQUAL(size, static_cast(-1), ()); + return SharedMemReader(m_data, static_cast(pos), static_cast(size)); + } + + inline SharedMemReader * CreateSubReader(uint64_t pos, uint64_t size) const + { + ASSERT_LESS_OR_EQUAL(pos + size, Size(), (pos, size)); + ASSERT_LESS_OR_EQUAL(size, static_cast(-1), ()); + return new SharedMemReader(m_data, static_cast(pos), static_cast(size)); + } + +private: + SharedMemReader(shared_array const & data, size_t offset, size_t size) + : m_data(data), m_offset(offset), m_size(size) {} + + shared_array m_data; + size_t m_offset; + size_t m_size; }; // Reader wrapper to hold the pointer to a polymorfic reader.