00001 #ifndef _theplu_yat_utility_data_iterator_
00002 #define _theplu_yat_utility_data_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/iterator/iterator_adaptor.hpp>
00029 #include <boost/type_traits/remove_reference.hpp>
00030
00031 namespace theplu {
00032 namespace yat {
00033 namespace utility {
00034
00057 template<typename Base>
00058 class DataIterator
00059 : public boost::iterator_adaptor<
00060 DataIterator<Base>
00061 , Base
00062 , typename boost::remove_reference<typename iterator_traits<Base>::data_reference>::type
00063 , boost::use_default
00064 , typename iterator_traits<Base>::data_reference
00065 >
00066
00067 {
00068 public:
00072 explicit DataIterator(Base b)
00073 : DataIterator::iterator_adaptor_(b) {}
00074
00080 DataIterator(void)
00081 : DataIterator::iterator_adaptor_() {}
00082
00090 template<typename B2>
00091 DataIterator(DataIterator<B2> other,
00092 typename boost::enable_if_convertible<B2, Base>::type* = 0 )
00093 : DataIterator::iterator_adaptor_(other.base()) {}
00094
00100 typename iterator_traits<Base>::data_reference operator*(void) const
00101 { return iterator_traits<Base>().data(this->base()); }
00102
00103 private:
00104 };
00105
00113 template<typename Base>
00114 DataIterator<Base> data_iterator(Base base)
00115 {
00116 return DataIterator<Base>(base);
00117 }
00118
00119
00120
00121 }}}
00122
00123 #endif