00001 #ifndef _theplu_yat_utility_weighted_iterator_
00002 #define _theplu_yat_utility_weighted_iterator_
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025 #include "DataWeight.h"
00026 #include "DataWeightProxy.h"
00027
00028 #include <boost/iterator/iterator_facade.hpp>
00029
00030 #include <iterator>
00031
00032 namespace theplu {
00033 namespace yat {
00034 namespace utility {
00035
00043 template<typename DataIterator, typename WeightIterator>
00044 class WeightedIterator
00045 : public boost::iterator_facade<
00046 WeightedIterator<DataIterator, WeightIterator>,
00047 DataWeightProxy<DataIterator, WeightIterator>,
00048 typename std::iterator_traits<DataIterator>::iterator_category,
00049 DataWeightProxy<DataIterator, WeightIterator> >
00050
00051 {
00052 public:
00056 typedef DataIterator data_iterator;
00057
00061 typedef WeightIterator weight_iterator;
00062
00070 WeightedIterator(void)
00071 {}
00072
00076 WeightedIterator(DataIterator d, WeightIterator w)
00077 : d_iter_(d), w_iter_(w)
00078 {}
00079
00083 const DataIterator& data_base(void) const { return d_iter_; }
00084
00088 const WeightIterator& weight_base(void) const { return w_iter_; }
00089
00093 DataWeightProxy<DataIterator, WeightIterator> operator[](int n) const
00094 {
00095 return DataWeightProxy<DataIterator, WeightIterator>(d_iter_+n,
00096 w_iter_+n);
00097 }
00098
00099
00108 template<typename D2, typename W2>
00109 WeightedIterator(WeightedIterator<D2, W2> other,
00110 typename boost::enable_if_convertible<D2,DataIterator>::type* = 0,
00111 typename boost::enable_if_convertible<W2,WeightIterator>::type* = 0)
00112 : d_iter_(other.data_base()), w_iter_(other.weight_base()) {}
00113
00114
00115 private:
00116 friend class boost::iterator_core_access;
00117
00118 DataIterator d_iter_;
00119 WeightIterator w_iter_;
00120
00121 void advance(size_t n)
00122 { std::advance(d_iter_, n); std::advance(w_iter_, n); }
00123
00124 void decrement(void) { --d_iter_; --w_iter_; }
00125
00126 typename std::iterator_traits<DataIterator>::difference_type
00127 distance_to(const WeightedIterator& other) const
00128 { return std::distance(d_iter_, other.d_iter_); }
00129
00130 utility::DataWeightProxy<DataIterator, WeightIterator>
00131 dereference(void) const
00132 { return DataWeightProxy<DataIterator, WeightIterator>(d_iter_,
00133 w_iter_);
00134 }
00135
00136 bool equal(const WeightedIterator& other) const
00137 { return d_iter_==other.d_iter_ && w_iter_==other.w_iter_; }
00138
00139 void increment(void) { ++d_iter_; ++w_iter_; }
00140
00141 };
00142
00150 template<typename DataIterator, typename WeightIterator>
00151 WeightedIterator<DataIterator, WeightIterator>
00152 weighted_iterator(DataIterator data, WeightIterator weight)
00153 {
00154 return WeightedIterator<DataIterator, WeightIterator>(data, weight);
00155 }
00156
00157 }}}
00158
00159 #endif