annotate DEPENDENCIES/generic/include/boost/container/detail/transform_iterator.hpp @ 125:34e428693f5d vext

Vext -> Repoint
author Chris Cannam
date Thu, 14 Jun 2018 11:15:39 +0100
parents c530137014c0
children
rev   line source
Chris@16 1 //////////////////////////////////////////////////////////////////////////////
Chris@16 2 //
Chris@101 3 // (C) Copyright Ion Gaztanaga 2005-2013.
Chris@16 4 // (C) Copyright Gennaro Prota 2003 - 2004.
Chris@16 5 //
Chris@16 6 // Distributed under the Boost Software License, Version 1.0.
Chris@16 7 // (See accompanying file LICENSE_1_0.txt or copy at
Chris@16 8 // http://www.boost.org/LICENSE_1_0.txt)
Chris@16 9 //
Chris@16 10 // See http://www.boost.org/libs/container for documentation.
Chris@16 11 //
Chris@16 12 //////////////////////////////////////////////////////////////////////////////
Chris@16 13
Chris@16 14 #ifndef BOOST_CONTAINER_DETAIL_TRANSFORM_ITERATORS_HPP
Chris@16 15 #define BOOST_CONTAINER_DETAIL_TRANSFORM_ITERATORS_HPP
Chris@16 16
Chris@101 17 #ifndef BOOST_CONFIG_HPP
Chris@101 18 # include <boost/config.hpp>
Chris@101 19 #endif
Chris@101 20
Chris@101 21 #if defined(BOOST_HAS_PRAGMA_ONCE)
Chris@16 22 # pragma once
Chris@16 23 #endif
Chris@16 24
Chris@101 25 #include <boost/container/detail/config_begin.hpp>
Chris@16 26 #include <boost/container/detail/workaround.hpp>
Chris@16 27 #include <boost/container/detail/type_traits.hpp>
Chris@101 28 #include <boost/container/detail/iterator.hpp>
Chris@16 29
Chris@16 30 namespace boost {
Chris@16 31 namespace container {
Chris@16 32
Chris@16 33 template <class PseudoReference>
Chris@16 34 struct operator_arrow_proxy
Chris@16 35 {
Chris@16 36 operator_arrow_proxy(const PseudoReference &px)
Chris@16 37 : m_value(px)
Chris@16 38 {}
Chris@16 39
Chris@101 40 typedef PseudoReference element_type;
Chris@101 41
Chris@16 42 PseudoReference* operator->() const { return &m_value; }
Chris@101 43
Chris@16 44 mutable PseudoReference m_value;
Chris@16 45 };
Chris@16 46
Chris@16 47 template <class T>
Chris@16 48 struct operator_arrow_proxy<T&>
Chris@16 49 {
Chris@16 50 operator_arrow_proxy(T &px)
Chris@16 51 : m_value(px)
Chris@16 52 {}
Chris@16 53
Chris@101 54 typedef T element_type;
Chris@101 55
Chris@16 56 T* operator->() const { return const_cast<T*>(&m_value); }
Chris@101 57
Chris@16 58 T &m_value;
Chris@16 59 };
Chris@16 60
Chris@16 61 template <class Iterator, class UnaryFunction>
Chris@16 62 class transform_iterator
Chris@16 63 : public UnaryFunction
Chris@101 64 , public boost::container::iterator
Chris@16 65 < typename Iterator::iterator_category
Chris@16 66 , typename container_detail::remove_reference<typename UnaryFunction::result_type>::type
Chris@16 67 , typename Iterator::difference_type
Chris@16 68 , operator_arrow_proxy<typename UnaryFunction::result_type>
Chris@16 69 , typename UnaryFunction::result_type>
Chris@16 70 {
Chris@16 71 public:
Chris@16 72 explicit transform_iterator(const Iterator &it, const UnaryFunction &f = UnaryFunction())
Chris@16 73 : UnaryFunction(f), m_it(it)
Chris@16 74 {}
Chris@16 75
Chris@16 76 explicit transform_iterator()
Chris@16 77 : UnaryFunction(), m_it()
Chris@16 78 {}
Chris@16 79
Chris@16 80 //Constructors
Chris@16 81 transform_iterator& operator++()
Chris@16 82 { increment(); return *this; }
Chris@16 83
Chris@16 84 transform_iterator operator++(int)
Chris@16 85 {
Chris@16 86 transform_iterator result (*this);
Chris@16 87 increment();
Chris@16 88 return result;
Chris@16 89 }
Chris@16 90
Chris@16 91 friend bool operator== (const transform_iterator& i, const transform_iterator& i2)
Chris@16 92 { return i.equal(i2); }
Chris@16 93
Chris@16 94 friend bool operator!= (const transform_iterator& i, const transform_iterator& i2)
Chris@16 95 { return !(i == i2); }
Chris@16 96
Chris@16 97 /*
Chris@16 98 friend bool operator> (const transform_iterator& i, const transform_iterator& i2)
Chris@16 99 { return i2 < i; }
Chris@16 100
Chris@16 101 friend bool operator<= (const transform_iterator& i, const transform_iterator& i2)
Chris@16 102 { return !(i > i2); }
Chris@16 103
Chris@16 104 friend bool operator>= (const transform_iterator& i, const transform_iterator& i2)
Chris@16 105 { return !(i < i2); }
Chris@16 106 */
Chris@16 107 friend typename Iterator::difference_type operator- (const transform_iterator& i, const transform_iterator& i2)
Chris@16 108 { return i2.distance_to(i); }
Chris@16 109
Chris@16 110 //Arithmetic
Chris@16 111 transform_iterator& operator+=(typename Iterator::difference_type off)
Chris@16 112 { this->advance(off); return *this; }
Chris@16 113
Chris@16 114 transform_iterator operator+(typename Iterator::difference_type off) const
Chris@16 115 {
Chris@16 116 transform_iterator other(*this);
Chris@16 117 other.advance(off);
Chris@16 118 return other;
Chris@16 119 }
Chris@16 120
Chris@16 121 friend transform_iterator operator+(typename Iterator::difference_type off, const transform_iterator& right)
Chris@16 122 { return right + off; }
Chris@16 123
Chris@16 124 transform_iterator& operator-=(typename Iterator::difference_type off)
Chris@16 125 { this->advance(-off); return *this; }
Chris@16 126
Chris@16 127 transform_iterator operator-(typename Iterator::difference_type off) const
Chris@16 128 { return *this + (-off); }
Chris@16 129
Chris@16 130 typename UnaryFunction::result_type operator*() const
Chris@16 131 { return dereference(); }
Chris@16 132
Chris@16 133 operator_arrow_proxy<typename UnaryFunction::result_type>
Chris@16 134 operator->() const
Chris@16 135 { return operator_arrow_proxy<typename UnaryFunction::result_type>(dereference()); }
Chris@16 136
Chris@16 137 Iterator & base()
Chris@16 138 { return m_it; }
Chris@16 139
Chris@16 140 const Iterator & base() const
Chris@16 141 { return m_it; }
Chris@16 142
Chris@16 143 private:
Chris@16 144 Iterator m_it;
Chris@16 145
Chris@16 146 void increment()
Chris@16 147 { ++m_it; }
Chris@16 148
Chris@16 149 void decrement()
Chris@16 150 { --m_it; }
Chris@16 151
Chris@16 152 bool equal(const transform_iterator &other) const
Chris@16 153 { return m_it == other.m_it; }
Chris@16 154
Chris@16 155 bool less(const transform_iterator &other) const
Chris@16 156 { return other.m_it < m_it; }
Chris@16 157
Chris@16 158 typename UnaryFunction::result_type dereference() const
Chris@16 159 { return UnaryFunction::operator()(*m_it); }
Chris@16 160
Chris@16 161 void advance(typename Iterator::difference_type n)
Chris@101 162 { boost::container::iterator_advance(m_it, n); }
Chris@16 163
Chris@16 164 typename Iterator::difference_type distance_to(const transform_iterator &other)const
Chris@101 165 { return boost::container::iterator_distance(other.m_it, m_it); }
Chris@16 166 };
Chris@16 167
Chris@16 168 template <class Iterator, class UnaryFunc>
Chris@16 169 transform_iterator<Iterator, UnaryFunc>
Chris@16 170 make_transform_iterator(Iterator it, UnaryFunc fun)
Chris@16 171 {
Chris@16 172 return transform_iterator<Iterator, UnaryFunc>(it, fun);
Chris@16 173 }
Chris@16 174
Chris@16 175 } //namespace container {
Chris@16 176 } //namespace boost {
Chris@16 177
Chris@16 178 #include <boost/container/detail/config_end.hpp>
Chris@16 179
Chris@16 180 #endif //#ifndef BOOST_CONTAINER_DETAIL_TRANSFORM_ITERATORS_HPP