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_IMAGE_GRAPH_ELT_WINDOW_HH
00027 # define MLN_CORE_IMAGE_GRAPH_ELT_WINDOW_HH
00028 
00032 
00033 # include <mln/core/concept/window.hh>
00034 # include <mln/core/internal/neighborhood_base.hh>
00035 # include <mln/core/internal/graph_window_base.hh>
00036 # include <mln/core/image/graph_window_piter.hh>
00037 
00038 
00039 namespace mln
00040 {
00041 
00043   template <typename G, typename S> class graph_elt_window;
00044   template <typename G, typename F> struct p_edges;
00045   template <typename G, typename F> struct p_vertices;
00046 
00047 
00048   namespace internal
00049   {
00050 
00051     template <typename G, typename S, typename E>
00052     struct neighborhood_impl<graph_elt_window<G,S>,E>
00053       : public neighborhood_extra_impl<graph_elt_window<G,S>,E>
00054     {
00055     };
00056 
00057 
00060     template <typename G, typename S>
00061     struct graph_window_iter_dispatch;
00062 
00063     template <typename G, typename F>
00064     struct graph_window_iter_dispatch<G, p_edges<G,F> >
00065     {
00066       typedef mln_edge_nbh_edge_fwd_iter(G) nbh_fwd_iter_;
00067       typedef mln_edge_nbh_edge_bkd_iter(G) nbh_bkd_iter_;
00068     };
00069 
00070     template <typename G, typename F>
00071     struct graph_window_iter_dispatch<G, p_vertices<G,F> >
00072     {
00073       typedef mln_vertex_nbh_vertex_fwd_iter(G) nbh_fwd_iter_;
00074       typedef mln_vertex_nbh_vertex_bkd_iter(G) nbh_bkd_iter_;
00075     };
00076 
00077 
00078   } 
00079 
00080 
00081   namespace trait
00082   {
00083 
00084     template <typename G, typename S>
00085     struct window_< mln::graph_elt_window<G,S> >
00086     {
00087       typedef trait::window::size::unknown       size;
00088       typedef trait::window::support::irregular  support;
00089       typedef trait::window::definition::varying definition;
00090     };
00091 
00092   } 
00093 
00094 
00098   template <typename G, typename S>
00099   class graph_elt_window
00100     : public graph_window_base<mln_result(S::fun_t),
00101                                graph_elt_window<G,S> >,
00102       public internal::graph_window_iter_dispatch<G,S>
00103   {
00104     typedef graph_elt_window<G,S> self_;
00105     typedef internal::graph_window_iter_dispatch<G,S> super_;
00106 
00107     typedef typename super_::nbh_fwd_iter_ nbh_fwd_iter_;
00108     typedef typename super_::nbh_bkd_iter_ nbh_bkd_iter_;
00109 
00110   public:
00113     typedef S target;
00115     typedef mln_psite(target) psite;
00116 
00119     typedef graph_window_piter<target,self_,nbh_fwd_iter_> fwd_qiter;
00120 
00123     typedef graph_window_piter<target,self_,nbh_bkd_iter_> bkd_qiter;
00124 
00126     typedef fwd_qiter qiter;
00128 
00129   };
00130 
00131 } 
00132 
00133 
00134 #endif // ! MLN_CORE_IMAGE_GRAPH_ELT_WINDOW_HH