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 
00027 #ifndef MLN_TRAIT_CH_VALUE_HH
00028 # define MLN_TRAIT_CH_VALUE_HH
00029 
00033 
00034 # include <mln/tag/skeleton.hh>
00035 # include <mln/trait/image_from_grid.hh>
00036 # include <mln/trait/ch_function_value.hh>
00037 
00038 
00039 # define mln_ch_value(I, V)  typename mln::trait::ch_value< I, V >::ret
00040 # define mln_ch_value_(I, V)          mln::trait::ch_value< I, V >::ret
00041 
00042 
00043 
00044 namespace mln
00045 {
00046 
00047   
00048   namespace algebra { template <unsigned n, typename T> class vec; }
00049   template <typename G, typename F> class p_edges;
00050   template <typename G, typename F> class p_vertices;
00051   template <typename P, typename V, typename G> class vertex_image;
00052   template <typename P, typename V, typename G> class edge_image;
00053   template <typename I> class labeled_image;
00054   namespace pw { template <typename F, typename S> class image; }
00055 
00056 
00057 
00058   namespace trait
00059   {
00060 
00061     
00062     template <typename I, typename V> struct ch_value;
00063 
00064 
00065     namespace impl
00066     {
00067 
00068       
00069       template <typename I, typename V> struct ch_value_;
00070 
00071       template <typename I, typename V>
00072       struct ch_value_< tag::image_<I>,  V  >
00073       {
00074         typedef mln_ch_value(I, V) ret;
00075       };
00076 
00077       template < template <class> class M, typename T,
00078                  typename V >
00079       struct ch_value_<  M< tag::value_<T> >,  V  >
00080       {
00081         typedef M< V > ret;
00082       };
00083 
00084       template < template <class> class M, typename I,
00085                  typename V >
00086       struct ch_value_<  M< tag::image_<I> >,  V  >
00087       {
00088         typedef M< mln_ch_value(I, V) > ret;
00089       };
00090 
00091       template < template <class, class> class M, typename T, typename I,
00092                  typename V >
00093       struct ch_value_<  M< tag::value_<T>, tag::image_<I> >,  V  >
00094       {
00095         typedef mln_ch_value(I, V) ret;
00096       };
00097 
00098       template < template <class, class> class M, typename P, typename T,
00099                  typename V >
00100       struct ch_value_<  M< tag::psite_<P>, tag::value_<T> >,  V  >
00101       {
00102         typedef M< P, V > ret;
00103       };
00104 
00105       template < template <class, class> class M, typename I1, typename I2,
00106                  typename V >
00107       struct ch_value_<  M< tag::image_<I1>, tag::image_<I2> >,  V  >
00108       {
00109         typedef M< mln_ch_value(I1, V), mln_ch_value(I2, V) > ret;
00110       };
00111 
00112       template < template <class, class> class M, typename I, typename E,
00113                  typename V >
00114       struct ch_value_<  M< tag::image_<I>, tag::ext_<E> >,  V  >
00115       {
00116         typedef M< mln_ch_value(I, V), E > ret;
00117       };
00118 
00119 
00120       
00121       template < template <unsigned, class> class M, unsigned n, typename I,
00122                  typename V >
00123       struct ch_value_<  M< n, tag::image_<I> >,  V  >
00124       {
00125         
00126 
00127 
00128 
00129 
00130 
00131 
00132 
00133 
00134         typedef mln_ch_value(I, V) ret;
00135       };
00136 
00137 
00138       
00139       template < template <unsigned, class, class> class M,
00140                  unsigned D, typename G, typename T, typename V >
00141       struct ch_value_<  M< D, tag::psite_<G>, tag::value_<T> >,  V  >
00142       {
00143         typedef M< D, G, V > ret;
00144       };
00145 
00146       
00147       template < template <class, class> class M, typename I, typename N,
00148                  typename V >
00149       struct ch_value_<  M< tag::image_<I>, tag::neighb_<N> >,  V  >
00150       {
00151         typedef M < mln_ch_value(I, V), N > ret;
00152       };
00153 
00154       template < template <class, class> class M, typename I, typename S,
00155                  typename V >
00156       struct ch_value_<  M< tag::image_<I>, tag::domain_<S> >,  V  >
00157       {
00158         typedef M< mln_ch_value(I, V), S > ret;
00159       };
00160 
00161       template < template <class, class> class M, typename F, typename S,
00162                  typename V >
00163       struct ch_value_<  M< tag::function_<F>, tag::domain_<S> >,  V  >
00164       {
00165         
00166         typedef mln_deduce(S, site, grid) grid;
00167         typedef typename image_from_grid< grid, V >::ret ret;
00168       };
00169 
00170 
00171       
00172       template < typename F,
00173                  typename G, typename FP,
00174                  typename V >
00175       struct ch_value_<  pw::image< tag::function_<F>, tag::domain_<p_edges<G, FP> > >,  V  >
00176       {
00177         typedef pw::image< mln_ch_function_value(F, V), p_edges<G, FP> > ret;
00178       };
00179 
00180       
00181       template < typename F,
00182                  typename G, typename FP,
00183                  typename V >
00184       struct ch_value_<  pw::image< tag::function_<F>, tag::domain_<p_vertices<G, FP> > >,  V  >
00185 
00186       {
00187         typedef pw::image< mln_ch_function_value(F, V), p_vertices<G, FP> > ret;
00188       };
00189 
00190       
00191       template < typename P, typename V1, typename G, typename V2>
00192       struct ch_value_< vertex_image< tag::psite_<P>,
00193                                       tag::value_<V1>,
00194                                       tag::graph_<G> >,
00195                         V2 >
00196       {
00197         typedef vertex_image< P, V2, G > ret;
00198       };
00199 
00200       
00201       template < typename P, typename V1, typename G, typename V2>
00202       struct ch_value_< edge_image< tag::psite_<P>,
00203                                     tag::value_<V1>,
00204                                     tag::graph_<G> >,
00205                         V2 >
00206       {
00207         typedef edge_image< P, V2, G > ret;
00208       };
00209 
00210       
00211       template < typename I, typename V>
00212       struct ch_value_< labeled_image< tag::image_<I> >,
00213                         V >
00214       {
00215         typedef mln_ch_value(I,V) ret;
00216       };
00217 
00218 
00219       template < template <class, class> class M, typename T, typename S,
00220                  typename V >
00221       struct ch_value_<  M< tag::value_<T>, tag::domain_<S> >,  V  >
00222       {
00223         
00224         typedef mln_deduce(S, site, grid) grid;
00225         typedef typename image_from_grid< grid, V >::ret ret;
00226       };
00227 
00228 
00229       template < template <class, class> class M, typename I, typename F,
00230                  typename V >
00231       struct ch_value_<  M< tag::image_<I>, tag::function_<F> >,  V  >
00232       {
00233         typedef M< mln_ch_value(I, V), F > ret;
00234       };
00235 
00236     } 
00237 
00238 
00239     template <typename I, typename V>
00240     struct ch_value
00241     {
00242       typedef typename I::skeleton skeleton;
00243       typedef typename impl::ch_value_<skeleton, V>::ret ret;
00244     };
00245 
00246   } 
00247 
00248 } 
00249 
00250 
00251 #endif // ! MLN_TRAIT_CH_VALUE_HH