diff options
author | vng <viktor.govako@gmail.com> | 2012-02-22 22:46:55 +0400 |
---|---|---|
committer | Alex Zolotarev <alex@maps.me> | 2015-09-23 01:34:27 +0300 |
commit | 5c3e56b54a630918e2206a2b682d8b18e6dc4c9a (patch) | |
tree | 62e2e4c4c953338d0e6e5c1020879b16be94d547 /coding/reader_wrapper.hpp | |
parent | 32e1833acc0c1e7f7f547fae5fbfbfd55fa88692 (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.hpp | 35 |
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); + } +}; |