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
00055 template<typename Base>
00056 class WeightIterator
00057 : public boost::iterator_adaptor<
00058 WeightIterator<Base>
00059 , Base
00060 , typename boost::remove_reference<typename iterator_traits<Base>::weight_reference>::type
00061 , boost::use_default
00062 , typename iterator_traits<Base>::weight_reference
00063 >
00064
00065 {
00066 public:
00072 WeightIterator(void)
00073 : WeightIterator::iterator_adaptor_() {}
00074
00078 explicit WeightIterator(Base b)
00079 : WeightIterator::iterator_adaptor_(b) {}
00080
00089 template<typename B2>
00090 WeightIterator(WeightIterator<B2> other,
00091 typename boost::enable_if_convertible<B2, Base>::type* = 0 )
00092 : WeightIterator::iterator_adaptor_(other.base()) {}
00093
00099 typename iterator_traits<Base>::weight_reference operator*(void) const
00100 { return iterator_traits<Base>().weight(this->base()); }
00101
00102 private:
00103 };
00104
00112 template<typename Base>
00113 WeightIterator<Base> weight_iterator(Base base)
00114 {
00115 return WeightIterator<Base>(base);
00116 }
00117
00118
00119
00120 }}}
00121
00122 #endif