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:
authorvng <viktor.govako@gmail.com>2012-02-22 22:46:55 +0400
committerAlex Zolotarev <alex@maps.me>2015-09-23 01:34:27 +0300
commit5c3e56b54a630918e2206a2b682d8b18e6dc4c9a (patch)
tree62e2e4c4c953338d0e6e5c1020879b16be94d547 /coding/reader_wrapper.hpp
parent32e1833acc0c1e7f7f547fae5fbfbfd55fa88692 (diff)
[search] Performance: Avoid penalty on polymorphic SubReader and coping of readers.
Diffstat (limited to 'coding/reader_wrapper.hpp')
-rw-r--r--coding/reader_wrapper.hpp35
1 files changed, 35 insertions, 0 deletions
diff --git a/coding/reader_wrapper.hpp b/coding/reader_wrapper.hpp
new file mode 100644
index 0000000000..e45b940e9e
--- /dev/null
+++ b/coding/reader_wrapper.hpp
@@ -0,0 +1,35 @@
+#pragma once
+
+#include "../base/assert.hpp"
+
+
+/// Reader wrapper to avoid penalty on copy and polymorphic SubReader creation.
+template <class ReaderT> class SubReaderWrapper
+{
+ ReaderT * m_p;
+ uint64_t m_pos;
+ uint64_t m_size;
+
+protected:
+ SubReaderWrapper(ReaderT * p, uint64_t pos, uint64_t size)
+ : m_p(p), m_pos(pos), m_size(size)
+ {
+ ASSERT_LESS_OR_EQUAL ( pos + size, m_p->Size(), (pos, size) );
+ }
+
+public:
+ explicit SubReaderWrapper(ReaderT * p) : m_p(p), m_pos(0), m_size(p->Size()) {}
+
+ uint64_t Size() const { return m_size; }
+
+ void Read(uint64_t pos, void * p, size_t size) const
+ {
+ ASSERT_LESS_OR_EQUAL ( pos + size, m_size, (pos, size) );
+ m_p->Read(pos + m_pos, p, size);
+ }
+
+ SubReaderWrapper SubReader(uint64_t pos, uint64_t size) const
+ {
+ return SubReaderWrapper(m_p, pos + m_pos, size);
+ }
+};