annotate DEPENDENCIES/generic/include/boost/container/detail/iterators.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_ITERATORS_HPP
Chris@16 15 #define BOOST_CONTAINER_DETAIL_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/allocator_traits.hpp>
Chris@16 28 #include <boost/container/detail/type_traits.hpp>
Chris@16 29 #include <boost/static_assert.hpp>
Chris@101 30 #include <boost/move/utility_core.hpp>
Chris@101 31 #include <boost/intrusive/detail/reverse_iterator.hpp>
Chris@16 32
Chris@101 33 #if defined(BOOST_NO_CXX11_VARIADIC_TEMPLATES)
Chris@101 34 #include <boost/move/detail/fwd_macros.hpp>
Chris@101 35 #else
Chris@16 36 #include <boost/container/detail/variadic_templates_tools.hpp>
Chris@16 37 #endif
Chris@101 38 #include <boost/container/detail/iterator.hpp>
Chris@16 39
Chris@16 40 namespace boost {
Chris@16 41 namespace container {
Chris@16 42
Chris@16 43 template <class T, class Difference = std::ptrdiff_t>
Chris@16 44 class constant_iterator
Chris@101 45 : public ::boost::container::iterator
Chris@16 46 <std::random_access_iterator_tag, T, Difference, const T*, const T &>
Chris@16 47 {
Chris@16 48 typedef constant_iterator<T, Difference> this_type;
Chris@16 49
Chris@16 50 public:
Chris@16 51 explicit constant_iterator(const T &ref, Difference range_size)
Chris@16 52 : m_ptr(&ref), m_num(range_size){}
Chris@16 53
Chris@16 54 //Constructors
Chris@16 55 constant_iterator()
Chris@16 56 : m_ptr(0), m_num(0){}
Chris@16 57
Chris@16 58 constant_iterator& operator++()
Chris@16 59 { increment(); return *this; }
Chris@101 60
Chris@16 61 constant_iterator operator++(int)
Chris@16 62 {
Chris@16 63 constant_iterator result (*this);
Chris@16 64 increment();
Chris@16 65 return result;
Chris@16 66 }
Chris@16 67
Chris@16 68 constant_iterator& operator--()
Chris@16 69 { decrement(); return *this; }
Chris@101 70
Chris@16 71 constant_iterator operator--(int)
Chris@16 72 {
Chris@16 73 constant_iterator result (*this);
Chris@16 74 decrement();
Chris@16 75 return result;
Chris@16 76 }
Chris@16 77
Chris@16 78 friend bool operator== (const constant_iterator& i, const constant_iterator& i2)
Chris@16 79 { return i.equal(i2); }
Chris@16 80
Chris@16 81 friend bool operator!= (const constant_iterator& i, const constant_iterator& i2)
Chris@16 82 { return !(i == i2); }
Chris@16 83
Chris@16 84 friend bool operator< (const constant_iterator& i, const constant_iterator& i2)
Chris@16 85 { return i.less(i2); }
Chris@16 86
Chris@16 87 friend bool operator> (const constant_iterator& i, const constant_iterator& i2)
Chris@16 88 { return i2 < i; }
Chris@16 89
Chris@16 90 friend bool operator<= (const constant_iterator& i, const constant_iterator& i2)
Chris@16 91 { return !(i > i2); }
Chris@16 92
Chris@16 93 friend bool operator>= (const constant_iterator& i, const constant_iterator& i2)
Chris@16 94 { return !(i < i2); }
Chris@16 95
Chris@16 96 friend Difference operator- (const constant_iterator& i, const constant_iterator& i2)
Chris@16 97 { return i2.distance_to(i); }
Chris@16 98
Chris@16 99 //Arithmetic
Chris@16 100 constant_iterator& operator+=(Difference off)
Chris@16 101 { this->advance(off); return *this; }
Chris@16 102
Chris@16 103 constant_iterator operator+(Difference off) const
Chris@16 104 {
Chris@16 105 constant_iterator other(*this);
Chris@16 106 other.advance(off);
Chris@16 107 return other;
Chris@16 108 }
Chris@16 109
Chris@16 110 friend constant_iterator operator+(Difference off, const constant_iterator& right)
Chris@16 111 { return right + off; }
Chris@16 112
Chris@16 113 constant_iterator& operator-=(Difference off)
Chris@16 114 { this->advance(-off); return *this; }
Chris@16 115
Chris@16 116 constant_iterator operator-(Difference off) const
Chris@16 117 { return *this + (-off); }
Chris@16 118
Chris@16 119 const T& operator*() const
Chris@16 120 { return dereference(); }
Chris@16 121
Chris@16 122 const T& operator[] (Difference ) const
Chris@16 123 { return dereference(); }
Chris@16 124
Chris@16 125 const T* operator->() const
Chris@16 126 { return &(dereference()); }
Chris@16 127
Chris@16 128 private:
Chris@16 129 const T * m_ptr;
Chris@16 130 Difference m_num;
Chris@16 131
Chris@16 132 void increment()
Chris@16 133 { --m_num; }
Chris@16 134
Chris@16 135 void decrement()
Chris@16 136 { ++m_num; }
Chris@16 137
Chris@16 138 bool equal(const this_type &other) const
Chris@16 139 { return m_num == other.m_num; }
Chris@16 140
Chris@16 141 bool less(const this_type &other) const
Chris@16 142 { return other.m_num < m_num; }
Chris@16 143
Chris@16 144 const T & dereference() const
Chris@16 145 { return *m_ptr; }
Chris@16 146
Chris@16 147 void advance(Difference n)
Chris@16 148 { m_num -= n; }
Chris@16 149
Chris@16 150 Difference distance_to(const this_type &other)const
Chris@16 151 { return m_num - other.m_num; }
Chris@16 152 };
Chris@16 153
Chris@101 154 template <class T, class Difference>
Chris@16 155 class value_init_construct_iterator
Chris@101 156 : public ::boost::container::iterator
Chris@16 157 <std::random_access_iterator_tag, T, Difference, const T*, const T &>
Chris@16 158 {
Chris@16 159 typedef value_init_construct_iterator<T, Difference> this_type;
Chris@16 160
Chris@16 161 public:
Chris@16 162 explicit value_init_construct_iterator(Difference range_size)
Chris@16 163 : m_num(range_size){}
Chris@16 164
Chris@16 165 //Constructors
Chris@16 166 value_init_construct_iterator()
Chris@16 167 : m_num(0){}
Chris@16 168
Chris@16 169 value_init_construct_iterator& operator++()
Chris@16 170 { increment(); return *this; }
Chris@101 171
Chris@16 172 value_init_construct_iterator operator++(int)
Chris@16 173 {
Chris@16 174 value_init_construct_iterator result (*this);
Chris@16 175 increment();
Chris@16 176 return result;
Chris@16 177 }
Chris@16 178
Chris@16 179 value_init_construct_iterator& operator--()
Chris@16 180 { decrement(); return *this; }
Chris@101 181
Chris@16 182 value_init_construct_iterator operator--(int)
Chris@16 183 {
Chris@16 184 value_init_construct_iterator result (*this);
Chris@16 185 decrement();
Chris@16 186 return result;
Chris@16 187 }
Chris@16 188
Chris@16 189 friend bool operator== (const value_init_construct_iterator& i, const value_init_construct_iterator& i2)
Chris@16 190 { return i.equal(i2); }
Chris@16 191
Chris@16 192 friend bool operator!= (const value_init_construct_iterator& i, const value_init_construct_iterator& i2)
Chris@16 193 { return !(i == i2); }
Chris@16 194
Chris@16 195 friend bool operator< (const value_init_construct_iterator& i, const value_init_construct_iterator& i2)
Chris@16 196 { return i.less(i2); }
Chris@16 197
Chris@16 198 friend bool operator> (const value_init_construct_iterator& i, const value_init_construct_iterator& i2)
Chris@16 199 { return i2 < i; }
Chris@16 200
Chris@16 201 friend bool operator<= (const value_init_construct_iterator& i, const value_init_construct_iterator& i2)
Chris@16 202 { return !(i > i2); }
Chris@16 203
Chris@16 204 friend bool operator>= (const value_init_construct_iterator& i, const value_init_construct_iterator& i2)
Chris@16 205 { return !(i < i2); }
Chris@16 206
Chris@16 207 friend Difference operator- (const value_init_construct_iterator& i, const value_init_construct_iterator& i2)
Chris@16 208 { return i2.distance_to(i); }
Chris@16 209
Chris@16 210 //Arithmetic
Chris@16 211 value_init_construct_iterator& operator+=(Difference off)
Chris@16 212 { this->advance(off); return *this; }
Chris@16 213
Chris@16 214 value_init_construct_iterator operator+(Difference off) const
Chris@16 215 {
Chris@16 216 value_init_construct_iterator other(*this);
Chris@16 217 other.advance(off);
Chris@16 218 return other;
Chris@16 219 }
Chris@16 220
Chris@16 221 friend value_init_construct_iterator operator+(Difference off, const value_init_construct_iterator& right)
Chris@16 222 { return right + off; }
Chris@16 223
Chris@16 224 value_init_construct_iterator& operator-=(Difference off)
Chris@16 225 { this->advance(-off); return *this; }
Chris@16 226
Chris@16 227 value_init_construct_iterator operator-(Difference off) const
Chris@16 228 { return *this + (-off); }
Chris@16 229
Chris@16 230 //This pseudo-iterator's dereference operations have no sense since value is not
Chris@16 231 //constructed until ::boost::container::construct_in_place is called.
Chris@16 232 //So comment them to catch bad uses
Chris@16 233 //const T& operator*() const;
Chris@16 234 //const T& operator[](difference_type) const;
Chris@16 235 //const T* operator->() const;
Chris@16 236
Chris@16 237 private:
Chris@16 238 Difference m_num;
Chris@16 239
Chris@16 240 void increment()
Chris@16 241 { --m_num; }
Chris@16 242
Chris@16 243 void decrement()
Chris@16 244 { ++m_num; }
Chris@16 245
Chris@16 246 bool equal(const this_type &other) const
Chris@16 247 { return m_num == other.m_num; }
Chris@16 248
Chris@16 249 bool less(const this_type &other) const
Chris@16 250 { return other.m_num < m_num; }
Chris@16 251
Chris@16 252 const T & dereference() const
Chris@16 253 {
Chris@16 254 static T dummy;
Chris@16 255 return dummy;
Chris@16 256 }
Chris@16 257
Chris@16 258 void advance(Difference n)
Chris@16 259 { m_num -= n; }
Chris@16 260
Chris@16 261 Difference distance_to(const this_type &other)const
Chris@16 262 { return m_num - other.m_num; }
Chris@16 263 };
Chris@16 264
Chris@101 265 template <class T, class Difference>
Chris@16 266 class default_init_construct_iterator
Chris@101 267 : public ::boost::container::iterator
Chris@16 268 <std::random_access_iterator_tag, T, Difference, const T*, const T &>
Chris@16 269 {
Chris@16 270 typedef default_init_construct_iterator<T, Difference> this_type;
Chris@16 271
Chris@16 272 public:
Chris@16 273 explicit default_init_construct_iterator(Difference range_size)
Chris@16 274 : m_num(range_size){}
Chris@16 275
Chris@16 276 //Constructors
Chris@16 277 default_init_construct_iterator()
Chris@16 278 : m_num(0){}
Chris@16 279
Chris@16 280 default_init_construct_iterator& operator++()
Chris@16 281 { increment(); return *this; }
Chris@101 282
Chris@16 283 default_init_construct_iterator operator++(int)
Chris@16 284 {
Chris@16 285 default_init_construct_iterator result (*this);
Chris@16 286 increment();
Chris@16 287 return result;
Chris@16 288 }
Chris@16 289
Chris@16 290 default_init_construct_iterator& operator--()
Chris@16 291 { decrement(); return *this; }
Chris@101 292
Chris@16 293 default_init_construct_iterator operator--(int)
Chris@16 294 {
Chris@16 295 default_init_construct_iterator result (*this);
Chris@16 296 decrement();
Chris@16 297 return result;
Chris@16 298 }
Chris@16 299
Chris@16 300 friend bool operator== (const default_init_construct_iterator& i, const default_init_construct_iterator& i2)
Chris@16 301 { return i.equal(i2); }
Chris@16 302
Chris@16 303 friend bool operator!= (const default_init_construct_iterator& i, const default_init_construct_iterator& i2)
Chris@16 304 { return !(i == i2); }
Chris@16 305
Chris@16 306 friend bool operator< (const default_init_construct_iterator& i, const default_init_construct_iterator& i2)
Chris@16 307 { return i.less(i2); }
Chris@16 308
Chris@16 309 friend bool operator> (const default_init_construct_iterator& i, const default_init_construct_iterator& i2)
Chris@16 310 { return i2 < i; }
Chris@16 311
Chris@16 312 friend bool operator<= (const default_init_construct_iterator& i, const default_init_construct_iterator& i2)
Chris@16 313 { return !(i > i2); }
Chris@16 314
Chris@16 315 friend bool operator>= (const default_init_construct_iterator& i, const default_init_construct_iterator& i2)
Chris@16 316 { return !(i < i2); }
Chris@16 317
Chris@16 318 friend Difference operator- (const default_init_construct_iterator& i, const default_init_construct_iterator& i2)
Chris@16 319 { return i2.distance_to(i); }
Chris@16 320
Chris@16 321 //Arithmetic
Chris@16 322 default_init_construct_iterator& operator+=(Difference off)
Chris@16 323 { this->advance(off); return *this; }
Chris@16 324
Chris@16 325 default_init_construct_iterator operator+(Difference off) const
Chris@16 326 {
Chris@16 327 default_init_construct_iterator other(*this);
Chris@16 328 other.advance(off);
Chris@16 329 return other;
Chris@16 330 }
Chris@16 331
Chris@16 332 friend default_init_construct_iterator operator+(Difference off, const default_init_construct_iterator& right)
Chris@16 333 { return right + off; }
Chris@16 334
Chris@16 335 default_init_construct_iterator& operator-=(Difference off)
Chris@16 336 { this->advance(-off); return *this; }
Chris@16 337
Chris@16 338 default_init_construct_iterator operator-(Difference off) const
Chris@16 339 { return *this + (-off); }
Chris@16 340
Chris@16 341 //This pseudo-iterator's dereference operations have no sense since value is not
Chris@16 342 //constructed until ::boost::container::construct_in_place is called.
Chris@16 343 //So comment them to catch bad uses
Chris@16 344 //const T& operator*() const;
Chris@16 345 //const T& operator[](difference_type) const;
Chris@16 346 //const T* operator->() const;
Chris@16 347
Chris@16 348 private:
Chris@16 349 Difference m_num;
Chris@16 350
Chris@16 351 void increment()
Chris@16 352 { --m_num; }
Chris@16 353
Chris@16 354 void decrement()
Chris@16 355 { ++m_num; }
Chris@16 356
Chris@16 357 bool equal(const this_type &other) const
Chris@16 358 { return m_num == other.m_num; }
Chris@16 359
Chris@16 360 bool less(const this_type &other) const
Chris@16 361 { return other.m_num < m_num; }
Chris@16 362
Chris@16 363 const T & dereference() const
Chris@16 364 {
Chris@16 365 static T dummy;
Chris@16 366 return dummy;
Chris@16 367 }
Chris@16 368
Chris@16 369 void advance(Difference n)
Chris@16 370 { m_num -= n; }
Chris@16 371
Chris@16 372 Difference distance_to(const this_type &other)const
Chris@16 373 { return m_num - other.m_num; }
Chris@16 374 };
Chris@16 375
Chris@16 376
Chris@16 377 template <class T, class Difference = std::ptrdiff_t>
Chris@16 378 class repeat_iterator
Chris@101 379 : public ::boost::container::iterator
Chris@16 380 <std::random_access_iterator_tag, T, Difference>
Chris@16 381 {
Chris@16 382 typedef repeat_iterator<T, Difference> this_type;
Chris@16 383 public:
Chris@16 384 explicit repeat_iterator(T &ref, Difference range_size)
Chris@16 385 : m_ptr(&ref), m_num(range_size){}
Chris@16 386
Chris@16 387 //Constructors
Chris@16 388 repeat_iterator()
Chris@16 389 : m_ptr(0), m_num(0){}
Chris@16 390
Chris@16 391 this_type& operator++()
Chris@16 392 { increment(); return *this; }
Chris@101 393
Chris@16 394 this_type operator++(int)
Chris@16 395 {
Chris@16 396 this_type result (*this);
Chris@16 397 increment();
Chris@16 398 return result;
Chris@16 399 }
Chris@16 400
Chris@16 401 this_type& operator--()
Chris@16 402 { increment(); return *this; }
Chris@101 403
Chris@16 404 this_type operator--(int)
Chris@16 405 {
Chris@16 406 this_type result (*this);
Chris@16 407 increment();
Chris@16 408 return result;
Chris@16 409 }
Chris@16 410
Chris@16 411 friend bool operator== (const this_type& i, const this_type& i2)
Chris@16 412 { return i.equal(i2); }
Chris@16 413
Chris@16 414 friend bool operator!= (const this_type& i, const this_type& i2)
Chris@16 415 { return !(i == i2); }
Chris@16 416
Chris@16 417 friend bool operator< (const this_type& i, const this_type& i2)
Chris@16 418 { return i.less(i2); }
Chris@16 419
Chris@16 420 friend bool operator> (const this_type& i, const this_type& i2)
Chris@16 421 { return i2 < i; }
Chris@16 422
Chris@16 423 friend bool operator<= (const this_type& i, const this_type& i2)
Chris@16 424 { return !(i > i2); }
Chris@16 425
Chris@16 426 friend bool operator>= (const this_type& i, const this_type& i2)
Chris@16 427 { return !(i < i2); }
Chris@16 428
Chris@16 429 friend Difference operator- (const this_type& i, const this_type& i2)
Chris@16 430 { return i2.distance_to(i); }
Chris@16 431
Chris@16 432 //Arithmetic
Chris@16 433 this_type& operator+=(Difference off)
Chris@16 434 { this->advance(off); return *this; }
Chris@16 435
Chris@16 436 this_type operator+(Difference off) const
Chris@16 437 {
Chris@16 438 this_type other(*this);
Chris@16 439 other.advance(off);
Chris@16 440 return other;
Chris@16 441 }
Chris@16 442
Chris@16 443 friend this_type operator+(Difference off, const this_type& right)
Chris@16 444 { return right + off; }
Chris@16 445
Chris@16 446 this_type& operator-=(Difference off)
Chris@16 447 { this->advance(-off); return *this; }
Chris@16 448
Chris@16 449 this_type operator-(Difference off) const
Chris@16 450 { return *this + (-off); }
Chris@16 451
Chris@16 452 T& operator*() const
Chris@16 453 { return dereference(); }
Chris@16 454
Chris@16 455 T& operator[] (Difference ) const
Chris@16 456 { return dereference(); }
Chris@16 457
Chris@16 458 T *operator->() const
Chris@16 459 { return &(dereference()); }
Chris@16 460
Chris@16 461 private:
Chris@16 462 T * m_ptr;
Chris@16 463 Difference m_num;
Chris@16 464
Chris@16 465 void increment()
Chris@16 466 { --m_num; }
Chris@16 467
Chris@16 468 void decrement()
Chris@16 469 { ++m_num; }
Chris@16 470
Chris@16 471 bool equal(const this_type &other) const
Chris@16 472 { return m_num == other.m_num; }
Chris@16 473
Chris@16 474 bool less(const this_type &other) const
Chris@16 475 { return other.m_num < m_num; }
Chris@16 476
Chris@16 477 T & dereference() const
Chris@16 478 { return *m_ptr; }
Chris@16 479
Chris@16 480 void advance(Difference n)
Chris@16 481 { m_num -= n; }
Chris@16 482
Chris@16 483 Difference distance_to(const this_type &other)const
Chris@16 484 { return m_num - other.m_num; }
Chris@16 485 };
Chris@16 486
Chris@16 487 template <class T, class EmplaceFunctor, class Difference /*= std::ptrdiff_t*/>
Chris@16 488 class emplace_iterator
Chris@101 489 : public ::boost::container::iterator
Chris@16 490 <std::random_access_iterator_tag, T, Difference, const T*, const T &>
Chris@16 491 {
Chris@16 492 typedef emplace_iterator this_type;
Chris@16 493
Chris@16 494 public:
Chris@16 495 typedef Difference difference_type;
Chris@16 496 explicit emplace_iterator(EmplaceFunctor&e)
Chris@16 497 : m_num(1), m_pe(&e){}
Chris@16 498
Chris@16 499 emplace_iterator()
Chris@16 500 : m_num(0), m_pe(0){}
Chris@16 501
Chris@16 502 this_type& operator++()
Chris@16 503 { increment(); return *this; }
Chris@101 504
Chris@16 505 this_type operator++(int)
Chris@16 506 {
Chris@16 507 this_type result (*this);
Chris@16 508 increment();
Chris@16 509 return result;
Chris@16 510 }
Chris@16 511
Chris@16 512 this_type& operator--()
Chris@16 513 { decrement(); return *this; }
Chris@101 514
Chris@16 515 this_type operator--(int)
Chris@16 516 {
Chris@16 517 this_type result (*this);
Chris@16 518 decrement();
Chris@16 519 return result;
Chris@16 520 }
Chris@16 521
Chris@16 522 friend bool operator== (const this_type& i, const this_type& i2)
Chris@16 523 { return i.equal(i2); }
Chris@16 524
Chris@16 525 friend bool operator!= (const this_type& i, const this_type& i2)
Chris@16 526 { return !(i == i2); }
Chris@16 527
Chris@16 528 friend bool operator< (const this_type& i, const this_type& i2)
Chris@16 529 { return i.less(i2); }
Chris@16 530
Chris@16 531 friend bool operator> (const this_type& i, const this_type& i2)
Chris@16 532 { return i2 < i; }
Chris@16 533
Chris@16 534 friend bool operator<= (const this_type& i, const this_type& i2)
Chris@16 535 { return !(i > i2); }
Chris@16 536
Chris@16 537 friend bool operator>= (const this_type& i, const this_type& i2)
Chris@16 538 { return !(i < i2); }
Chris@16 539
Chris@16 540 friend difference_type operator- (const this_type& i, const this_type& i2)
Chris@16 541 { return i2.distance_to(i); }
Chris@16 542
Chris@16 543 //Arithmetic
Chris@16 544 this_type& operator+=(difference_type off)
Chris@16 545 { this->advance(off); return *this; }
Chris@16 546
Chris@16 547 this_type operator+(difference_type off) const
Chris@16 548 {
Chris@16 549 this_type other(*this);
Chris@16 550 other.advance(off);
Chris@16 551 return other;
Chris@16 552 }
Chris@16 553
Chris@16 554 friend this_type operator+(difference_type off, const this_type& right)
Chris@16 555 { return right + off; }
Chris@16 556
Chris@16 557 this_type& operator-=(difference_type off)
Chris@16 558 { this->advance(-off); return *this; }
Chris@16 559
Chris@16 560 this_type operator-(difference_type off) const
Chris@16 561 { return *this + (-off); }
Chris@16 562
Chris@16 563 //This pseudo-iterator's dereference operations have no sense since value is not
Chris@16 564 //constructed until ::boost::container::construct_in_place is called.
Chris@16 565 //So comment them to catch bad uses
Chris@16 566 //const T& operator*() const;
Chris@16 567 //const T& operator[](difference_type) const;
Chris@16 568 //const T* operator->() const;
Chris@16 569
Chris@101 570 template<class Allocator>
Chris@101 571 void construct_in_place(Allocator &a, T* ptr)
Chris@16 572 { (*m_pe)(a, ptr); }
Chris@16 573
Chris@16 574 private:
Chris@16 575 difference_type m_num;
Chris@16 576 EmplaceFunctor * m_pe;
Chris@16 577
Chris@16 578 void increment()
Chris@16 579 { --m_num; }
Chris@16 580
Chris@16 581 void decrement()
Chris@16 582 { ++m_num; }
Chris@16 583
Chris@16 584 bool equal(const this_type &other) const
Chris@16 585 { return m_num == other.m_num; }
Chris@16 586
Chris@16 587 bool less(const this_type &other) const
Chris@16 588 { return other.m_num < m_num; }
Chris@16 589
Chris@16 590 const T & dereference() const
Chris@16 591 {
Chris@16 592 static T dummy;
Chris@16 593 return dummy;
Chris@16 594 }
Chris@16 595
Chris@16 596 void advance(difference_type n)
Chris@16 597 { m_num -= n; }
Chris@16 598
Chris@16 599 difference_type distance_to(const this_type &other)const
Chris@16 600 { return difference_type(m_num - other.m_num); }
Chris@16 601 };
Chris@16 602
Chris@101 603 #if !defined(BOOST_NO_CXX11_VARIADIC_TEMPLATES)
Chris@16 604
Chris@16 605 template<class ...Args>
Chris@16 606 struct emplace_functor
Chris@16 607 {
Chris@16 608 typedef typename container_detail::build_number_seq<sizeof...(Args)>::type index_tuple_t;
Chris@16 609
Chris@101 610 emplace_functor(BOOST_FWD_REF(Args)... args)
Chris@16 611 : args_(args...)
Chris@16 612 {}
Chris@16 613
Chris@101 614 template<class Allocator, class T>
Chris@101 615 void operator()(Allocator &a, T *ptr)
Chris@16 616 { emplace_functor::inplace_impl(a, ptr, index_tuple_t()); }
Chris@16 617
Chris@101 618 template<class Allocator, class T, int ...IdxPack>
Chris@101 619 void inplace_impl(Allocator &a, T* ptr, const container_detail::index_tuple<IdxPack...>&)
Chris@16 620 {
Chris@101 621 allocator_traits<Allocator>::construct
Chris@16 622 (a, ptr, ::boost::forward<Args>(container_detail::get<IdxPack>(args_))...);
Chris@16 623 }
Chris@16 624
Chris@16 625 container_detail::tuple<Args&...> args_;
Chris@16 626 };
Chris@16 627
Chris@101 628 #else // !defined(BOOST_NO_CXX11_VARIADIC_TEMPLATES)
Chris@16 629
Chris@101 630 #define BOOST_MOVE_ITERATOR_EMPLACE_FUNCTOR_CODE(N) \
Chris@101 631 BOOST_MOVE_TMPL_LT##N BOOST_MOVE_CLASS##N BOOST_MOVE_GT##N \
Chris@101 632 struct emplace_functor##N\
Chris@101 633 {\
Chris@101 634 explicit emplace_functor##N( BOOST_MOVE_UREF##N )\
Chris@101 635 BOOST_MOVE_COLON##N BOOST_MOVE_FWD_INIT##N{}\
Chris@101 636 \
Chris@101 637 template<class Allocator, class T>\
Chris@101 638 void operator()(Allocator &a, T *ptr)\
Chris@101 639 { allocator_traits<Allocator>::construct(a, ptr BOOST_MOVE_I##N BOOST_MOVE_MFWD##N); }\
Chris@101 640 \
Chris@101 641 BOOST_MOVE_MREF##N\
Chris@101 642 };\
Chris@101 643 //
Chris@101 644 BOOST_MOVE_ITERATE_0TO9(BOOST_MOVE_ITERATOR_EMPLACE_FUNCTOR_CODE)
Chris@101 645 #undef BOOST_MOVE_ITERATOR_EMPLACE_FUNCTOR_CODE
Chris@16 646
Chris@16 647 #endif
Chris@16 648
Chris@16 649 namespace container_detail {
Chris@16 650
Chris@16 651 template<class T>
Chris@16 652 struct has_iterator_category
Chris@16 653 {
Chris@16 654 template <typename X>
Chris@16 655 static char test(int, typename X::iterator_category*);
Chris@16 656
Chris@16 657 template <typename X>
Chris@16 658 static int test(int, ...);
Chris@16 659
Chris@16 660 static const bool value = (1 == sizeof(test<T>(0, 0)));
Chris@16 661 };
Chris@16 662
Chris@16 663
Chris@16 664 template<class T, bool = has_iterator_category<T>::value >
Chris@16 665 struct is_input_iterator
Chris@16 666 {
Chris@16 667 static const bool value = is_same<typename T::iterator_category, std::input_iterator_tag>::value;
Chris@16 668 };
Chris@16 669
Chris@16 670 template<class T>
Chris@16 671 struct is_input_iterator<T, false>
Chris@16 672 {
Chris@16 673 static const bool value = false;
Chris@16 674 };
Chris@16 675
Chris@16 676 template<class T, bool = has_iterator_category<T>::value >
Chris@16 677 struct is_forward_iterator
Chris@16 678 {
Chris@16 679 static const bool value = is_same<typename T::iterator_category, std::forward_iterator_tag>::value;
Chris@16 680 };
Chris@16 681
Chris@16 682 template<class T>
Chris@16 683 struct is_forward_iterator<T, false>
Chris@16 684 {
Chris@16 685 static const bool value = false;
Chris@16 686 };
Chris@16 687
Chris@16 688 template<class T, bool = has_iterator_category<T>::value >
Chris@16 689 struct is_bidirectional_iterator
Chris@16 690 {
Chris@16 691 static const bool value = is_same<typename T::iterator_category, std::bidirectional_iterator_tag>::value;
Chris@16 692 };
Chris@16 693
Chris@16 694 template<class T>
Chris@16 695 struct is_bidirectional_iterator<T, false>
Chris@16 696 {
Chris@16 697 static const bool value = false;
Chris@16 698 };
Chris@16 699
Chris@101 700 template<class IINodeType>
Chris@101 701 struct iiterator_node_value_type {
Chris@101 702 typedef typename IINodeType::value_type type;
Chris@101 703 };
Chris@101 704
Chris@16 705 template<class IIterator>
Chris@16 706 struct iiterator_types
Chris@16 707 {
Chris@16 708 typedef typename IIterator::value_type it_value_type;
Chris@101 709 typedef typename iiterator_node_value_type<it_value_type>::type value_type;
Chris@101 710 typedef typename boost::container::iterator_traits<IIterator>::pointer it_pointer;
Chris@101 711 typedef typename boost::container::iterator_traits<IIterator>::difference_type difference_type;
Chris@16 712 typedef typename ::boost::intrusive::pointer_traits<it_pointer>::
Chris@16 713 template rebind_pointer<value_type>::type pointer;
Chris@16 714 typedef typename ::boost::intrusive::pointer_traits<it_pointer>::
Chris@16 715 template rebind_pointer<const value_type>::type const_pointer;
Chris@16 716 typedef typename ::boost::intrusive::
Chris@16 717 pointer_traits<pointer>::reference reference;
Chris@16 718 typedef typename ::boost::intrusive::
Chris@16 719 pointer_traits<const_pointer>::reference const_reference;
Chris@16 720 typedef typename IIterator::iterator_category iterator_category;
Chris@16 721 };
Chris@16 722
Chris@16 723 template<class IIterator, bool IsConst>
Chris@101 724 struct iterator_types
Chris@16 725 {
Chris@101 726 typedef typename ::boost::container::iterator
Chris@16 727 < typename iiterator_types<IIterator>::iterator_category
Chris@16 728 , typename iiterator_types<IIterator>::value_type
Chris@16 729 , typename iiterator_types<IIterator>::difference_type
Chris@16 730 , typename iiterator_types<IIterator>::const_pointer
Chris@16 731 , typename iiterator_types<IIterator>::const_reference> type;
Chris@16 732 };
Chris@16 733
Chris@16 734 template<class IIterator>
Chris@101 735 struct iterator_types<IIterator, false>
Chris@16 736 {
Chris@101 737 typedef typename ::boost::container::iterator
Chris@16 738 < typename iiterator_types<IIterator>::iterator_category
Chris@16 739 , typename iiterator_types<IIterator>::value_type
Chris@16 740 , typename iiterator_types<IIterator>::difference_type
Chris@16 741 , typename iiterator_types<IIterator>::pointer
Chris@16 742 , typename iiterator_types<IIterator>::reference> type;
Chris@16 743 };
Chris@16 744
Chris@16 745 template<class IIterator, bool IsConst>
Chris@101 746 class iterator_from_iiterator
Chris@16 747 {
Chris@101 748 typedef typename iterator_types<IIterator, IsConst>::type types_t;
Chris@16 749
Chris@16 750 public:
Chris@101 751 typedef typename types_t::pointer pointer;
Chris@101 752 typedef typename types_t::reference reference;
Chris@101 753 typedef typename types_t::difference_type difference_type;
Chris@101 754 typedef typename types_t::iterator_category iterator_category;
Chris@101 755 typedef typename types_t::value_type value_type;
Chris@16 756
Chris@101 757 iterator_from_iiterator()
Chris@16 758 {}
Chris@16 759
Chris@101 760 explicit iterator_from_iiterator(IIterator iit) BOOST_NOEXCEPT_OR_NOTHROW
Chris@16 761 : m_iit(iit)
Chris@16 762 {}
Chris@16 763
Chris@101 764 iterator_from_iiterator(iterator_from_iiterator<IIterator, false> const& other) BOOST_NOEXCEPT_OR_NOTHROW
Chris@16 765 : m_iit(other.get())
Chris@16 766 {}
Chris@16 767
Chris@101 768 iterator_from_iiterator& operator++() BOOST_NOEXCEPT_OR_NOTHROW
Chris@16 769 { ++this->m_iit; return *this; }
Chris@16 770
Chris@101 771 iterator_from_iiterator operator++(int) BOOST_NOEXCEPT_OR_NOTHROW
Chris@16 772 {
Chris@101 773 iterator_from_iiterator result (*this);
Chris@16 774 ++this->m_iit;
Chris@16 775 return result;
Chris@16 776 }
Chris@16 777
Chris@101 778 iterator_from_iiterator& operator--() BOOST_NOEXCEPT_OR_NOTHROW
Chris@16 779 {
Chris@101 780 //If the iterator_from_iiterator is not a bidirectional iterator, operator-- should not exist
Chris@101 781 BOOST_STATIC_ASSERT((is_bidirectional_iterator<iterator_from_iiterator>::value));
Chris@16 782 --this->m_iit; return *this;
Chris@16 783 }
Chris@16 784
Chris@101 785 iterator_from_iiterator operator--(int) BOOST_NOEXCEPT_OR_NOTHROW
Chris@16 786 {
Chris@101 787 iterator_from_iiterator result (*this);
Chris@16 788 --this->m_iit;
Chris@16 789 return result;
Chris@16 790 }
Chris@16 791
Chris@101 792 friend bool operator== (const iterator_from_iiterator& l, const iterator_from_iiterator& r) BOOST_NOEXCEPT_OR_NOTHROW
Chris@16 793 { return l.m_iit == r.m_iit; }
Chris@16 794
Chris@101 795 friend bool operator!= (const iterator_from_iiterator& l, const iterator_from_iiterator& r) BOOST_NOEXCEPT_OR_NOTHROW
Chris@16 796 { return !(l == r); }
Chris@16 797
Chris@101 798 reference operator*() const BOOST_NOEXCEPT_OR_NOTHROW
Chris@16 799 { return (*this->m_iit).get_data(); }
Chris@16 800
Chris@101 801 pointer operator->() const BOOST_NOEXCEPT_OR_NOTHROW
Chris@16 802 { return ::boost::intrusive::pointer_traits<pointer>::pointer_to(this->operator*()); }
Chris@16 803
Chris@101 804 const IIterator &get() const BOOST_NOEXCEPT_OR_NOTHROW
Chris@16 805 { return this->m_iit; }
Chris@16 806
Chris@16 807 private:
Chris@16 808 IIterator m_iit;
Chris@16 809 };
Chris@16 810
Chris@16 811 } //namespace container_detail {
Chris@101 812
Chris@101 813 using ::boost::intrusive::reverse_iterator;
Chris@101 814
Chris@16 815 } //namespace container {
Chris@16 816 } //namespace boost {
Chris@16 817
Chris@16 818 #include <boost/container/detail/config_end.hpp>
Chris@16 819
Chris@16 820 #endif //#ifndef BOOST_CONTAINER_DETAIL_ITERATORS_HPP