diff options
Diffstat (limited to 'boost/interprocess/detail/transform_iterator.hpp')
-rw-r--r-- | boost/interprocess/detail/transform_iterator.hpp | 164 |
1 files changed, 4 insertions, 160 deletions
diff --git a/boost/interprocess/detail/transform_iterator.hpp b/boost/interprocess/detail/transform_iterator.hpp index 1c4dcd3aeb..d409b52362 100644 --- a/boost/interprocess/detail/transform_iterator.hpp +++ b/boost/interprocess/detail/transform_iterator.hpp @@ -27,170 +27,14 @@ // interprocess #include <boost/interprocess/interprocess_fwd.hpp> -// interprocess/detail -#include <boost/interprocess/detail/type_traits.hpp> -// move/detail -#include <boost/container/detail/iterator.hpp> +// container/detail +#include <boost/container/detail/transform_iterator.hpp> namespace boost { namespace interprocess { -template <class PseudoReference> -struct operator_arrow_proxy -{ - operator_arrow_proxy(const PseudoReference &px) - : m_value(px) - {} - - PseudoReference* operator->() const { return &m_value; } - // This function is needed for MWCW and BCC, which won't call operator-> - // again automatically per 13.3.1.2 para 8 -// operator T*() const { return &m_value; } - mutable PseudoReference m_value; -}; - -template <class T> -struct operator_arrow_proxy<T&> -{ - operator_arrow_proxy(T &px) - : m_value(px) - {} - - T* operator->() const { return const_cast<T*>(&m_value); } - // This function is needed for MWCW and BCC, which won't call operator-> - // again automatically per 13.3.1.2 para 8 -// operator T*() const { return &m_value; } - T &m_value; -}; - -template <class Iterator, class UnaryFunction> -class transform_iterator - : public UnaryFunction -{ - public: - typedef typename ::boost::container::iterator_traits<Iterator>::iterator_category iterator_category; - typedef typename ipcdetail::remove_reference<typename UnaryFunction::result_type>::type value_type; - typedef typename ::boost::container::iterator_traits<Iterator>::difference_type difference_type; - typedef operator_arrow_proxy<typename UnaryFunction::result_type> pointer; - typedef typename UnaryFunction::result_type reference; - - explicit transform_iterator(const Iterator &it, const UnaryFunction &f = UnaryFunction()) - : UnaryFunction(f), m_it(it) - {} - - explicit transform_iterator() - : UnaryFunction(), m_it() - {} - - //Constructors - transform_iterator& operator++() - { increment(); return *this; } - - transform_iterator operator++(int) - { - transform_iterator result (*this); - increment(); - return result; - } - - transform_iterator& operator--() - { decrement(); return *this; } - - transform_iterator operator--(int) - { - transform_iterator result (*this); - decrement(); - return result; - } - - friend bool operator== (const transform_iterator& i, const transform_iterator& i2) - { return i.equal(i2); } - - friend bool operator!= (const transform_iterator& i, const transform_iterator& i2) - { return !(i == i2); } - - friend bool operator< (const transform_iterator& i, const transform_iterator& i2) - { return i < i2; } - - friend bool operator> (const transform_iterator& i, const transform_iterator& i2) - { return i2 < i; } - - friend bool operator<= (const transform_iterator& i, const transform_iterator& i2) - { return !(i > i2); } - - friend bool operator>= (const transform_iterator& i, const transform_iterator& i2) - { return !(i < i2); } - - friend difference_type operator- (const transform_iterator& i, const transform_iterator& i2) - { return i2.distance_to(i); } - - //Arithmetic - transform_iterator& operator+=(difference_type off) - { this->advance(off); return *this; } - - transform_iterator operator+(difference_type off) const - { - transform_iterator other(*this); - other.advance(off); - return other; - } - - friend transform_iterator operator+(difference_type off, const transform_iterator& right) - { return right + off; } - - transform_iterator& operator-=(difference_type off) - { this->advance(-off); return *this; } - - transform_iterator operator-(difference_type off) const - { return *this + (-off); } - - typename UnaryFunction::result_type operator*() const - { return dereference(); } - - typename UnaryFunction::result_type operator[](difference_type off) const - { return UnaryFunction::operator()(m_it[off]); } - - operator_arrow_proxy<typename UnaryFunction::result_type> - operator->() const - { return operator_arrow_proxy<typename UnaryFunction::result_type>(dereference()); } - - Iterator & base() - { return m_it; } - - const Iterator & base() const - { return m_it; } - - private: - Iterator m_it; - - void increment() - { ++m_it; } - - void decrement() - { --m_it; } - - bool equal(const transform_iterator &other) const - { return m_it == other.m_it; } - - bool less(const transform_iterator &other) const - { return other.m_it < m_it; } - - typename UnaryFunction::result_type dereference() const - { return UnaryFunction::operator()(*m_it); } - - void advance(difference_type n) - { ::boost::container::iterator_advance(m_it, n); } - - difference_type distance_to(const transform_iterator &other)const - { return ::boost::container::iterator_distance(other.m_it, m_it); } -}; - -template <class Iterator, class UnaryFunc> -transform_iterator<Iterator, UnaryFunc> -make_transform_iterator(Iterator it, UnaryFunc fun) -{ - return transform_iterator<Iterator, UnaryFunc>(it, fun); -} +using boost::container::make_transform_iterator; +using boost::container::transform_iterator; } //namespace interprocess { } //namespace boost { |