From c03b230e84bd5bde4e7e1aa0e979c2bb1edca177 Mon Sep 17 00:00:00 2001 From: Michael Krasnyk Date: Wed, 18 Jan 2017 20:40:38 +0100 Subject: [PATCH] Refactor ShMemIterator, resolves #3458 --- include/util/shared_memory_vector_wrapper.hpp | 105 +++++++----------- 1 file changed, 38 insertions(+), 67 deletions(-) diff --git a/include/util/shared_memory_vector_wrapper.hpp b/include/util/shared_memory_vector_wrapper.hpp index 6da3b0eb0..cb362fc38 100644 --- a/include/util/shared_memory_vector_wrapper.hpp +++ b/include/util/shared_memory_vector_wrapper.hpp @@ -1,10 +1,13 @@ #ifndef SHARED_MEMORY_VECTOR_WRAPPER_HPP #define SHARED_MEMORY_VECTOR_WRAPPER_HPP -#include - #include "util/log.hpp" +#include +#include +#include + +#include #include #include @@ -18,61 +21,34 @@ namespace osrm namespace util { -template class ShMemIterator : public std::iterator -{ - DataT *p; - - public: - explicit ShMemIterator(DataT *x) : p(x) {} - ShMemIterator(const ShMemIterator &mit) : p(mit.p) {} - ShMemIterator &operator++() - { - ++p; - return *this; - } - ShMemIterator operator++(int) - { - ShMemIterator tmp(*this); - operator++(); - return tmp; - } - ShMemIterator operator+(std::ptrdiff_t diff) - { - ShMemIterator tmp(p + diff); - return tmp; - } - bool operator==(const ShMemIterator &rhs) { return p == rhs.p; } - bool operator!=(const ShMemIterator &rhs) { return p != rhs.p; } - DataT &operator*() { return *p; } -}; - template -class ShMemReverseIterator : public std::iterator +class ShMemIterator + : public boost::iterator_facade, DataT, boost::random_access_traversal_tag> { - DataT *p; + typedef boost::iterator_facade, DataT, boost::random_access_traversal_tag> + base_t; public: - explicit ShMemReverseIterator(DataT *x) : p(x) {} - ShMemReverseIterator(const ShMemReverseIterator &mit) : p(mit.p) {} - ShMemReverseIterator &operator++() + typedef typename base_t::value_type value_type; + typedef typename base_t::difference_type difference_type; + typedef typename base_t::reference reference; + typedef std::random_access_iterator_tag iterator_category; + + explicit ShMemIterator(DataT *x) : m_value(x) {} + + private: + void increment() { ++m_value; } + void decrement() { --m_value; } + void advance(difference_type offset) { m_value += offset; } + bool equal(const ShMemIterator &other) const { return m_value == other.m_value; } + reference dereference() const { return *m_value; } + difference_type distance_to(const ShMemIterator &other) const { - --p; - return *this; + return other.m_value - m_value; } - ShMemReverseIterator operator++(int) - { - ShMemReverseIterator tmp(*this); - operator++(); - return tmp; - } - ShMemReverseIterator operator+(std::ptrdiff_t diff) - { - ShMemReverseIterator tmp(p - diff); - return tmp; - } - bool operator==(const ShMemReverseIterator &rhs) { return p == rhs.p; } - bool operator!=(const ShMemReverseIterator &rhs) { return p != rhs.p; } - DataT &operator*() { return *p; } + + friend class ::boost::iterator_core_access; + DataT *m_value; }; template class SharedMemoryWrapper @@ -82,6 +58,9 @@ template class SharedMemoryWrapper std::size_t m_size; public: + using iterator = ShMemIterator; + using reverse_iterator = boost::reverse_iterator; + SharedMemoryWrapper() : m_ptr(nullptr), m_size(0) {} SharedMemoryWrapper(DataT *ptr, std::size_t size) : m_ptr(ptr), m_size(size) {} @@ -96,16 +75,13 @@ template class SharedMemoryWrapper const DataT &at(const std::size_t index) const { return m_ptr[index]; } - ShMemIterator begin() const { return ShMemIterator(m_ptr); } + auto begin() const { return iterator(m_ptr); } - ShMemIterator end() const { return ShMemIterator(m_ptr + m_size); } + auto end() const { return iterator(m_ptr + m_size); } - ShMemReverseIterator rbegin() const - { - return ShMemReverseIterator(m_ptr + m_size - 1); - } + auto rbegin() const { return reverse_iterator(iterator(m_ptr + m_size)); } - ShMemReverseIterator rend() const { return ShMemReverseIterator(m_ptr - 1); } + auto rend() const { return reverse_iterator(iterator(m_ptr)); } std::size_t size() const { return m_size; } @@ -140,8 +116,9 @@ template <> class SharedMemoryWrapper bool at(const std::size_t index) const { - const std::size_t bucket = index / 32; - const unsigned offset = static_cast(index % 32); + BOOST_ASSERT_MSG(index < m_size, "invalid size"); + const std::size_t bucket = index / (CHAR_BIT * sizeof(unsigned)); + const unsigned offset = index % (CHAR_BIT * sizeof(unsigned)); return m_ptr[bucket] & (1u << offset); } @@ -155,13 +132,7 @@ template <> class SharedMemoryWrapper bool empty() const { return 0 == size(); } - bool operator[](const unsigned index) - { - BOOST_ASSERT_MSG(index < m_size, "invalid size"); - const unsigned bucket = index / 32; - const unsigned offset = index % 32; - return m_ptr[bucket] & (1u << offset); - } + bool operator[](const unsigned index) const { return at(index); } template friend void swap(SharedMemoryWrapper &, SharedMemoryWrapper &) noexcept;