Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/mapsme/omim.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMaxim Pimenov <m@maps.me>2016-12-09 14:15:28 +0300
committerMaxim Pimenov <m@maps.me>2016-12-09 14:15:28 +0300
commitcbc1d465538ef84a200c3e78399b085ce0ea3cf6 (patch)
tree2fa67e4a56bceeeba1711cd3438a99e23046614c /coding/reader.hpp
parentef16507945659600708feeb0029381a9994de461 (diff)
[coding] Added a version with exceptions to MemReader.
Diffstat (limited to 'coding/reader.hpp')
-rw-r--r--coding/reader.hpp43
1 files changed, 33 insertions, 10 deletions
diff --git a/coding/reader.hpp b/coding/reader.hpp
index c96088d0ff..34d2d98ac0 100644
--- a/coding/reader.hpp
+++ b/coding/reader.hpp
@@ -32,13 +32,12 @@ public:
};
// Reader from memory.
-class MemReader : public Reader
+template <bool WithExceptions>
+class MemReaderTemplate : public Reader
{
- bool AssertPosAndSize(uint64_t pos, uint64_t size) const;
-
public:
// Construct from block of memory.
- MemReader(void const * pData, size_t size)
+ MemReaderTemplate(void const * pData, size_t size)
: m_pData(static_cast<char const *>(pData)), m_size(size)
{
}
@@ -50,27 +49,51 @@ public:
inline void Read(uint64_t pos, void * p, size_t size) const override
{
- ASSERT ( AssertPosAndSize(pos, size), () );
+ AssertPosAndSize(pos, size);
memcpy(p, m_pData + pos, size);
}
- inline MemReader SubReader(uint64_t pos, uint64_t size) const
+ inline MemReaderTemplate SubReader(uint64_t pos, uint64_t size) const
{
- ASSERT ( AssertPosAndSize(pos, size), () );
- return MemReader(m_pData + pos, static_cast<size_t>(size));
+ AssertPosAndSize(pos, size);
+ return MemReaderTemplate(m_pData + pos, static_cast<size_t>(size));
}
inline unique_ptr<Reader> CreateSubReader(uint64_t pos, uint64_t size) const override
{
- ASSERT ( AssertPosAndSize(pos, size), () );
- return make_unique<MemReader>(m_pData + pos, static_cast<size_t>(size));
+ AssertPosAndSize(pos, size);
+ return make_unique<MemReaderTemplate>(m_pData + pos, static_cast<size_t>(size));
}
private:
+ bool GoodPosAndSize(uint64_t pos, uint64_t size) const
+ {
+ uint64_t const readerSize = Size();
+ bool const ret1 = (pos + size <= readerSize);
+ bool const ret2 = (size <= static_cast<size_t>(-1));
+ return ret1 && ret2;
+ }
+
+ void AssertPosAndSize(uint64_t pos, uint64_t size) const
+ {
+ if (WithExceptions)
+ {
+ if (!GoodPosAndSize(pos, size))
+ MYTHROW(Reader::SizeException, (pos, size, Size()));
+ }
+ else
+ {
+ ASSERT(GoodPosAndSize(pos, size), (pos, size, Size()));
+ }
+ }
+
char const * m_pData;
size_t m_size;
};
+using MemReader = MemReaderTemplate<false>;
+using MemReaderWithExceptions = MemReaderTemplate<true>;
+
// Reader wrapper to hold the pointer to a polymorfic reader.
// Common use: ReaderSource<ReaderPtr<Reader> >.
// Note! It takes the ownership of Reader.