00001 #ifndef guard_generic_sequence_hpp
00002 #define guard_generic_sequence_hpp
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
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044
00045
00046
00047
00048
00049
00050
00051
00052
00053
00054
00055
00056
00057
00058
00059 #include "tao/Range_Checking_T.h"
00060 #include "ace/checked_iterator.h"
00061
00062 #include <algorithm>
00063
00064 TAO_BEGIN_VERSIONED_NAMESPACE_DECL
00065
00066 namespace TAO
00067 {
00068 namespace details
00069 {
00070
00071 #if defined TAO_HAS_SEQUENCE_ITERATORS && TAO_HAS_SEQUENCE_ITERATORS == 1
00072
00073
00074 template<typename T>
00075 class Generic_Sequence_Iterator;
00076
00077 template<typename T>
00078 class Const_Generic_Sequence_Iterator;
00079
00080 template<typename T>
00081 class Generic_Sequence_Reverse_Iterator;
00082
00083 template<typename T>
00084 class Const_Generic_Sequence_Reverse_Iterator;
00085
00086 #endif
00087
00088 template<typename T,
00089 class ALLOCATION_TRAITS,
00090 class ELEMENT_TRAITS>
00091 class generic_sequence
00092 {
00093
00094 #if defined TAO_HAS_SEQUENCE_ITERATORS && TAO_HAS_SEQUENCE_ITERATORS == 1
00095
00096 friend class Generic_Sequence_Iterator<generic_sequence<T, ALLOCATION_TRAITS, ELEMENT_TRAITS> >;
00097 friend class Const_Generic_Sequence_Iterator<generic_sequence<T, ALLOCATION_TRAITS, ELEMENT_TRAITS> >;
00098 friend class Generic_Sequence_Reverse_Iterator<generic_sequence<T, ALLOCATION_TRAITS, ELEMENT_TRAITS> >;
00099 friend class Const_Generic_Sequence_Reverse_Iterator<generic_sequence<T, ALLOCATION_TRAITS, ELEMENT_TRAITS> >;
00100
00101 #endif
00102
00103 public:
00104 typedef T value_type;
00105 typedef ALLOCATION_TRAITS allocation_traits;
00106 typedef ELEMENT_TRAITS element_traits;
00107 typedef range_checking<value_type,true> range;
00108
00109
00110 generic_sequence()
00111 : maximum_(allocation_traits::default_maximum())
00112 , length_(0)
00113 , buffer_(allocation_traits::default_buffer_allocation())
00114 , release_(buffer_ != 0)
00115 {
00116 }
00117
00118
00119 explicit generic_sequence(CORBA::ULong maximum)
00120 : maximum_(maximum)
00121 , length_(0)
00122 , buffer_(allocbuf(maximum_))
00123 , release_(true)
00124 {
00125 }
00126
00127 generic_sequence(
00128 CORBA::ULong maximum,
00129 CORBA::ULong length,
00130 value_type * data,
00131 CORBA::Boolean release)
00132 : maximum_(maximum)
00133 , length_(length)
00134 , buffer_(data)
00135 , release_(release)
00136 {
00137 }
00138
00139
00140 generic_sequence(generic_sequence const & rhs)
00141 : maximum_(0)
00142 , length_(0)
00143 , buffer_(0)
00144 , release_(false)
00145 {
00146 if (rhs.maximum_ == 0 || rhs.buffer_ == 0)
00147 {
00148 maximum_ = rhs.maximum_;
00149 length_ = rhs.length_;
00150 return;
00151 }
00152 generic_sequence tmp(rhs.maximum_, rhs.length_,
00153 allocation_traits::allocbuf_noinit(rhs.maximum_),
00154 true);
00155 element_traits::initialize_range(
00156 tmp.buffer_ + tmp.length_, tmp.buffer_ + tmp.maximum_);
00157 element_traits::copy_range(
00158 rhs.buffer_,
00159 rhs.buffer_ + rhs.length_,
00160 ACE_make_checked_array_iterator (tmp.buffer_, tmp.length_));
00161 swap(tmp);
00162 }
00163
00164
00165 generic_sequence & operator=(generic_sequence const & rhs)
00166 {
00167 generic_sequence tmp(rhs);
00168 swap(tmp);
00169 return * this;
00170 }
00171
00172
00173 ~generic_sequence()
00174 {
00175 if (release_)
00176 {
00177 freebuf(buffer_);
00178 }
00179 }
00180
00181
00182 inline CORBA::ULong maximum() const
00183 {
00184 return maximum_;
00185 }
00186
00187
00188 inline CORBA::Boolean release() const
00189 {
00190 return release_;
00191 }
00192
00193
00194 inline CORBA::ULong length() const
00195 {
00196 return length_;
00197 }
00198
00199
00200 void length(CORBA::ULong length)
00201 {
00202 if (length <= maximum_)
00203 {
00204 if (buffer_ == 0)
00205 {
00206 buffer_ = allocbuf(maximum_);
00207 release_ = true;
00208 length_ = length;
00209
00210
00211 return;
00212 }
00213
00214
00215
00216 if (length < length_ && release_)
00217 {
00218
00219
00220
00221
00222
00223
00224
00225 element_traits::release_range(
00226 buffer_ + length, buffer_ + length_);
00227 element_traits::initialize_range(
00228 buffer_ + length, buffer_ + length_);
00229 }
00230 length_ = length;
00231 return;
00232 }
00233
00234 generic_sequence tmp(length, length,
00235 allocation_traits::allocbuf_noinit(length),
00236 true);
00237
00238
00239 element_traits::initialize_range(
00240 tmp.buffer_ + length_, tmp.buffer_ + length);
00241 element_traits::copy_swap_range(
00242 buffer_,
00243 buffer_ + length_,
00244 ACE_make_checked_array_iterator (tmp.buffer_, tmp.length_));
00245
00246 swap(tmp);
00247 }
00248
00249
00250 value_type const & operator[](CORBA::ULong i) const
00251 {
00252 range::check(i, length_, maximum_, "operator[]() const");
00253 return buffer_[i];
00254 }
00255
00256
00257 value_type & operator[](CORBA::ULong i)
00258 {
00259 range::check(i, length_, maximum_, "operator[]() non-const");
00260 return buffer_[i];
00261 }
00262
00263
00264
00265
00266
00267
00268 void replace(
00269 CORBA::ULong maximum,
00270 CORBA::ULong length,
00271 value_type * data,
00272 CORBA::Boolean release)
00273 {
00274 generic_sequence tmp(maximum, length, data, release);
00275 swap(tmp);
00276 }
00277
00278
00279
00280
00281
00282
00283
00284 value_type const * get_buffer() const
00285 {
00286 if (buffer_ == 0)
00287 {
00288 buffer_ = allocbuf(maximum_);
00289 release_ = true;
00290 }
00291 return buffer_;
00292 }
00293
00294
00295
00296
00297
00298
00299
00300
00301
00302
00303
00304
00305
00306
00307
00308
00309
00310
00311
00312
00313
00314
00315
00316
00317
00318
00319
00320
00321
00322 value_type * get_buffer(CORBA::Boolean orphan)
00323 {
00324 if (orphan && !release_)
00325 {
00326 return 0;
00327 }
00328 if (buffer_ == 0)
00329 {
00330 buffer_ = allocbuf(maximum_);
00331 if (!orphan)
00332 {
00333 release_ = true;
00334 }
00335 }
00336 if (!orphan)
00337 {
00338 return buffer_;
00339 }
00340
00341 generic_sequence tmp;
00342 swap(tmp);
00343 tmp.release_ = false;
00344
00345 return tmp.buffer_;
00346 }
00347
00348 void swap(generic_sequence & rhs) throw()
00349 {
00350 std::swap(maximum_, rhs.maximum_);
00351 std::swap(length_, rhs.length_);
00352 std::swap(buffer_, rhs.buffer_);
00353 std::swap(release_, rhs.release_);
00354 }
00355
00356 static value_type * allocbuf(CORBA::ULong maximum)
00357 {
00358 return allocation_traits::allocbuf(maximum);
00359 }
00360
00361 static void freebuf(value_type * buffer)
00362 {
00363 allocation_traits::freebuf(buffer);
00364 }
00365
00366 #if defined TAO_HAS_SEQUENCE_ITERATORS && TAO_HAS_SEQUENCE_ITERATORS == 1
00367
00368
00369
00370
00371
00372
00373 typedef Generic_Sequence_Iterator<generic_sequence<T, ALLOCATION_TRAITS, ELEMENT_TRAITS> > iterator;
00374 typedef Const_Generic_Sequence_Iterator<generic_sequence<T, ALLOCATION_TRAITS, ELEMENT_TRAITS> > const_iterator;
00375 typedef Generic_Sequence_Reverse_Iterator<generic_sequence<T, ALLOCATION_TRAITS, ELEMENT_TRAITS> > reverse_iterator;
00376 typedef Const_Generic_Sequence_Reverse_Iterator<generic_sequence<T, ALLOCATION_TRAITS, ELEMENT_TRAITS> > const_reverse_iterator;
00377
00378
00379 iterator begin (void)
00380 {
00381 return typename generic_sequence<T, ALLOCATION_TRAITS, ELEMENT_TRAITS>::iterator (this);
00382 }
00383
00384
00385 const_iterator begin (void) const
00386 {
00387 return typename generic_sequence<T, ALLOCATION_TRAITS, ELEMENT_TRAITS>::const_iterator (this);
00388 }
00389
00390
00391 iterator end (void)
00392 {
00393 return typename generic_sequence<T, ALLOCATION_TRAITS, ELEMENT_TRAITS>::iterator (this,
00394 this->length_);
00395 }
00396
00397
00398 const_iterator end (void) const
00399 {
00400 return typename generic_sequence<T, ALLOCATION_TRAITS, ELEMENT_TRAITS>::const_iterator (this,
00401 this->length_);
00402 }
00403
00404
00405 reverse_iterator rbegin (void)
00406 {
00407
00408 return typename generic_sequence<T, ALLOCATION_TRAITS, ELEMENT_TRAITS>::reverse_iterator (this,
00409 this->length_ - 1);
00410 }
00411
00412
00413 const_reverse_iterator rbegin (void) const
00414 {
00415
00416 return typename generic_sequence<T, ALLOCATION_TRAITS, ELEMENT_TRAITS>::const_reverse_iterator (this,
00417 this->length_ - 1);
00418 }
00419
00420
00421
00422 reverse_iterator rend (void)
00423 {
00424
00425 return typename generic_sequence<T, ALLOCATION_TRAITS, ELEMENT_TRAITS>::reverse_iterator (this,
00426 -1);
00427 }
00428
00429
00430
00431 const_reverse_iterator rend (void) const
00432 {
00433
00434 return typename generic_sequence<T, ALLOCATION_TRAITS, ELEMENT_TRAITS>::const_reverse_iterator (this,
00435 -1);
00436 }
00437
00438 #endif
00439
00440 private:
00441
00442 CORBA::ULong maximum_;
00443
00444 CORBA::ULong length_;
00445
00446 mutable value_type * buffer_;
00447
00448
00449 mutable CORBA::Boolean release_;
00450 };
00451
00452 #if defined TAO_HAS_SEQUENCE_ITERATORS && TAO_HAS_SEQUENCE_ITERATORS == 1
00453
00454
00455
00456
00457
00458
00459 template <typename SEQUENCE_T>
00460 class Generic_Sequence_Iterator
00461 {
00462 friend class Const_Generic_Sequence_Iterator<SEQUENCE_T>;
00463
00464 public:
00465
00466 typedef std::random_access_iterator_tag iterator_category;
00467 typedef typename SEQUENCE_T::value_type value_type;
00468 typedef typename SEQUENCE_T::value_type *pointer;
00469 typedef typename SEQUENCE_T::value_type &reference;
00470 typedef typename SEQUENCE_T::allocation_traits allocation_traits;
00471 typedef typename SEQUENCE_T::element_traits element_traits;
00472 typedef CORBA::Long difference_type;
00473
00474
00475 Generic_Sequence_Iterator (generic_sequence<value_type,
00476 allocation_traits,
00477 element_traits> *sequence,
00478 size_t pos = 0)
00479 : sequence_ (sequence),
00480 pos_ (pos)
00481 {
00482 }
00483
00484
00485 Generic_Sequence_Iterator (Generic_Sequence_Iterator<SEQUENCE_T> const & rhs)
00486 : sequence_ (rhs.sequence_),
00487 pos_ (rhs.pos_)
00488 {
00489 }
00490
00491
00492 Generic_Sequence_Iterator & operator= (
00493 Generic_Sequence_Iterator<SEQUENCE_T> const & rhs)
00494 {
00495 Generic_Sequence_Iterator tmp(rhs);
00496 swap (tmp);
00497 return * this;
00498 }
00499
00500
00501 void swap(Generic_Sequence_Iterator<SEQUENCE_T> & rhs)
00502 throw()
00503 {
00504 std::swap (sequence_, rhs.sequence_);
00505 std::swap (this->pos_, rhs.pos_);
00506 }
00507
00508
00509 operator Const_Generic_Sequence_Iterator<SEQUENCE_T> ()
00510 {
00511 return Const_Generic_Sequence_Iterator<SEQUENCE_T> (*this);
00512 }
00513
00514
00515
00516 value_type & operator* (void)
00517 {
00518
00519 return (*(this->sequence_))[this->pos_];
00520 }
00521
00522
00523 const value_type & operator* (void) const
00524 {
00525
00526 return (*(this->sequence_))[this->pos_];
00527 }
00528
00529
00530 Generic_Sequence_Iterator<SEQUENCE_T> &operator++ (void)
00531 {
00532
00533
00534 ++this->pos_;
00535 return *this;
00536 }
00537
00538
00539 Generic_Sequence_Iterator<SEQUENCE_T> operator++ (int)
00540 {
00541
00542 Generic_Sequence_Iterator<SEQUENCE_T> temp_iter (this->sequence_, this->pos_);
00543
00544
00545 ++this->pos_;
00546 return temp_iter;
00547 }
00548
00549
00550 Generic_Sequence_Iterator<SEQUENCE_T> &operator-- (void)
00551 {
00552 --this->pos_;
00553 return *this;
00554 }
00555
00556
00557 Generic_Sequence_Iterator<SEQUENCE_T> operator-- (int)
00558 {
00559
00560 Generic_Sequence_Iterator<SEQUENCE_T> temp_iter (this->sequence_, this->pos_);
00561 --this->pos_;
00562 return temp_iter;
00563 }
00564
00565
00566 Generic_Sequence_Iterator<SEQUENCE_T> &operator+= (difference_type n)
00567 {
00568
00569 this->pos_ += n;
00570 return *this;
00571 }
00572
00573
00574 Generic_Sequence_Iterator<SEQUENCE_T> operator+ (difference_type n)
00575 {
00576
00577 return Generic_Sequence_Iterator<SEQUENCE_T> (this->sequence_, this->pos_ + n);
00578 }
00579
00580
00581 Generic_Sequence_Iterator<SEQUENCE_T> &operator-= (difference_type n)
00582 {
00583
00584 this->pos_ -= n;
00585 return *this;
00586 }
00587
00588
00589 Generic_Sequence_Iterator<SEQUENCE_T> operator- (difference_type n)
00590 {
00591
00592 return Generic_Sequence_Iterator<SEQUENCE_T> (this->sequence_, this->pos_ - n);
00593 }
00594
00595
00596 difference_type operator- (const Generic_Sequence_Iterator<SEQUENCE_T> & rhs)
00597 {
00598
00599 return this->pos_ - rhs.pos_;
00600 }
00601
00602
00603 difference_type operator- (const Const_Generic_Sequence_Iterator<SEQUENCE_T> & rhs)
00604 {
00605
00606 return this->pos_ - rhs.pos_;
00607 }
00608
00609
00610
00611 value_type & operator[] (difference_type n)
00612 {
00613
00614 return (*(this->sequence_))[this->pos_ + n];
00615 }
00616
00617
00618 bool operator< (const Generic_Sequence_Iterator<SEQUENCE_T> & rhs)
00619 {
00620
00621 return this->pos_ < rhs.pos_;
00622 }
00623
00624
00625 bool operator< (const Const_Generic_Sequence_Iterator<SEQUENCE_T> & rhs)
00626 {
00627
00628 return this->pos_ < rhs.pos_;
00629 }
00630
00631
00632
00633 bool operator== (const Generic_Sequence_Iterator<SEQUENCE_T> &rhs) const
00634 {
00635
00636 return this->sequence_ == rhs.sequence_
00637 && this->pos_ == rhs.pos_;
00638 }
00639
00640
00641 bool operator!= (const Generic_Sequence_Iterator<SEQUENCE_T> &rhs) const
00642 {
00643 return !(*this == rhs);
00644 }
00645
00646 private:
00647
00648 generic_sequence<value_type, allocation_traits, element_traits> *sequence_;
00649
00650
00651 mutable difference_type pos_;
00652 };
00653
00654
00655
00656 template<typename SEQUENCE_T>
00657 Generic_Sequence_Iterator<SEQUENCE_T>
00658 operator+ (typename Generic_Sequence_Iterator<SEQUENCE_T>::difference_type n,
00659 const Generic_Sequence_Iterator<SEQUENCE_T> & iter)
00660 {
00661
00662 return Generic_Sequence_Iterator<SEQUENCE_T> (iter.sequence_, iter.pos_ + n);
00663 }
00664
00665
00666 template<typename SEQUENCE_T>
00667 Generic_Sequence_Iterator<SEQUENCE_T> operator-
00668 (typename Generic_Sequence_Iterator<SEQUENCE_T>::difference_type n,
00669 Generic_Sequence_Iterator<SEQUENCE_T> iter)
00670 {
00671
00672 return Generic_Sequence_Iterator<SEQUENCE_T> (iter.sequence_, iter.pos_ - n);
00673 }
00674
00675
00676
00677
00678
00679
00680
00681
00682
00683
00684
00685 template <typename SEQUENCE_T>
00686 class Const_Generic_Sequence_Iterator
00687 {
00688 friend class Generic_Sequence_Iterator<SEQUENCE_T>;
00689
00690 public:
00691
00692 typedef std::random_access_iterator_tag iterator_category;
00693 typedef typename SEQUENCE_T::value_type value_type;
00694 typedef typename SEQUENCE_T::value_type *pointer;
00695 typedef typename SEQUENCE_T::value_type &reference;
00696 typedef typename SEQUENCE_T::allocation_traits allocation_traits;
00697 typedef typename SEQUENCE_T::element_traits element_traits;
00698 typedef int difference_type;
00699
00700
00701
00702 Const_Generic_Sequence_Iterator (const generic_sequence<value_type,
00703 allocation_traits,
00704 element_traits> *sequence,
00705 size_t pos = 0)
00706 : sequence_ (sequence),
00707 pos_ (pos)
00708 {
00709 }
00710
00711 virtual ~Const_Generic_Sequence_Iterator ()
00712 {
00713 }
00714
00715
00716 Const_Generic_Sequence_Iterator (
00717 Const_Generic_Sequence_Iterator<SEQUENCE_T> const & rhs)
00718 : sequence_ (rhs.sequence_),
00719 pos_ (rhs.pos_)
00720 {
00721 }
00722
00723
00724 explicit Const_Generic_Sequence_Iterator (
00725 Generic_Sequence_Iterator<SEQUENCE_T> const & rhs)
00726 : sequence_ (rhs.sequence_),
00727 pos_ (rhs.pos_)
00728 {
00729 }
00730
00731
00732 Const_Generic_Sequence_Iterator & operator= (
00733 Const_Generic_Sequence_Iterator<SEQUENCE_T> const & rhs)
00734 {
00735 Const_Generic_Sequence_Iterator tmp(rhs);
00736 swap (tmp);
00737 return * this;
00738 }
00739
00740
00741 void swap(Const_Generic_Sequence_Iterator<SEQUENCE_T> & rhs)
00742 throw()
00743 {
00744 std::swap (sequence_, rhs.sequence_);
00745 std::swap (this->pos_, rhs.pos_);
00746 }
00747
00748
00749
00750 const value_type & operator* (void) const
00751 {
00752
00753 return (*(this->sequence_))[this->pos_];
00754 }
00755
00756
00757 const Const_Generic_Sequence_Iterator<SEQUENCE_T> &operator++ (void) const
00758 {
00759
00760
00761 ++this->pos_;
00762 return * this;
00763 }
00764
00765
00766 Const_Generic_Sequence_Iterator<SEQUENCE_T> operator++ (int) const
00767 {
00768
00769 Const_Generic_Sequence_Iterator<SEQUENCE_T> temp_iter (this->sequence_, this->pos_);
00770
00771
00772 ++this->pos_;
00773 return temp_iter;
00774 }
00775
00776
00777 const Const_Generic_Sequence_Iterator<SEQUENCE_T> &operator-- (void) const
00778 {
00779 --this->pos_;
00780 return * this;
00781 }
00782
00783
00784 Const_Generic_Sequence_Iterator<SEQUENCE_T> operator-- (int) const
00785 {
00786
00787 Const_Generic_Sequence_Iterator<SEQUENCE_T> temp_iter (this->sequence_, this->pos_);
00788 --this->pos_;
00789 return temp_iter;
00790 }
00791
00792
00793 const Const_Generic_Sequence_Iterator<SEQUENCE_T> &operator+= (difference_type n) const
00794 {
00795
00796 this->pos_ += n;
00797 return * this;
00798 }
00799
00800
00801 Const_Generic_Sequence_Iterator<SEQUENCE_T> operator+ (difference_type n) const
00802 {
00803
00804 return Const_Generic_Sequence_Iterator<SEQUENCE_T> (this->sequence_, this->pos_ + n);
00805 }
00806
00807
00808 const Const_Generic_Sequence_Iterator<SEQUENCE_T> &operator-= (difference_type n) const
00809 {
00810
00811 this->pos_ -= n;
00812 return * this;
00813 }
00814
00815
00816 Const_Generic_Sequence_Iterator<SEQUENCE_T> operator- (difference_type n) const
00817 {
00818
00819 return Const_Generic_Sequence_Iterator<SEQUENCE_T> (this->sequence_, this->pos_ - n);
00820 }
00821
00822
00823 difference_type operator- (const Const_Generic_Sequence_Iterator<SEQUENCE_T> & rhs) const
00824 {
00825
00826 return this->pos_ - rhs.pos_;
00827 }
00828
00829
00830 const value_type & operator[] (difference_type n) const
00831 {
00832
00833 return (*(this->sequence_))[this->pos_ + n];
00834 }
00835
00836
00837 virtual bool operator< (const Const_Generic_Sequence_Iterator<SEQUENCE_T> & rhs) const
00838 {
00839
00840 return this->pos_ < rhs.pos_;
00841 }
00842
00843
00844 bool operator== (const Const_Generic_Sequence_Iterator<SEQUENCE_T> &rhs) const
00845 {
00846
00847 return this->sequence_ == rhs.sequence_
00848 && this->pos_ == rhs.pos_;
00849 }
00850
00851
00852 bool operator!= (const Const_Generic_Sequence_Iterator<SEQUENCE_T> &rhs) const
00853 {
00854 return !(*this == rhs);
00855 }
00856
00857 private:
00858
00859 const generic_sequence<value_type, allocation_traits, element_traits> *sequence_;
00860
00861
00862 mutable difference_type pos_;
00863 };
00864
00865
00866 template<typename SEQUENCE_T>
00867 Const_Generic_Sequence_Iterator<SEQUENCE_T> operator+
00868 (typename Generic_Sequence_Iterator<SEQUENCE_T>::difference_type n,
00869 Const_Generic_Sequence_Iterator<SEQUENCE_T> iter)
00870 {
00871
00872 return Const_Generic_Sequence_Iterator<SEQUENCE_T> (iter.sequence_, iter.pos_ + n);
00873 }
00874
00875
00876 template<typename SEQUENCE_T>
00877 Const_Generic_Sequence_Iterator<SEQUENCE_T> operator-
00878 (typename Generic_Sequence_Iterator<SEQUENCE_T>::difference_type n,
00879 Const_Generic_Sequence_Iterator<SEQUENCE_T> iter)
00880 {
00881
00882 return Const_Generic_Sequence_Iterator<SEQUENCE_T> (iter.sequence_, iter.pos_ - n);
00883 }
00884
00885
00886
00887
00888
00889
00890
00891 template <typename SEQUENCE_T>
00892 class Generic_Sequence_Reverse_Iterator
00893 {
00894 friend class Const_Generic_Sequence_Reverse_Iterator<SEQUENCE_T>;
00895
00896 public:
00897
00898 typedef std::random_access_iterator_tag iterator_category;
00899 typedef typename SEQUENCE_T::value_type value_type;
00900 typedef typename SEQUENCE_T::value_type *pointer;
00901 typedef typename SEQUENCE_T::value_type &reference;
00902 typedef typename SEQUENCE_T::allocation_traits allocation_traits;
00903 typedef typename SEQUENCE_T::element_traits element_traits;
00904 typedef int difference_type;
00905
00906
00907 Generic_Sequence_Reverse_Iterator (generic_sequence<value_type,
00908 allocation_traits,
00909 element_traits> *sequence,
00910 size_t pos)
00911 : sequence_ (sequence),
00912 pos_ (pos)
00913 {
00914 }
00915
00916
00917 Generic_Sequence_Reverse_Iterator (
00918 Generic_Sequence_Reverse_Iterator<SEQUENCE_T> const & rhs)
00919 : sequence_ (rhs.sequence_),
00920 pos_ (rhs.pos_)
00921 {
00922 }
00923
00924
00925 Generic_Sequence_Reverse_Iterator & operator= (
00926 Generic_Sequence_Reverse_Iterator<SEQUENCE_T> const & rhs)
00927 {
00928 Generic_Sequence_Reverse_Iterator tmp(rhs);
00929 swap (tmp);
00930 return * this;
00931 }
00932
00933
00934 void swap(Generic_Sequence_Reverse_Iterator<SEQUENCE_T> & rhs)
00935 throw()
00936 {
00937 std::swap (sequence_, rhs.sequence_);
00938 std::swap (this->pos_, rhs.pos_);
00939 }
00940
00941
00942
00943 value_type & operator* (void)
00944 {
00945
00946 return (*(this->sequence_))[this->pos_];
00947 }
00948
00949
00950 const value_type& operator* (void) const
00951 {
00952
00953 return (*(this->sequence_))[this->pos_];
00954 }
00955
00956
00957 Generic_Sequence_Reverse_Iterator<SEQUENCE_T> &operator++ (void)
00958 {
00959
00960
00961 --this->pos_;
00962 return *this;
00963 }
00964
00965
00966 Generic_Sequence_Reverse_Iterator<SEQUENCE_T> operator++ (int)
00967 {
00968
00969 Generic_Sequence_Reverse_Iterator<SEQUENCE_T> temp_iter (this->sequence_, this->pos_);
00970
00971
00972 --this->pos_;
00973 return temp_iter;
00974 }
00975
00976
00977 Generic_Sequence_Reverse_Iterator<SEQUENCE_T> &operator-- (void)
00978 {
00979
00980 ++this->pos_;
00981 return *this;
00982 }
00983
00984
00985 Generic_Sequence_Reverse_Iterator<SEQUENCE_T> operator-- (int)
00986 {
00987
00988 Generic_Sequence_Reverse_Iterator<SEQUENCE_T> temp_iter (this->sequence_, this->pos_);
00989
00990 ++this->pos_;
00991 return temp_iter;
00992 }
00993
00994
00995 Generic_Sequence_Reverse_Iterator<SEQUENCE_T> &operator+= (difference_type n)
00996 {
00997
00998 this->pos_ -= n;
00999 return *this;
01000 }
01001
01002
01003 Generic_Sequence_Reverse_Iterator<SEQUENCE_T> operator+ (difference_type n)
01004 {
01005
01006
01007 return Generic_Sequence_Reverse_Iterator<SEQUENCE_T> (this->sequence_, this->pos_ - n);
01008 }
01009
01010
01011 Generic_Sequence_Reverse_Iterator<SEQUENCE_T> &operator-= (difference_type n)
01012 {
01013
01014 this->pos_ += n;
01015 return *this;
01016 }
01017
01018
01019 Generic_Sequence_Reverse_Iterator<SEQUENCE_T> operator- (difference_type n)
01020 {
01021
01022
01023 return Generic_Sequence_Reverse_Iterator<SEQUENCE_T> (this->sequence_, this->pos_ + n);
01024 }
01025
01026
01027 difference_type operator- (const Generic_Sequence_Reverse_Iterator<SEQUENCE_T> & rhs)
01028 {
01029
01030 return rhs.pos_ - this->pos_;
01031 }
01032
01033
01034 difference_type operator- (const Const_Generic_Sequence_Reverse_Iterator<SEQUENCE_T> & rhs)
01035 {
01036
01037 return rhs.pos_ - this->pos_;
01038 }
01039
01040
01041
01042 value_type & operator[] (difference_type n)
01043 {
01044
01045 return (*(this->sequence_))[this->pos_ - n];
01046 }
01047
01048
01049 bool operator< (const Generic_Sequence_Reverse_Iterator<SEQUENCE_T> & rhs)
01050 {
01051
01052
01053 return this->pos_ > rhs.pos_;
01054 }
01055
01056
01057 bool operator< (const Const_Generic_Sequence_Reverse_Iterator<SEQUENCE_T> & rhs)
01058 {
01059
01060
01061 return this->pos_ > rhs.pos_;
01062 }
01063
01064
01065
01066 bool operator== (const Generic_Sequence_Reverse_Iterator<SEQUENCE_T> &rhs) const
01067 {
01068
01069 return this->sequence_ == rhs.sequence_
01070 && this->pos_ == rhs.pos_;
01071 }
01072
01073
01074 bool operator== (const Const_Generic_Sequence_Reverse_Iterator<SEQUENCE_T> &rhs) const
01075 {
01076
01077 return this->sequence_ == rhs.sequence_
01078 && this->pos_ == rhs.pos_;
01079 }
01080
01081
01082 bool operator!= (const Generic_Sequence_Reverse_Iterator<SEQUENCE_T> &rhs) const
01083 {
01084 return !(*this == rhs);
01085 }
01086
01087
01088 bool operator!= (const Const_Generic_Sequence_Reverse_Iterator<SEQUENCE_T> &rhs) const
01089 {
01090 return !(*this == rhs);
01091 }
01092
01093 private:
01094
01095 generic_sequence<value_type, allocation_traits, element_traits> *sequence_;
01096
01097
01098 mutable difference_type pos_;
01099 };
01100
01101
01102 template<typename SEQUENCE_T>
01103 Generic_Sequence_Reverse_Iterator<SEQUENCE_T> operator+
01104 (typename Generic_Sequence_Reverse_Iterator<SEQUENCE_T>::difference_type n,
01105 Generic_Sequence_Reverse_Iterator<SEQUENCE_T> iter)
01106 {
01107
01108 return Generic_Sequence_Reverse_Iterator<SEQUENCE_T> (iter.sequence_, iter.pos_ - n);
01109 }
01110
01111
01112 template<typename SEQUENCE_T>
01113 Generic_Sequence_Reverse_Iterator<SEQUENCE_T> operator-
01114 (typename Generic_Sequence_Reverse_Iterator<SEQUENCE_T>::difference_type n,
01115 Generic_Sequence_Reverse_Iterator<SEQUENCE_T> iter)
01116 {
01117
01118 return Generic_Sequence_Reverse_Iterator<SEQUENCE_T> (iter.sequence_, iter.pos_ + n);
01119 }
01120
01121
01122
01123
01124
01125
01126
01127
01128
01129
01130
01131 template <typename SEQUENCE_T>
01132 class Const_Generic_Sequence_Reverse_Iterator
01133 {
01134 friend class Generic_Sequence_Reverse_Iterator<SEQUENCE_T>;
01135
01136 public:
01137
01138 typedef std::random_access_iterator_tag iterator_category;
01139 typedef typename SEQUENCE_T::value_type value_type;
01140 typedef typename SEQUENCE_T::value_type *pointer;
01141 typedef typename SEQUENCE_T::value_type &reference;
01142 typedef typename SEQUENCE_T::allocation_traits allocation_traits;
01143 typedef typename SEQUENCE_T::element_traits element_traits;
01144 typedef int difference_type;
01145
01146
01147
01148 Const_Generic_Sequence_Reverse_Iterator (const generic_sequence<value_type,
01149 allocation_traits,
01150 element_traits> *sequence,
01151 size_t pos)
01152 : sequence_ (sequence),
01153 pos_ (pos)
01154 {
01155 }
01156
01157
01158 Const_Generic_Sequence_Reverse_Iterator (
01159 Const_Generic_Sequence_Reverse_Iterator<SEQUENCE_T> const & rhs)
01160 : sequence_ (rhs.sequence_),
01161 pos_ (rhs.pos_)
01162 {
01163 }
01164
01165
01166 Const_Generic_Sequence_Reverse_Iterator (
01167 Generic_Sequence_Reverse_Iterator<SEQUENCE_T> const & rhs)
01168 : sequence_ (rhs.sequence_),
01169 pos_ (rhs.pos_)
01170 {
01171 }
01172
01173
01174 Const_Generic_Sequence_Reverse_Iterator & operator= (
01175 Const_Generic_Sequence_Reverse_Iterator<SEQUENCE_T> const & rhs)
01176 {
01177 Const_Generic_Sequence_Reverse_Iterator tmp(rhs);
01178 swap (tmp);
01179 return * this;
01180 }
01181
01182
01183 void swap(Const_Generic_Sequence_Reverse_Iterator<SEQUENCE_T> & rhs)
01184 throw()
01185 {
01186 std::swap (sequence_, rhs.sequence_);
01187 std::swap (this->pos_, rhs.pos_);
01188 }
01189
01190
01191
01192
01193
01194 const value_type& operator* (void) const
01195 {
01196
01197 return (*this->sequence_)[this->pos_];
01198 }
01199
01200
01201 const Const_Generic_Sequence_Reverse_Iterator<SEQUENCE_T> &operator++ (void) const
01202 {
01203
01204
01205 --this->pos_;
01206 return *this;
01207 }
01208
01209
01210 Const_Generic_Sequence_Reverse_Iterator<SEQUENCE_T> operator++ (int) const
01211 {
01212
01213 Const_Generic_Sequence_Reverse_Iterator<SEQUENCE_T> temp_iter (this->sequence_, this->pos_);
01214
01215
01216 --this->pos_;
01217 return temp_iter;
01218 }
01219
01220
01221 const Const_Generic_Sequence_Reverse_Iterator<SEQUENCE_T> &operator-- (void) const
01222 {
01223
01224 ++this->pos_;
01225 return *this;
01226 }
01227
01228
01229 Const_Generic_Sequence_Reverse_Iterator<SEQUENCE_T> operator-- (int) const
01230 {
01231
01232 Const_Generic_Sequence_Reverse_Iterator<SEQUENCE_T> temp_iter (this->sequence_, this->pos_);
01233
01234 ++this->pos_;
01235 return temp_iter;
01236 }
01237
01238
01239 const Const_Generic_Sequence_Reverse_Iterator<SEQUENCE_T> &operator+= (difference_type n) const
01240 {
01241
01242 this->pos_ -= n;
01243 return *this;
01244 }
01245
01246
01247 Const_Generic_Sequence_Reverse_Iterator<SEQUENCE_T> operator+ (difference_type n) const
01248 {
01249
01250
01251 return Const_Generic_Sequence_Reverse_Iterator<SEQUENCE_T> (this->sequence_, this->pos_ - n);
01252 }
01253
01254
01255 const Const_Generic_Sequence_Reverse_Iterator<SEQUENCE_T> &operator-= (difference_type n) const
01256 {
01257
01258 this->pos_ += n;
01259 return *this;
01260 }
01261
01262
01263 Const_Generic_Sequence_Reverse_Iterator<SEQUENCE_T> operator- (difference_type n) const
01264 {
01265
01266
01267 return Const_Generic_Sequence_Reverse_Iterator<SEQUENCE_T> (this->sequence_, this->pos_ + n);
01268 }
01269
01270
01271 difference_type operator- (const Const_Generic_Sequence_Reverse_Iterator<SEQUENCE_T> & rhs) const
01272 {
01273
01274 return rhs.pos_ - this->pos_;
01275 }
01276
01277
01278 const value_type & operator[] (difference_type n) const
01279 {
01280
01281 return (*(this->sequence_))[this->pos_ - n];
01282 }
01283
01284
01285 bool operator< (const Const_Generic_Sequence_Reverse_Iterator<SEQUENCE_T> & rhs) const
01286 {
01287
01288
01289 return this->pos_ > rhs.pos_;
01290 }
01291
01292
01293 bool operator== (const Const_Generic_Sequence_Reverse_Iterator<SEQUENCE_T> &rhs) const
01294 {
01295
01296 return this->sequence_ == rhs.sequence_
01297 && this->pos_ == rhs.pos_;
01298 }
01299
01300
01301 bool operator!= (const Const_Generic_Sequence_Reverse_Iterator<SEQUENCE_T> &rhs) const
01302 {
01303 return !(*this == rhs);
01304 }
01305
01306 private:
01307
01308 const generic_sequence<value_type, allocation_traits, element_traits> *sequence_;
01309
01310
01311 mutable difference_type pos_;
01312 };
01313
01314
01315 template<typename SEQUENCE_T>
01316 Const_Generic_Sequence_Reverse_Iterator<SEQUENCE_T> operator+
01317 (typename Const_Generic_Sequence_Reverse_Iterator<SEQUENCE_T>::difference_type n,
01318 Const_Generic_Sequence_Reverse_Iterator<SEQUENCE_T> iter)
01319 {
01320
01321 return Const_Generic_Sequence_Reverse_Iterator<SEQUENCE_T> (iter.sequence_, iter.pos_ - n);
01322 }
01323
01324
01325 template<typename SEQUENCE_T>
01326 Const_Generic_Sequence_Reverse_Iterator<SEQUENCE_T> operator-
01327 (typename Const_Generic_Sequence_Reverse_Iterator<SEQUENCE_T>::difference_type n,
01328 Const_Generic_Sequence_Reverse_Iterator<SEQUENCE_T> iter)
01329 {
01330
01331 return Const_Generic_Sequence_Reverse_Iterator<SEQUENCE_T> (iter.sequence_, iter.pos_ + n);
01332 }
01333
01334 #endif
01335
01336 }
01337 }
01338
01339 TAO_END_VERSIONED_NAMESPACE_DECL
01340
01341 #endif // guard_generic_sequence_hpp