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