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 "iterator_traits.h"
00027
00028 #include <boost/concept_check.hpp>
00029 #include <boost/iterator/iterator_adaptor.hpp>
00030 #include <boost/type_traits/remove_reference.hpp>
00031
00032 namespace theplu {
00033 namespace yat {
00034 namespace utility {
00035
00060 template<typename Base>
00061 class WeightIterator
00062 : public boost::iterator_adaptor<
00063 WeightIterator<Base>
00064 , Base
00065 , typename boost::remove_reference<typename iterator_traits<Base>::weight_reference>::type
00066 , boost::use_default
00067 , typename iterator_traits<Base>::weight_reference
00068 >
00069
00070 {
00071 public:
00077 WeightIterator(void)
00078 : WeightIterator::iterator_adaptor_()
00079 {
00080 BOOST_CONCEPT_ASSERT((boost::InputIterator<Base>));
00081 }
00082
00086 explicit WeightIterator(Base b)
00087 : WeightIterator::iterator_adaptor_(b)
00088 {
00089 BOOST_CONCEPT_ASSERT((boost::InputIterator<Base>));
00090 }
00091
00100 template<typename B2>
00101 WeightIterator(WeightIterator<B2> other,
00102 typename boost::enable_if_convertible<B2, Base>::type* = 0 )
00103 : WeightIterator::iterator_adaptor_(other.base()) {}
00104
00110 typename iterator_traits<Base>::weight_reference operator*(void) const
00111 { return iterator_traits<Base>().weight(this->base()); }
00112
00113 private:
00114 };
00115
00123 template<typename Base>
00124 WeightIterator<Base> weight_iterator(Base base)
00125 {
00126 return WeightIterator<Base>(base);
00127 }
00128
00129
00130
00131 }}}
00132
00133 #endif