00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026 #ifndef MLN_CORE_INTERNAL_SITE_ITERATOR_BASE_HH
00027 # define MLN_CORE_INTERNAL_SITE_ITERATOR_BASE_HH
00028
00032
00033
00034 # include <mln/core/concept/site_iterator.hh>
00035 # include <mln/core/concept/pseudo_site.hh>
00036
00037
00038
00039 namespace mln
00040 {
00041
00042 namespace internal
00043 {
00044
00055 template <typename S, typename E>
00056 struct site_iterator_base : Site_Iterator<E>,
00057 proxy_impl< const mln_psite(S)&, E>
00058 {
00060 typedef S target;
00061
00063 typedef mln_site(S) site;
00064
00066 const mln_site(S)& to_site() const;
00067
00068
00069
00070
00071
00072
00073
00074
00075
00076
00077
00079 const mln_psite(S)& subj_();
00080
00082 const S*& target_();
00083
00084 protected:
00085
00086 site_iterator_base();
00087
00089 const S* s_;
00090
00091 private:
00092
00093 typedef proxy_impl< const mln_psite(S)&, E> super_;
00094 };
00095
00096
00097 #ifndef MLN_INCLUDE_ONLY
00098
00099 template <typename S, typename E>
00100 inline
00101 site_iterator_base<S, E>::site_iterator_base()
00102 : s_(0)
00103 {
00104 }
00105
00106 template <typename S, typename E>
00107 inline
00108 const mln_site(S)&
00109 site_iterator_base<S, E>::to_site() const
00110 {
00111 mln_precondition(exact(*this).is_valid());
00112 return this->get_subject();
00113 }
00114
00115 template <typename S, typename E>
00116 inline
00117 const mln_psite(S)&
00118 site_iterator_base<S, E>::subj_()
00119 {
00120 return exact(this)->p_hook_();
00121 }
00122
00123 template <typename S, typename E>
00124 inline
00125 const S*&
00126 site_iterator_base<S, E>::target_()
00127 {
00128 return s_;
00129 }
00130
00131 #endif // ! MLN_INCLUDE_ONLY
00132
00133 }
00134
00135 }
00136
00137
00138 #endif // ! MLN_CORE_INTERNAL_SITE_ITERATOR_BASE_HH