00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022 #ifndef TOOL_VALUED_ITERATOR_HH_
00023 # define TOOL_VALUED_ITERATOR_HH_
00024
00025 # include <boost/optional.hpp>
00026
00027 # include <wipal/tool/iterator.hh>
00028
00029 namespace wpl
00030 {
00031
00032 namespace tool
00033 {
00034
00035
00036
00037
00038
00039 template <class B>
00040 struct valued_iterator;
00041
00042
00043
00044
00045
00046
00048 template <class B>
00049 struct types< valued_iterator<B> >
00050 {
00052 typedef undefined_type value_type;
00053
00055 typedef undefined_type iterable_type;
00056 };
00057
00058
00059
00060
00061
00080 template <class Bottom>
00081 struct valued_iterator: WP_INHERIT(public iterator, valued_iterator<Bottom>)
00082 {
00083
00085
00086 typedef WP_GET_EXACT(Bottom, valued_iterator<Bottom>) exact_type;
00087 typedef iterator<exact_type> super_type;
00088 typedef WP_TYPE(value_type, exact_type) value_type;
00090
00092
00093 const value_type& get() const;
00094 value_type& get();
00096
00098
00099 const value_type* get_ptr() const;
00100 value_type* get_ptr();
00102
00103 protected:
00104
00106 ~valued_iterator();
00107
00109 typedef typename boost::optional<value_type> optional_value;
00110
00112
00113 const optional_value& value() const;
00114 optional_value& value();
00116
00117 private:
00118
00120 optional_value v_;
00121
00122 };
00123
00124 }
00125
00126 }
00127
00128 # include "valued_iterator.hxx"
00129
00130 #endif // ! TOOL_VALUED_ITERATOR_HH_