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_DATA_FILL_HH
00027 # define MLN_DATA_FILL_HH
00028
00034
00035 # include <mln/core/concept/function.hh>
00036 # include <mln/pw/image.hh>
00037 # include <mln/convert/to_fun.hh>
00038
00039 # include <mln/data/fill_with_image.hh>
00040 # include <mln/data/fill_with_value.hh>
00041
00042
00043 namespace mln
00044 {
00045
00046 namespace data
00047 {
00048
00056 template <typename I, typename D>
00057 void fill(Image<I>& ima, const D& data);
00058
00059
00060
00061 # ifndef MLN_INCLUDE_ONLY
00062
00063 namespace internal
00064 {
00065
00066
00067
00068 template <typename I, typename D>
00069 inline
00070 void fill_tests(Image<I>& ima, const D&)
00071 {
00072
00073
00074 (void) ima;
00075
00076 mlc_is(mln_trait_image_value_io(I), trait::image::value_io::read_write)::check();
00077 mln_precondition(exact(ima).is_valid());
00078
00079 }
00080
00081
00082
00083 template <typename I, typename D>
00084 void fill_dispatch(Image<I>& ima, const D& data)
00085 {
00086 fill_dispatch_overload(exact(ima), exact(data));
00087 }
00088
00089
00090
00091 template <typename I>
00092 void fill_dispatch_overload(I& ima, const mln_value(I)& v)
00093 {
00094 mln::data::fill_with_value(ima, v);
00095 }
00096
00097 template <typename I, typename J>
00098 void fill_dispatch_overload(I& ima, const Image<J>& data)
00099 {
00100 mln::data::fill_with_image(ima, data);
00101 }
00102
00103 template <typename I, typename F>
00104 void fill_dispatch_overload(I& ima, const Function<F>& f)
00105 {
00106 mlc_converts_to(mln_result(F), mln_value(I))::check();
00107 mln::data::fill_with_image(ima,
00108 exact(f) | ima.domain());
00109 }
00110
00111 template <typename I, typename R, typename A>
00112 void fill_dispatch_overload(I& ima, R (*f)(A))
00113 {
00114 mlc_converts_to(R, mln_value(I))::check();
00115 mln::data::fill_with_image(ima,
00116 convert::to_fun(f) | ima.domain());
00117 }
00118
00119 template <typename I, typename V, unsigned N>
00120 void fill_dispatch_overload(I& ima, V (&arr)[N])
00121 {
00122 mlc_converts_to(V, mln_value(I))::check();
00123 mln_precondition(N == ima.nsites());
00124 mln_fwd_piter(I) p(ima.domain());
00125 unsigned i = 0;
00126 for_all(p)
00127 ima(p) = arr[i++];
00128 }
00129
00130 }
00131
00132
00133
00134
00135 template <typename I, typename D>
00136 inline
00137 void fill(Image<I>& ima, const D& data)
00138 {
00139 trace::entering("data::fill");
00140
00141 internal::fill_tests(ima, data);
00142 internal::fill_dispatch(ima, data);
00143
00144 trace::exiting("data::fill");
00145 }
00146
00147
00148 # endif // ! MLN_INCLUDE_ONLY
00149
00150 }
00151
00152 }
00153
00154
00155 #endif // ! MLN_DATA_FILL_HH