00001 #ifndef mm_sequence_iterator_h
00002 #define mm_sequence_iterator_h
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029 #if defined TAO_HAS_SEQUENCE_ITERATORS && TAO_HAS_SEQUENCE_ITERATORS == 1
00030
00031 namespace TAO
00032 {
00033
00034
00035 template<typename T>
00036 class MM_Sequence_Iterator;
00037
00038 template<typename T>
00039 class Const_MM_Sequence_Iterator;
00040
00041 template<typename T>
00042 class MM_Sequence_Reverse_Iterator;
00043
00044 template<typename T>
00045 class Const_MM_Sequence_Reverse_Iterator;
00046
00047
00048
00049
00050
00051
00052
00053 template <typename SEQUENCE_T>
00054 class MM_Sequence_Iterator
00055 {
00056 friend class Const_MM_Sequence_Iterator<SEQUENCE_T>;
00057
00058 public:
00059
00060 typedef std::random_access_iterator_tag iterator_category;
00061 typedef typename SEQUENCE_T::value_type value_type;
00062 typedef typename SEQUENCE_T::value_type *pointer;
00063 typedef typename SEQUENCE_T::value_type &reference;
00064 typedef typename SEQUENCE_T::element_type element_type;
00065 typedef typename SEQUENCE_T::const_element_type const_element_type;
00066 typedef typename SEQUENCE_T::allocation_traits allocation_traits;
00067 typedef typename SEQUENCE_T::element_traits element_traits;
00068 typedef typename SEQUENCE_T::implementation_type implementation_type;
00069 typedef CORBA::Long difference_type;
00070
00071
00072 MM_Sequence_Iterator (implementation_type *sequence,
00073 size_t pos = 0)
00074 : sequence_ (sequence),
00075 pos_ (pos)
00076 {
00077 }
00078
00079
00080 MM_Sequence_Iterator (MM_Sequence_Iterator<SEQUENCE_T> const & rhs)
00081 : sequence_ (rhs.sequence_),
00082 pos_ (rhs.pos_)
00083 {
00084 }
00085
00086
00087 MM_Sequence_Iterator & operator= (MM_Sequence_Iterator<SEQUENCE_T> const & rhs)
00088 {
00089 MM_Sequence_Iterator tmp(rhs);
00090 swap (tmp);
00091 return * this;
00092 }
00093
00094
00095 void swap(MM_Sequence_Iterator<SEQUENCE_T> & rhs)
00096 throw()
00097 {
00098 std::swap (sequence_, rhs.sequence_);
00099 std::swap (this->pos_, rhs.pos_);
00100 }
00101
00102
00103 operator Const_MM_Sequence_Iterator<SEQUENCE_T> ()
00104 {
00105 return Const_MM_Sequence_Iterator<SEQUENCE_T> (*this);
00106 }
00107
00108
00109
00110 element_type operator* (void)
00111 {
00112
00113 return element_type ((*(this->sequence_))[this->pos_],
00114 this->sequence_->release ());
00115 }
00116
00117
00118 const_element_type operator* (void) const
00119 {
00120
00121 return const_element_type ((*(this->sequence_))[this->pos_],
00122 this->sequence_->release ());
00123 }
00124
00125
00126 MM_Sequence_Iterator<SEQUENCE_T> &operator++ (void)
00127 {
00128
00129
00130 ++this->pos_;
00131 return *this;
00132 }
00133
00134
00135 MM_Sequence_Iterator<SEQUENCE_T> operator++ (int)
00136 {
00137
00138 MM_Sequence_Iterator<SEQUENCE_T> temp_iter (this->sequence_, this->pos_);
00139
00140
00141 ++this->pos_;
00142 return temp_iter;
00143 }
00144
00145
00146 MM_Sequence_Iterator<SEQUENCE_T> &operator-- (void)
00147 {
00148 --this->pos_;
00149 return *this;
00150 }
00151
00152
00153 MM_Sequence_Iterator<SEQUENCE_T> operator-- (int)
00154 {
00155
00156 MM_Sequence_Iterator<SEQUENCE_T> temp_iter (this->sequence_, this->pos_);
00157 --this->pos_;
00158 return temp_iter;
00159 }
00160
00161
00162 MM_Sequence_Iterator<SEQUENCE_T> &operator+= (difference_type n)
00163 {
00164
00165 this->pos_ += n;
00166 return *this;
00167 }
00168
00169
00170 MM_Sequence_Iterator<SEQUENCE_T> operator+ (difference_type n)
00171 {
00172
00173 return MM_Sequence_Iterator<SEQUENCE_T> (this->sequence_, this->pos_ + n);
00174 }
00175
00176
00177 MM_Sequence_Iterator<SEQUENCE_T> &operator-= (difference_type n)
00178 {
00179
00180 this->pos_ -= n;
00181 return *this;
00182 }
00183
00184
00185 MM_Sequence_Iterator<SEQUENCE_T> operator- (difference_type n)
00186 {
00187
00188 return MM_Sequence_Iterator<SEQUENCE_T> (this->sequence_, this->pos_ - n);
00189 }
00190
00191
00192 difference_type operator- (const MM_Sequence_Iterator<SEQUENCE_T> & rhs)
00193 {
00194
00195 return this->pos_ - rhs.pos_;
00196 }
00197
00198
00199 difference_type operator- (const Const_MM_Sequence_Iterator<SEQUENCE_T> & rhs)
00200 {
00201
00202 return this->pos_ - rhs.pos_;
00203 }
00204
00205
00206 element_type operator[] (difference_type n)
00207 {
00208
00209 return element_type ((*(this->sequence_))[this->pos_ + n],
00210 this->sequence_->release ());
00211 }
00212
00213
00214 const_element_type operator[] (difference_type n) const
00215 {
00216
00217 return const_element_type ((*(this->sequence_))[this->pos_ + n],
00218 this->sequence_->release ());
00219 }
00220
00221
00222 bool operator< (const MM_Sequence_Iterator<SEQUENCE_T> & rhs)
00223 {
00224
00225 return this->pos_ < rhs.pos_;
00226 }
00227
00228
00229 bool operator< (const Const_MM_Sequence_Iterator<SEQUENCE_T> & rhs)
00230 {
00231
00232 return this->pos_ < rhs.pos_;
00233 }
00234
00235
00236
00237 bool operator== (const MM_Sequence_Iterator<SEQUENCE_T> &rhs) const
00238 {
00239
00240 return this->sequence_ == rhs.sequence_
00241 && this->pos_ == rhs.pos_;
00242 }
00243
00244
00245 bool operator!= (const MM_Sequence_Iterator<SEQUENCE_T> &rhs) const
00246 {
00247 return !(*this == rhs);
00248 }
00249
00250 private:
00251
00252 implementation_type *sequence_;
00253
00254
00255 mutable difference_type pos_;
00256 };
00257
00258
00259
00260 template<typename SEQUENCE_T>
00261 MM_Sequence_Iterator<SEQUENCE_T>
00262 operator+ (typename MM_Sequence_Iterator<SEQUENCE_T>::difference_type n,
00263 const MM_Sequence_Iterator<SEQUENCE_T> & iter)
00264 {
00265
00266 return MM_Sequence_Iterator<SEQUENCE_T> (iter.sequence_, iter.pos_ + n);
00267 }
00268
00269
00270 template<typename SEQUENCE_T>
00271 MM_Sequence_Iterator<SEQUENCE_T> operator-
00272 (typename MM_Sequence_Iterator<SEQUENCE_T>::difference_type n,
00273 MM_Sequence_Iterator<SEQUENCE_T> iter)
00274 {
00275
00276 return MM_Sequence_Iterator<SEQUENCE_T> (iter.sequence_, iter.pos_ - n);
00277 }
00278
00279
00280
00281
00282
00283
00284
00285
00286
00287
00288
00289
00290 template <typename SEQUENCE_T>
00291 class Const_MM_Sequence_Iterator
00292 {
00293 friend class MM_Sequence_Iterator<SEQUENCE_T>;
00294
00295 public:
00296
00297 typedef std::random_access_iterator_tag iterator_category;
00298 typedef typename SEQUENCE_T::value_type value_type;
00299 typedef typename SEQUENCE_T::value_type *pointer;
00300 typedef typename SEQUENCE_T::value_type &reference;
00301 typedef typename SEQUENCE_T::const_element_type const_element_type;
00302 typedef typename SEQUENCE_T::allocation_traits allocation_traits;
00303 typedef typename SEQUENCE_T::element_traits element_traits;
00304 typedef typename SEQUENCE_T::implementation_type implementation_type;
00305 typedef int difference_type;
00306
00307
00308
00309 explicit Const_MM_Sequence_Iterator (const implementation_type *sequence,
00310 size_t pos = 0)
00311 : sequence_ (sequence),
00312 pos_ (pos)
00313 {
00314 }
00315
00316 virtual ~Const_MM_Sequence_Iterator ()
00317 {
00318 }
00319
00320
00321 Const_MM_Sequence_Iterator (
00322 Const_MM_Sequence_Iterator<SEQUENCE_T> const & rhs)
00323 : sequence_ (rhs.sequence_),
00324 pos_ (rhs.pos_)
00325 {
00326 }
00327
00328
00329 explicit Const_MM_Sequence_Iterator (
00330 MM_Sequence_Iterator<SEQUENCE_T> const & rhs)
00331 : sequence_ (rhs.sequence_),
00332 pos_ (rhs.pos_)
00333 {
00334 }
00335
00336
00337 Const_MM_Sequence_Iterator & operator= (
00338 Const_MM_Sequence_Iterator<SEQUENCE_T> const & rhs)
00339 {
00340 Const_MM_Sequence_Iterator tmp(rhs);
00341 swap (tmp);
00342 return * this;
00343 }
00344
00345
00346 void swap(Const_MM_Sequence_Iterator<SEQUENCE_T> & rhs)
00347 throw()
00348 {
00349 std::swap (sequence_, rhs.sequence_);
00350 std::swap (this->pos_, rhs.pos_);
00351 }
00352
00353
00354
00355 const_element_type operator* (void) const
00356 {
00357
00358 return const_element_type ((*(this->sequence_))[this->pos_],
00359 this->sequence_->release ());
00360 }
00361
00362
00363 const Const_MM_Sequence_Iterator<SEQUENCE_T> &operator++ (void) const
00364 {
00365
00366 ++this->pos_;
00367 return * this;
00368 }
00369
00370
00371 Const_MM_Sequence_Iterator<SEQUENCE_T> operator++ (int) const
00372 {
00373
00374 Const_MM_Sequence_Iterator<SEQUENCE_T> temp_iter (this->sequence_, this->pos_);
00375
00376
00377 ++this->pos_;
00378 return temp_iter;
00379 }
00380
00381
00382 const Const_MM_Sequence_Iterator<SEQUENCE_T> &operator-- (void) const
00383 {
00384 --this->pos_;
00385 return * this;
00386 }
00387
00388
00389 Const_MM_Sequence_Iterator<SEQUENCE_T> operator-- (int) const
00390 {
00391
00392 Const_MM_Sequence_Iterator<SEQUENCE_T> temp_iter (this->sequence_, this->pos_);
00393 --this->pos_;
00394 return temp_iter;
00395 }
00396
00397
00398 const Const_MM_Sequence_Iterator<SEQUENCE_T> &operator+= (difference_type n) const
00399 {
00400
00401 this->pos_ += n;
00402 return * this;
00403 }
00404
00405
00406 Const_MM_Sequence_Iterator<SEQUENCE_T> operator+ (difference_type n) const
00407 {
00408
00409 return Const_MM_Sequence_Iterator<SEQUENCE_T> (this->sequence_, this->pos_ + n);
00410 }
00411
00412
00413 const Const_MM_Sequence_Iterator<SEQUENCE_T> &operator-= (difference_type n) const
00414 {
00415
00416 this->pos_ -= n;
00417 return * this;
00418 }
00419
00420
00421 Const_MM_Sequence_Iterator<SEQUENCE_T> operator- (difference_type n) const
00422 {
00423
00424 return Const_MM_Sequence_Iterator<SEQUENCE_T> (this->sequence_, this->pos_ - n);
00425 }
00426
00427
00428 difference_type operator- (const Const_MM_Sequence_Iterator<SEQUENCE_T> & rhs) const
00429 {
00430
00431 return this->pos_ - rhs.pos_;
00432 }
00433
00434
00435 const_element_type operator[] (difference_type n) const
00436 {
00437
00438 return const_element_type ((*(this->sequence_))[this->pos_ + n],
00439 this->sequence_->release ());
00440 }
00441
00442
00443 virtual bool operator< (const Const_MM_Sequence_Iterator<SEQUENCE_T> & rhs) const
00444 {
00445
00446 return this->pos_ < rhs.pos_;
00447 }
00448
00449
00450 bool operator== (const Const_MM_Sequence_Iterator<SEQUENCE_T> &rhs) const
00451 {
00452
00453 return this->sequence_ == rhs.sequence_
00454 && this->pos_ == rhs.pos_;
00455 }
00456
00457
00458 bool operator!= (const Const_MM_Sequence_Iterator<SEQUENCE_T> &rhs) const
00459 {
00460 return !(*this == rhs);
00461 }
00462
00463 private:
00464
00465 const implementation_type *sequence_;
00466
00467
00468 mutable difference_type pos_;
00469 };
00470
00471
00472 template<typename SEQUENCE_T>
00473 Const_MM_Sequence_Iterator<SEQUENCE_T> operator+
00474 (typename MM_Sequence_Iterator<SEQUENCE_T>::difference_type n,
00475 Const_MM_Sequence_Iterator<SEQUENCE_T> iter)
00476 {
00477
00478 return Const_MM_Sequence_Iterator<SEQUENCE_T> (iter.sequence_, iter.pos_ + n);
00479 }
00480
00481
00482 template<typename SEQUENCE_T>
00483 Const_MM_Sequence_Iterator<SEQUENCE_T> operator-
00484 (typename MM_Sequence_Iterator<SEQUENCE_T>::difference_type n,
00485 Const_MM_Sequence_Iterator<SEQUENCE_T> iter)
00486 {
00487
00488 return Const_MM_Sequence_Iterator<SEQUENCE_T> (iter.sequence_, iter.pos_ - n);
00489 }
00490
00491
00492
00493
00494
00495
00496
00497 template <typename SEQUENCE_T>
00498 class MM_Sequence_Reverse_Iterator
00499 {
00500 friend class Const_MM_Sequence_Reverse_Iterator<SEQUENCE_T>;
00501
00502 public:
00503
00504 typedef std::random_access_iterator_tag iterator_category;
00505 typedef typename SEQUENCE_T::value_type value_type;
00506 typedef typename SEQUENCE_T::value_type *pointer;
00507 typedef typename SEQUENCE_T::value_type &reference;
00508 typedef typename SEQUENCE_T::element_type element_type;
00509 typedef typename SEQUENCE_T::const_element_type const_element_type;
00510 typedef typename SEQUENCE_T::allocation_traits allocation_traits;
00511 typedef typename SEQUENCE_T::element_traits element_traits;
00512 typedef typename SEQUENCE_T::implementation_type implementation_type;
00513 typedef int difference_type;
00514
00515
00516 MM_Sequence_Reverse_Iterator (implementation_type *sequence,
00517 size_t pos)
00518 : sequence_ (sequence),
00519 pos_ (pos)
00520 {
00521 }
00522
00523
00524 MM_Sequence_Reverse_Iterator (
00525 MM_Sequence_Reverse_Iterator<SEQUENCE_T> const & rhs)
00526 : sequence_ (rhs.sequence_),
00527 pos_ (rhs.pos_)
00528 {
00529 }
00530
00531
00532 MM_Sequence_Reverse_Iterator & operator= (
00533 MM_Sequence_Reverse_Iterator<SEQUENCE_T> const & rhs)
00534 {
00535 MM_Sequence_Reverse_Iterator tmp(rhs);
00536 swap (tmp);
00537 return * this;
00538 }
00539
00540
00541 void swap(MM_Sequence_Reverse_Iterator<SEQUENCE_T> & rhs)
00542 throw()
00543 {
00544 std::swap (sequence_, rhs.sequence_);
00545 std::swap (this->pos_, rhs.pos_);
00546 }
00547
00548
00549
00550 element_type operator* (void)
00551 {
00552
00553 return element_type ((*(this->sequence_))[this->pos_],
00554 this->sequence_->release ());
00555 }
00556
00557
00558 const_element_type operator* (void) const
00559 {
00560
00561 return const_element_type ((*(this->sequence_))[this->pos_],
00562 this->sequence_->release ());
00563 }
00564
00565
00566 MM_Sequence_Reverse_Iterator<SEQUENCE_T> &operator++ (void)
00567 {
00568
00569
00570 --this->pos_;
00571 return *this;
00572 }
00573
00574
00575 MM_Sequence_Reverse_Iterator<SEQUENCE_T> operator++ (int)
00576 {
00577
00578 MM_Sequence_Reverse_Iterator<SEQUENCE_T> temp_iter (this->sequence_, this->pos_);
00579
00580
00581 --this->pos_;
00582 return temp_iter;
00583 }
00584
00585
00586 MM_Sequence_Reverse_Iterator<SEQUENCE_T> &operator-- (void)
00587 {
00588
00589 ++this->pos_;
00590 return *this;
00591 }
00592
00593
00594 MM_Sequence_Reverse_Iterator<SEQUENCE_T> operator-- (int)
00595 {
00596
00597 MM_Sequence_Reverse_Iterator<SEQUENCE_T> temp_iter (this->sequence_, this->pos_);
00598
00599 ++this->pos_;
00600 return temp_iter;
00601 }
00602
00603
00604 MM_Sequence_Reverse_Iterator<SEQUENCE_T> &operator+= (difference_type n)
00605 {
00606
00607 this->pos_ -= n;
00608 return *this;
00609 }
00610
00611
00612 MM_Sequence_Reverse_Iterator<SEQUENCE_T> operator+ (difference_type n)
00613 {
00614
00615
00616 return MM_Sequence_Reverse_Iterator<SEQUENCE_T> (this->sequence_, this->pos_ - n);
00617 }
00618
00619
00620 MM_Sequence_Reverse_Iterator<SEQUENCE_T> &operator-= (difference_type n)
00621 {
00622
00623 this->pos_ += n;
00624 return *this;
00625 }
00626
00627
00628 MM_Sequence_Reverse_Iterator<SEQUENCE_T> operator- (difference_type n)
00629 {
00630
00631
00632 return MM_Sequence_Reverse_Iterator<SEQUENCE_T> (this->sequence_, this->pos_ + n);
00633 }
00634
00635
00636 difference_type operator- (const MM_Sequence_Reverse_Iterator<SEQUENCE_T> & rhs)
00637 {
00638
00639 return rhs.pos_ - this->pos_;
00640 }
00641
00642
00643 difference_type operator- (const Const_MM_Sequence_Reverse_Iterator<SEQUENCE_T> & rhs)
00644 {
00645
00646 return rhs.pos_ - this->pos_;
00647 }
00648
00649
00650 element_type operator[] (difference_type n)
00651 {
00652
00653 return element_type ((*(this->sequence_))[this->pos_ + n],
00654 this->sequence_->release ());
00655 }
00656
00657
00658 const_element_type operator[] (difference_type n) const
00659 {
00660
00661 return const_element_type ((*(this->sequence_))[this->pos_ + n],
00662 this->sequence_->release ());
00663 }
00664
00665
00666 bool operator< (const MM_Sequence_Reverse_Iterator<SEQUENCE_T> & rhs)
00667 {
00668
00669
00670 return this->pos_ > rhs.pos_;
00671 }
00672
00673
00674 bool operator< (const Const_MM_Sequence_Reverse_Iterator<SEQUENCE_T> & rhs)
00675 {
00676
00677
00678 return this->pos_ > rhs.pos_;
00679 }
00680
00681
00682
00683 bool operator== (const MM_Sequence_Reverse_Iterator<SEQUENCE_T> &rhs) const
00684 {
00685
00686 return this->sequence_ == rhs.sequence_
00687 && this->pos_ == rhs.pos_;
00688 }
00689
00690
00691 bool operator== (const Const_MM_Sequence_Reverse_Iterator<SEQUENCE_T> &rhs) const
00692 {
00693
00694 return this->sequence_ == rhs.sequence_
00695 && this->pos_ == rhs.pos_;
00696 }
00697
00698
00699 bool operator!= (const MM_Sequence_Reverse_Iterator<SEQUENCE_T> &rhs) const
00700 {
00701 return !(*this == rhs);
00702 }
00703
00704
00705 bool operator!= (const Const_MM_Sequence_Reverse_Iterator<SEQUENCE_T> &rhs) const
00706 {
00707 return !(*this == rhs);
00708 }
00709
00710 private:
00711
00712 implementation_type *sequence_;
00713
00714
00715 mutable difference_type pos_;
00716 };
00717
00718
00719 template<typename SEQUENCE_T>
00720 MM_Sequence_Reverse_Iterator<SEQUENCE_T> operator+
00721 (typename MM_Sequence_Reverse_Iterator<SEQUENCE_T>::difference_type n,
00722 MM_Sequence_Reverse_Iterator<SEQUENCE_T> iter)
00723 {
00724
00725 return MM_Sequence_Reverse_Iterator<SEQUENCE_T> (iter.sequence_, iter.pos_ - n);
00726 }
00727
00728
00729 template<typename SEQUENCE_T>
00730 MM_Sequence_Reverse_Iterator<SEQUENCE_T> operator-
00731 (typename MM_Sequence_Reverse_Iterator<SEQUENCE_T>::difference_type n,
00732 MM_Sequence_Reverse_Iterator<SEQUENCE_T> iter)
00733 {
00734
00735 return MM_Sequence_Reverse_Iterator<SEQUENCE_T> (iter.sequence_, iter.pos_ + n);
00736 }
00737
00738
00739
00740
00741
00742
00743
00744
00745
00746
00747
00748
00749 template <typename SEQUENCE_T>
00750 class Const_MM_Sequence_Reverse_Iterator
00751 {
00752 friend class MM_Sequence_Reverse_Iterator<SEQUENCE_T>;
00753
00754 public:
00755
00756 typedef std::random_access_iterator_tag iterator_category;
00757 typedef typename SEQUENCE_T::value_type value_type;
00758 typedef typename SEQUENCE_T::value_type *pointer;
00759 typedef typename SEQUENCE_T::value_type &reference;
00760 typedef typename SEQUENCE_T::const_element_type const_element_type;
00761 typedef typename SEQUENCE_T::allocation_traits allocation_traits;
00762 typedef typename SEQUENCE_T::element_traits element_traits;
00763 typedef typename SEQUENCE_T::implementation_type implementation_type;
00764 typedef int difference_type;
00765
00766
00767
00768 Const_MM_Sequence_Reverse_Iterator (const implementation_type *sequence,
00769 size_t pos)
00770 : sequence_ (sequence),
00771 pos_ (pos)
00772 {
00773 }
00774
00775
00776 Const_MM_Sequence_Reverse_Iterator (
00777 Const_MM_Sequence_Reverse_Iterator<SEQUENCE_T> const & rhs)
00778 : sequence_ (rhs.sequence_),
00779 pos_ (rhs.pos_)
00780 {
00781 }
00782
00783
00784 Const_MM_Sequence_Reverse_Iterator (
00785 MM_Sequence_Reverse_Iterator<SEQUENCE_T> const & rhs)
00786 : sequence_ (rhs.sequence_),
00787 pos_ (rhs.pos_)
00788 {
00789 }
00790
00791
00792 Const_MM_Sequence_Reverse_Iterator & operator= (
00793 Const_MM_Sequence_Reverse_Iterator<SEQUENCE_T> const & rhs)
00794 {
00795 Const_MM_Sequence_Reverse_Iterator tmp(rhs);
00796 swap (tmp);
00797 return * this;
00798 }
00799
00800
00801 void swap(Const_MM_Sequence_Reverse_Iterator<SEQUENCE_T> & rhs)
00802 throw()
00803 {
00804 std::swap (sequence_, rhs.sequence_);
00805 std::swap (this->pos_, rhs.pos_);
00806 }
00807
00808
00809
00810
00811
00812 const_element_type operator* (void) const
00813 {
00814
00815 return const_element_type ((*(this->sequence_))[this->pos_],
00816 this->sequence_->release ());
00817 }
00818
00819
00820 const Const_MM_Sequence_Reverse_Iterator<SEQUENCE_T> &operator++ (void) const
00821 {
00822
00823
00824 --this->pos_;
00825 return *this;
00826 }
00827
00828
00829 Const_MM_Sequence_Reverse_Iterator<SEQUENCE_T> operator++ (int) const
00830 {
00831
00832 Const_MM_Sequence_Reverse_Iterator<SEQUENCE_T> temp_iter (this->sequence_, this->pos_);
00833
00834
00835 --this->pos_;
00836 return temp_iter;
00837 }
00838
00839
00840 const Const_MM_Sequence_Reverse_Iterator<SEQUENCE_T> &operator-- (void) const
00841 {
00842
00843 ++this->pos_;
00844 return *this;
00845 }
00846
00847
00848 Const_MM_Sequence_Reverse_Iterator<SEQUENCE_T> operator-- (int) const
00849 {
00850
00851 Const_MM_Sequence_Reverse_Iterator<SEQUENCE_T> temp_iter (this->sequence_, this->pos_);
00852
00853 ++this->pos_;
00854 return temp_iter;
00855 }
00856
00857
00858 const Const_MM_Sequence_Reverse_Iterator<SEQUENCE_T> &operator+= (difference_type n) const
00859 {
00860
00861 this->pos_ -= n;
00862 return *this;
00863 }
00864
00865
00866 Const_MM_Sequence_Reverse_Iterator<SEQUENCE_T> operator+ (difference_type n) const
00867 {
00868
00869
00870 return Const_MM_Sequence_Reverse_Iterator<SEQUENCE_T> (this->sequence_, this->pos_ - n);
00871 }
00872
00873
00874 const Const_MM_Sequence_Reverse_Iterator<SEQUENCE_T> &operator-= (difference_type n) const
00875 {
00876
00877 this->pos_ += n;
00878 return *this;
00879 }
00880
00881
00882 Const_MM_Sequence_Reverse_Iterator<SEQUENCE_T> operator- (difference_type n) const
00883 {
00884
00885
00886 return Const_MM_Sequence_Reverse_Iterator<SEQUENCE_T> (this->sequence_, this->pos_ + n);
00887 }
00888
00889
00890 difference_type operator- (const Const_MM_Sequence_Reverse_Iterator<SEQUENCE_T> & rhs) const
00891 {
00892
00893 return rhs.pos_ - this->pos_;
00894 }
00895
00896
00897 const_element_type operator[] (difference_type n) const
00898 {
00899
00900 return const_element_type ((*(this->sequence_))[this->pos_ + n],
00901 this->sequence_->release ());
00902 }
00903
00904
00905 bool operator< (const Const_MM_Sequence_Reverse_Iterator<SEQUENCE_T> & rhs) const
00906 {
00907
00908
00909 return this->pos_ > rhs.pos_;
00910 }
00911
00912
00913 bool operator== (const Const_MM_Sequence_Reverse_Iterator<SEQUENCE_T> &rhs) const
00914 {
00915
00916 return this->sequence_ == rhs.sequence_
00917 && this->pos_ == rhs.pos_;
00918 }
00919
00920
00921 bool operator!= (const Const_MM_Sequence_Reverse_Iterator<SEQUENCE_T> &rhs) const
00922 {
00923 return !(*this == rhs);
00924 }
00925
00926 private:
00927
00928 const implementation_type *sequence_;
00929
00930
00931 mutable difference_type pos_;
00932 };
00933
00934
00935 template<typename SEQUENCE_T>
00936 Const_MM_Sequence_Reverse_Iterator<SEQUENCE_T> operator+
00937 (typename Const_MM_Sequence_Reverse_Iterator<SEQUENCE_T>::difference_type n,
00938 Const_MM_Sequence_Reverse_Iterator<SEQUENCE_T> iter)
00939 {
00940
00941 return Const_MM_Sequence_Reverse_Iterator<SEQUENCE_T> (iter.sequence_, iter.pos_ - n);
00942 }
00943
00944
00945 template<typename SEQUENCE_T>
00946 Const_MM_Sequence_Reverse_Iterator<SEQUENCE_T> operator-
00947 (typename Const_MM_Sequence_Reverse_Iterator<SEQUENCE_T>::difference_type n,
00948 Const_MM_Sequence_Reverse_Iterator<SEQUENCE_T> iter)
00949 {
00950
00951 return Const_MM_Sequence_Reverse_Iterator<SEQUENCE_T> (iter.sequence_, iter.pos_ + n);
00952 }
00953
00954
00955 }
00956
00957 #endif
00958
00959 #endif // mm_sequence_iterator_h