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
00038 template<typename Base>
00039 class DataIterator
00040 : public boost::iterator_adaptor<
00041 DataIterator<Base>
00042 , Base
00043 , typename boost::remove_reference<typename iterator_traits<Base>::data_reference>::type
00044 , boost::use_default
00045 , typename iterator_traits<Base>::data_reference
00046 >
00047
00048 {
00049 public:
00053 explicit DataIterator(Base b)
00054 : DataIterator::iterator_adaptor_(b) {}
00055
00063 template<typename B2>
00064 DataIterator(DataIterator<B2> other,
00065 typename boost::enable_if_convertible<B2, Base>::type* = 0 )
00066 : DataIterator::iterator_adaptor_(other.base()) {}
00067
00073 typename iterator_traits<Base>::data_reference operator*(void) const
00074 { return iterator_traits<Base>().data(this->base()); }
00075
00076 private:
00077 };
00078
00084 template<typename Base>
00085 DataIterator<Base> data_iterator(Base base)
00086 {
00087 return DataIterator<Base>(base);
00088 }
00089
00090
00091
00092 }}}
00093
00094 #endif