00001 #ifndef _theplu_yat_utility_weight_iterator_
00002 #define _theplu_yat_utility_weight_iterator_
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026 #include <boost/iterator/iterator_adaptor.hpp>
00027 #include <boost/type_traits/remove_reference.hpp>
00028
00029 namespace theplu {
00030 namespace yat {
00031 namespace utility {
00032
00036 template<typename Base>
00037 class WeightIterator
00038 : public boost::iterator_adaptor<
00039 WeightIterator<Base>
00040 , Base
00041 , typename boost::remove_reference<typename iterator_traits<Base>::weight_reference>::type
00042 , boost::use_default
00043 , typename iterator_traits<Base>::weight_reference
00044 >
00045
00046 {
00047 public:
00051 explicit WeightIterator(Base b)
00052 : WeightIterator::iterator_adaptor_(b) {}
00053
00062 template<typename B2>
00063 WeightIterator(WeightIterator<B2> other,
00064 typename boost::enable_if_convertible<B2, Base>::type* = 0 )
00065 : WeightIterator::iterator_adaptor_(other.base()) {}
00066
00072 typename iterator_traits<Base>::weight_reference operator*(void) const
00073 { return iterator_traits<Base>().weight(this->base()); }
00074
00075 private:
00076 };
00077
00083 template<typename Base>
00084 WeightIterator<Base> weight_iterator(Base base)
00085 {
00086 return WeightIterator<Base>(base);
00087 }
00088
00089
00090
00091 }}}
00092
00093 #endif