annotate DEPENDENCIES/generic/include/boost/move/iterator.hpp @ 16:2665513ce2d3

Add boost headers
author Chris Cannam
date Tue, 05 Aug 2014 11:11:38 +0100
parents
children c530137014c0
rev   line source
Chris@16 1 //////////////////////////////////////////////////////////////////////////////
Chris@16 2 //
Chris@16 3 // (C) Copyright Ion Gaztanaga 2012-2012.
Chris@16 4 // Distributed under the Boost Software License, Version 1.0.
Chris@16 5 // (See accompanying file LICENSE_1_0.txt or copy at
Chris@16 6 // http://www.boost.org/LICENSE_1_0.txt)
Chris@16 7 //
Chris@16 8 // See http://www.boost.org/libs/move for documentation.
Chris@16 9 //
Chris@16 10 //////////////////////////////////////////////////////////////////////////////
Chris@16 11
Chris@16 12 //! \file
Chris@16 13
Chris@16 14 #ifndef BOOST_MOVE_ITERATOR_HPP
Chris@16 15 #define BOOST_MOVE_ITERATOR_HPP
Chris@16 16
Chris@16 17 #include <boost/move/detail/config_begin.hpp>
Chris@16 18 #include <boost/move/utility.hpp>
Chris@16 19 #include <iterator> //std::iterator
Chris@16 20
Chris@16 21 namespace boost {
Chris@16 22
Chris@16 23 //////////////////////////////////////////////////////////////////////////////
Chris@16 24 //
Chris@16 25 // move_iterator
Chris@16 26 //
Chris@16 27 //////////////////////////////////////////////////////////////////////////////
Chris@16 28
Chris@16 29 //! Class template move_iterator is an iterator adaptor with the same behavior
Chris@16 30 //! as the underlying iterator except that its dereference operator implicitly
Chris@16 31 //! converts the value returned by the underlying iterator's dereference operator
Chris@16 32 //! to an rvalue reference. Some generic algorithms can be called with move
Chris@16 33 //! iterators to replace copying with moving.
Chris@16 34 template <class It>
Chris@16 35 class move_iterator
Chris@16 36 {
Chris@16 37 public:
Chris@16 38 typedef It iterator_type;
Chris@16 39 typedef typename std::iterator_traits<iterator_type>::value_type value_type;
Chris@16 40 #if !defined(BOOST_NO_CXX11_RVALUE_REFERENCES) || defined(BOOST_MOVE_DOXYGEN_INVOKED)
Chris@16 41 typedef value_type && reference;
Chris@16 42 #else
Chris@16 43 typedef typename ::boost::move_detail::if_
Chris@16 44 < ::boost::has_move_emulation_enabled<value_type>
Chris@16 45 , ::boost::rv<value_type>&
Chris@16 46 , value_type & >::type reference;
Chris@16 47 #endif
Chris@16 48 typedef It pointer;
Chris@16 49 typedef typename std::iterator_traits<iterator_type>::difference_type difference_type;
Chris@16 50 typedef typename std::iterator_traits<iterator_type>::iterator_category iterator_category;
Chris@16 51
Chris@16 52 move_iterator()
Chris@16 53 {}
Chris@16 54
Chris@16 55 explicit move_iterator(It i)
Chris@16 56 : m_it(i)
Chris@16 57 {}
Chris@16 58
Chris@16 59 template <class U>
Chris@16 60 move_iterator(const move_iterator<U>& u)
Chris@16 61 : m_it(u.base())
Chris@16 62 {}
Chris@16 63
Chris@16 64 iterator_type base() const
Chris@16 65 { return m_it; }
Chris@16 66
Chris@16 67 reference operator*() const
Chris@16 68 {
Chris@16 69 #if defined(BOOST_NO_CXX11_RVALUE_REFERENCES) || defined(BOOST_MOVE_OLD_RVALUE_REF_BINDING_RULES)
Chris@16 70 return *m_it;
Chris@16 71 #else
Chris@16 72 return ::boost::move(*m_it);
Chris@16 73 #endif
Chris@16 74 }
Chris@16 75
Chris@16 76 pointer operator->() const
Chris@16 77 { return m_it; }
Chris@16 78
Chris@16 79 move_iterator& operator++()
Chris@16 80 { ++m_it; return *this; }
Chris@16 81
Chris@16 82 move_iterator<iterator_type> operator++(int)
Chris@16 83 { move_iterator<iterator_type> tmp(*this); ++(*this); return tmp; }
Chris@16 84
Chris@16 85 move_iterator& operator--()
Chris@16 86 { --m_it; return *this; }
Chris@16 87
Chris@16 88 move_iterator<iterator_type> operator--(int)
Chris@16 89 { move_iterator<iterator_type> tmp(*this); --(*this); return tmp; }
Chris@16 90
Chris@16 91 move_iterator<iterator_type> operator+ (difference_type n) const
Chris@16 92 { return move_iterator<iterator_type>(m_it + n); }
Chris@16 93
Chris@16 94 move_iterator& operator+=(difference_type n)
Chris@16 95 { m_it += n; return *this; }
Chris@16 96
Chris@16 97 move_iterator<iterator_type> operator- (difference_type n) const
Chris@16 98 { return move_iterator<iterator_type>(m_it - n); }
Chris@16 99
Chris@16 100 move_iterator& operator-=(difference_type n)
Chris@16 101 { m_it -= n; return *this; }
Chris@16 102
Chris@16 103 reference operator[](difference_type n) const
Chris@16 104 {
Chris@16 105 #if defined(BOOST_NO_CXX11_RVALUE_REFERENCES) || defined(BOOST_MOVE_OLD_RVALUE_REF_BINDING_RULES)
Chris@16 106 return m_it[n];
Chris@16 107 #else
Chris@16 108 return ::boost::move(m_it[n]);
Chris@16 109 #endif
Chris@16 110 }
Chris@16 111
Chris@16 112 friend bool operator==(const move_iterator& x, const move_iterator& y)
Chris@16 113 { return x.base() == y.base(); }
Chris@16 114
Chris@16 115 friend bool operator!=(const move_iterator& x, const move_iterator& y)
Chris@16 116 { return x.base() != y.base(); }
Chris@16 117
Chris@16 118 friend bool operator< (const move_iterator& x, const move_iterator& y)
Chris@16 119 { return x.base() < y.base(); }
Chris@16 120
Chris@16 121 friend bool operator<=(const move_iterator& x, const move_iterator& y)
Chris@16 122 { return x.base() <= y.base(); }
Chris@16 123
Chris@16 124 friend bool operator> (const move_iterator& x, const move_iterator& y)
Chris@16 125 { return x.base() > y.base(); }
Chris@16 126
Chris@16 127 friend bool operator>=(const move_iterator& x, const move_iterator& y)
Chris@16 128 { return x.base() >= y.base(); }
Chris@16 129
Chris@16 130 friend difference_type operator-(const move_iterator& x, const move_iterator& y)
Chris@16 131 { return x.base() - y.base(); }
Chris@16 132
Chris@16 133 friend move_iterator operator+(difference_type n, const move_iterator& x)
Chris@16 134 { return move_iterator(x.base() + n); }
Chris@16 135
Chris@16 136 private:
Chris@16 137 It m_it;
Chris@16 138 };
Chris@16 139
Chris@16 140 //is_move_iterator
Chris@16 141 namespace move_detail {
Chris@16 142
Chris@16 143 template <class I>
Chris@16 144 struct is_move_iterator
Chris@16 145 : public ::boost::move_detail::integral_constant<bool, false>
Chris@16 146 {
Chris@16 147 };
Chris@16 148
Chris@16 149 template <class I>
Chris@16 150 struct is_move_iterator< ::boost::move_iterator<I> >
Chris@16 151 : public ::boost::move_detail::integral_constant<bool, true>
Chris@16 152 {
Chris@16 153 };
Chris@16 154
Chris@16 155 } //namespace move_detail {
Chris@16 156
Chris@16 157 //////////////////////////////////////////////////////////////////////////////
Chris@16 158 //
Chris@16 159 // move_iterator
Chris@16 160 //
Chris@16 161 //////////////////////////////////////////////////////////////////////////////
Chris@16 162
Chris@16 163 //!
Chris@16 164 //! <b>Returns</b>: move_iterator<It>(i).
Chris@16 165 template<class It>
Chris@16 166 inline move_iterator<It> make_move_iterator(const It &it)
Chris@16 167 { return move_iterator<It>(it); }
Chris@16 168
Chris@16 169 //////////////////////////////////////////////////////////////////////////////
Chris@16 170 //
Chris@16 171 // back_move_insert_iterator
Chris@16 172 //
Chris@16 173 //////////////////////////////////////////////////////////////////////////////
Chris@16 174
Chris@16 175
Chris@16 176 //! A move insert iterator that move constructs elements at the
Chris@16 177 //! back of a container
Chris@16 178 template <typename C> // C models Container
Chris@16 179 class back_move_insert_iterator
Chris@16 180 : public std::iterator<std::output_iterator_tag, void, void, void, void>
Chris@16 181 {
Chris@16 182 C* container_m;
Chris@16 183
Chris@16 184 public:
Chris@16 185 typedef C container_type;
Chris@16 186 typedef typename C::value_type value_type;
Chris@16 187 typedef typename C::reference reference;
Chris@16 188
Chris@16 189 explicit back_move_insert_iterator(C& x) : container_m(&x) { }
Chris@16 190
Chris@16 191 back_move_insert_iterator& operator=(reference x)
Chris@16 192 { container_m->push_back(boost::move(x)); return *this; }
Chris@16 193
Chris@16 194 back_move_insert_iterator& operator=(BOOST_RV_REF(value_type) x)
Chris@16 195 { reference rx = x; return this->operator=(rx); }
Chris@16 196
Chris@16 197 back_move_insert_iterator& operator*() { return *this; }
Chris@16 198 back_move_insert_iterator& operator++() { return *this; }
Chris@16 199 back_move_insert_iterator& operator++(int) { return *this; }
Chris@16 200 };
Chris@16 201
Chris@16 202 //!
Chris@16 203 //! <b>Returns</b>: back_move_insert_iterator<C>(x).
Chris@16 204 template <typename C> // C models Container
Chris@16 205 inline back_move_insert_iterator<C> back_move_inserter(C& x)
Chris@16 206 {
Chris@16 207 return back_move_insert_iterator<C>(x);
Chris@16 208 }
Chris@16 209
Chris@16 210 //////////////////////////////////////////////////////////////////////////////
Chris@16 211 //
Chris@16 212 // front_move_insert_iterator
Chris@16 213 //
Chris@16 214 //////////////////////////////////////////////////////////////////////////////
Chris@16 215
Chris@16 216 //! A move insert iterator that move constructs elements int the
Chris@16 217 //! front of a container
Chris@16 218 template <typename C> // C models Container
Chris@16 219 class front_move_insert_iterator
Chris@16 220 : public std::iterator<std::output_iterator_tag, void, void, void, void>
Chris@16 221 {
Chris@16 222 C* container_m;
Chris@16 223
Chris@16 224 public:
Chris@16 225 typedef C container_type;
Chris@16 226 typedef typename C::value_type value_type;
Chris@16 227 typedef typename C::reference reference;
Chris@16 228
Chris@16 229 explicit front_move_insert_iterator(C& x) : container_m(&x) { }
Chris@16 230
Chris@16 231 front_move_insert_iterator& operator=(reference x)
Chris@16 232 { container_m->push_front(boost::move(x)); return *this; }
Chris@16 233
Chris@16 234 front_move_insert_iterator& operator=(BOOST_RV_REF(value_type) x)
Chris@16 235 { reference rx = x; return this->operator=(rx); }
Chris@16 236
Chris@16 237 front_move_insert_iterator& operator*() { return *this; }
Chris@16 238 front_move_insert_iterator& operator++() { return *this; }
Chris@16 239 front_move_insert_iterator& operator++(int) { return *this; }
Chris@16 240 };
Chris@16 241
Chris@16 242 //!
Chris@16 243 //! <b>Returns</b>: front_move_insert_iterator<C>(x).
Chris@16 244 template <typename C> // C models Container
Chris@16 245 inline front_move_insert_iterator<C> front_move_inserter(C& x)
Chris@16 246 {
Chris@16 247 return front_move_insert_iterator<C>(x);
Chris@16 248 }
Chris@16 249
Chris@16 250 //////////////////////////////////////////////////////////////////////////////
Chris@16 251 //
Chris@16 252 // insert_move_iterator
Chris@16 253 //
Chris@16 254 //////////////////////////////////////////////////////////////////////////////
Chris@16 255 template <typename C> // C models Container
Chris@16 256 class move_insert_iterator
Chris@16 257 : public std::iterator<std::output_iterator_tag, void, void, void, void>
Chris@16 258 {
Chris@16 259 C* container_m;
Chris@16 260 typename C::iterator pos_;
Chris@16 261
Chris@16 262 public:
Chris@16 263 typedef C container_type;
Chris@16 264 typedef typename C::value_type value_type;
Chris@16 265 typedef typename C::reference reference;
Chris@16 266
Chris@16 267 explicit move_insert_iterator(C& x, typename C::iterator pos)
Chris@16 268 : container_m(&x), pos_(pos)
Chris@16 269 {}
Chris@16 270
Chris@16 271 move_insert_iterator& operator=(reference x)
Chris@16 272 {
Chris@16 273 pos_ = container_m->insert(pos_, ::boost::move(x));
Chris@16 274 ++pos_;
Chris@16 275 return *this;
Chris@16 276 }
Chris@16 277
Chris@16 278 move_insert_iterator& operator=(BOOST_RV_REF(value_type) x)
Chris@16 279 { reference rx = x; return this->operator=(rx); }
Chris@16 280
Chris@16 281 move_insert_iterator& operator*() { return *this; }
Chris@16 282 move_insert_iterator& operator++() { return *this; }
Chris@16 283 move_insert_iterator& operator++(int) { return *this; }
Chris@16 284 };
Chris@16 285
Chris@16 286 //!
Chris@16 287 //! <b>Returns</b>: move_insert_iterator<C>(x, it).
Chris@16 288 template <typename C> // C models Container
Chris@16 289 inline move_insert_iterator<C> move_inserter(C& x, typename C::iterator it)
Chris@16 290 {
Chris@16 291 return move_insert_iterator<C>(x, it);
Chris@16 292 }
Chris@16 293
Chris@16 294 } //namespace boost {
Chris@16 295
Chris@16 296 #include <boost/move/detail/config_end.hpp>
Chris@16 297
Chris@16 298 #endif //#ifndef BOOST_MOVE_ITERATOR_HPP