Add SharedMemReader.

This commit is contained in:
Yury Melnichek 2011-08-08 20:23:28 +02:00 committed by Alex Zolotarev
parent 73a11bba7e
commit 8cbab227ec
2 changed files with 58 additions and 3 deletions

View file

@ -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", ());
}

View file

@ -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<char const *>(pData)), m_Size(size)
: m_pData(static_cast<char const *>(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<size_t>(-1), ());
return MemReader(m_pData + pos, static_cast<size_t>(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<size_t>(-1), ());
return new MemReader(m_pData + pos, static_cast<size_t>(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<size_t>(-1), ());
return SharedMemReader(m_data, static_cast<size_t>(pos), static_cast<size_t>(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<size_t>(-1), ());
return new SharedMemReader(m_data, static_cast<size_t>(pos), static_cast<size_t>(size));
}
private:
SharedMemReader(shared_array<char> const & data, size_t offset, size_t size)
: m_data(data), m_offset(offset), m_size(size) {}
shared_array<char> m_data;
size_t m_offset;
size_t m_size;
};
// Reader wrapper to hold the pointer to a polymorfic reader.