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_NEIGHB_NITER_IMPL_HH
00027 # define MLN_CORE_INTERNAL_NEIGHB_NITER_IMPL_HH
00028
00032
00033 # include <mln/core/macros.hh>
00034 # include <mln/core/internal/force_exact.hh>
00035
00036
00037 namespace mln
00038 {
00039
00040
00041 template <typename P, typename W> class graph_window_base;
00042 template <typename G, typename F> class graph_elt_window;
00043 template <typename G, typename F, typename I> class graph_elt_window_if;
00044 template <typename G, typename F> class line_graph_elt_window;
00045 namespace util
00046 {
00047 template <typename G> class vertex;
00048 template <typename G> class edge;
00049 }
00050
00051
00052 namespace internal
00053 {
00054
00056 template <typename W, typename E>
00057 struct neighb_niter_impl
00058 {
00059
00060 };
00061
00074 template <typename P, typename E>
00075 struct neighb_niter_impl_graph_window
00076 {
00077 unsigned id() const
00078 {
00079 return internal::force_exact<E>(*this).compute_p_().id();
00080 }
00081
00082 };
00083
00089 template <typename G, typename E>
00090 struct neighb_niter_impl_graph_window< util::vertex<G>, E >
00091 {
00092 };
00093
00099 template <typename G, typename E>
00100 struct neighb_niter_impl_graph_window< util::edge<G>, E >
00101 {
00102 };
00103
00104
00107 template <typename P, typename T, typename E>
00108 struct neighb_niter_impl< graph_window_base<P, T>, E >
00109 : neighb_niter_impl_graph_window<P,E>
00110 {
00111 typedef typename T::target S;
00112
00113
00114
00115
00116 mln_graph_element(S) element() const
00117 {
00118 return internal::force_exact<E>(*this).compute_p_().element();
00119 }
00120
00121 };
00122
00123
00124
00127 template <typename G, typename S, typename E>
00128 struct neighb_niter_impl<graph_elt_window<G,S>, E>
00129 : public neighb_niter_impl< graph_window_base< mln_result(S::fun_t),
00130 graph_elt_window<G,S> >,
00131 E >
00132 {
00133
00134 };
00135
00138 template <typename G, typename F, typename E>
00139 struct neighb_niter_impl<line_graph_elt_window<G,F>, E>
00140 : public neighb_niter_impl< graph_window_base< mln_result(F),
00141 line_graph_elt_window<G, F> >,
00142 E >
00143 {
00144
00145 };
00146
00147
00150 template <typename G, typename S, typename I, typename E>
00151 struct neighb_niter_impl<graph_elt_window_if<G,S,I>, E>
00152 : public neighb_niter_impl< graph_window_base< mln_result(S::fun_t),
00153 graph_elt_window_if<G,S,I> >,
00154 E >
00155 {
00156
00157 };
00158
00159
00160 }
00161
00162 }
00163
00164 #endif // ! MLN_CORE_INTERNAL_NEIGHB_NITER_IMPL_HH