SequenceIterator.h

Go to the documentation of this file.
00001 /*
00002  * Distributed under the OpenDDS License.
00003  * See: http://www.OpenDDS.org/license.html
00004  */
00005 
00006 #ifndef DDS_DCPS_ITERATOR_ADAPTOR_H
00007 #define DDS_DCPS_ITERATOR_ADAPTOR_H
00008 
00009 #include "tao/Unbounded_Value_Sequence_T.h"
00010 #include <iterator>
00011 
00012 namespace OpenDDS {
00013 namespace DCPS {
00014 
00015   template <typename Sequence>
00016   class SequenceBackInsertIterator
00017   {
00018    public:
00019 
00020     typedef std::output_iterator_tag iterator_category;
00021     typedef void value_type;
00022     typedef void difference_type;
00023     typedef void pointer;
00024     typedef void reference;
00025 
00026     SequenceBackInsertIterator(Sequence& seq) : seq_(&seq) {}
00027 
00028     SequenceBackInsertIterator& operator=(const typename Sequence::value_type& value)
00029     {
00030       size_t len = seq_->length();
00031 
00032       seq_->length(len + 1);
00033       (*seq_)[len] = value;
00034 
00035       return *this;
00036     }
00037 
00038     SequenceBackInsertIterator& operator*() { return *this; }
00039 
00040     SequenceBackInsertIterator& operator++() { return *this; }
00041 
00042     SequenceBackInsertIterator operator++(int) { return *this; }
00043 
00044    private:
00045     Sequence* seq_;
00046   };
00047 
00048   template <typename Sequence>
00049   inline SequenceBackInsertIterator<Sequence> back_inserter(Sequence& seq)
00050   {
00051     return SequenceBackInsertIterator<Sequence>(seq);
00052   }
00053 
00054   template <typename Sequence_>
00055   struct SequenceIterTraits
00056   {
00057     typedef Sequence_ Sequence;
00058     typedef typename Sequence::value_type value_type;
00059     typedef typename Sequence::value_type* pointer;
00060     typedef typename Sequence::value_type& reference;
00061   };
00062 
00063   template <typename Sequence_>
00064   struct ConstSequenceIterTraits
00065   {
00066     typedef const Sequence_ Sequence;
00067     typedef const typename Sequence::value_type value_type;
00068     typedef const typename Sequence::value_type* pointer;
00069     typedef const typename Sequence::value_type& reference;
00070   };
00071 
00072   template <typename Derived, typename IterTraits>
00073   struct SequenceIteratorBase
00074   {
00075     typedef std::random_access_iterator_tag iterator_category;
00076     typedef int difference_type;
00077     typedef typename IterTraits::value_type value_type;
00078     typedef typename IterTraits::pointer pointer;
00079     typedef typename IterTraits::reference reference;
00080 
00081     Derived& as_derived() {
00082       return *static_cast<Derived*>(this);
00083     }
00084 
00085     const Derived& as_derived() const {
00086       return *static_cast<const Derived*>(this);
00087     }
00088 
00089     SequenceIteratorBase() : seq_(), current_(0) {}
00090 
00091     SequenceIteratorBase(typename IterTraits::Sequence& sequence) : seq_(&sequence), current_(0) {}
00092 
00093     operator difference_type() const { return current_; }
00094 
00095     // Forward iterator requirements
00096 
00097     reference operator*() const {
00098       return (*seq_)[current_];
00099     }
00100 
00101     pointer operator->() const {
00102       return &(*seq_)[current_];
00103     }
00104 
00105     Derived& operator++()
00106     {
00107       ++current_;
00108       return as_derived();
00109     }
00110 
00111     Derived operator++(int)
00112     {
00113       Derived iter(as_derived());
00114       ++current_;
00115       return iter;
00116     }
00117 
00118     bool operator==(const Derived& rhs) const
00119     {
00120       return (seq_ == rhs.seq_) && (current_ == rhs.current_);
00121     }
00122 
00123     bool operator!=(const Derived& rhs) const { return !(*this == rhs); }
00124 
00125     // Bidirectional iterator requirements
00126 
00127     Derived& operator--()
00128     {
00129       --current_;
00130       return as_derived();
00131     }
00132 
00133     Derived operator--(int)
00134     {
00135       Derived iter(as_derived());
00136       --current_;
00137       return iter;
00138     }
00139 
00140     // Random-access iterator requirements
00141 
00142     reference operator[](difference_type n) const { return (*seq_)[n]; }
00143 
00144     Derived& operator+=(difference_type n)
00145     {
00146       current_ += n;
00147       return as_derived();
00148     }
00149 
00150     Derived operator+(difference_type n) const
00151     {
00152       Derived iter(as_derived());
00153       iter.current_ += n;
00154       return iter;
00155     }
00156 
00157     Derived& operator-=(difference_type n)
00158     {
00159       current_ -= n;
00160       return as_derived();
00161     }
00162 
00163     Derived operator-(difference_type n) const
00164     {
00165       Derived iter(as_derived());
00166       iter.current_ -= n;
00167       return iter;
00168     }
00169 
00170     Derived& operator+=(const Derived& rhs)
00171     {
00172       current_ += rhs.current_;
00173       return *this;
00174     }
00175 
00176     Derived operator+(const Derived& rhs) const
00177     {
00178       Derived iter(*this);
00179       iter.current_ += rhs.current_;
00180       return iter;
00181     }
00182 
00183     Derived& operator-=(const Derived& rhs)
00184     {
00185       current_ -= rhs.current_;
00186       return as_derived();
00187     }
00188 
00189     Derived operator-(const Derived& rhs) const
00190     {
00191       Derived iter(as_derived());
00192       iter.current_ -= rhs.current_;
00193       return iter;
00194     }
00195 
00196     bool operator<(const Derived& rhs) const
00197     {
00198       return current_ < rhs.current_;
00199     }
00200 
00201     bool operator>(const Derived& rhs) const
00202     {
00203       return current_ > rhs.current_;
00204     }
00205 
00206     bool operator<=(const Derived& rhs) const
00207     {
00208       return current_ <= rhs.current_;
00209     }
00210 
00211     bool operator>=(const Derived& rhs) const
00212     {
00213       return current_ >= rhs.current_;
00214     }
00215 
00216     static Derived begin(typename IterTraits::Sequence& sequence) {
00217       Derived iter(sequence);
00218       iter.current_ = 0;
00219       return iter;
00220     }
00221 
00222     static Derived end(typename IterTraits::Sequence& sequence) {
00223       Derived iter(sequence);
00224       iter.current_ = sequence.length();
00225       return iter;
00226     }
00227 
00228    protected:
00229     typename IterTraits::Sequence* seq_;
00230     difference_type current_;
00231   };
00232 
00233   template <typename Sequence>
00234   struct SequenceIterator : public SequenceIteratorBase<SequenceIterator<Sequence>,
00235                                                         SequenceIterTraits<Sequence> >
00236   {
00237     typedef SequenceIteratorBase<SequenceIterator<Sequence>,
00238                                  SequenceIterTraits<Sequence> > Base;
00239 
00240     SequenceIterator() : Base() {}
00241     SequenceIterator(typename SequenceIterTraits<Sequence>::Sequence& seq) : Base(seq) {}
00242   };
00243 
00244   template <typename Sequence>
00245   struct ConstSequenceIterator : public SequenceIteratorBase<ConstSequenceIterator<Sequence>,
00246                                                              ConstSequenceIterTraits<Sequence> >
00247   {
00248     typedef SequenceIteratorBase<ConstSequenceIterator<Sequence>,
00249                                  ConstSequenceIterTraits<Sequence> > Base;
00250 
00251     ConstSequenceIterator() : Base() {}
00252     ConstSequenceIterator(typename ConstSequenceIterTraits<Sequence>::Sequence& seq) : Base(seq) {}
00253   };
00254 
00255   template <typename Sequence>
00256   inline SequenceIterator<Sequence> sequence_begin(Sequence& seq)
00257   {
00258     return SequenceIterator<Sequence>::Base::begin(seq);
00259   }
00260 
00261   template <typename Sequence>
00262   inline SequenceIterator<Sequence> sequence_end(Sequence& seq)
00263   {
00264     return SequenceIterator<Sequence>::Base::end(seq);
00265   }
00266 
00267   template <typename Sequence>
00268   inline ConstSequenceIterator<Sequence> const_sequence_begin(Sequence& seq)
00269   {
00270     return ConstSequenceIterator<Sequence>::Base::begin(seq);
00271   }
00272 
00273   template <typename Sequence>
00274   inline ConstSequenceIterator<Sequence> const_sequence_end(Sequence& seq)
00275   {
00276     return ConstSequenceIterator<Sequence>::Base::end(seq);
00277   }
00278 }  // namespace DCPS
00279 }  // namespace OpenDDS
00280 
00281 #endif
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Defines

Generated on 10 Aug 2018 for OpenDDS by  doxygen 1.6.1