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_EXTENSION_FILL_HH
00027 # define MLN_EXTENSION_FILL_HH
00028
00035
00036 # include <mln/core/concept/image.hh>
00037 # include <mln/trait/image/props.hh>
00038 # include <mln/border/fill.hh>
00039 # include <mln/data/fill_with_value.hh>
00040
00041
00042 namespace mln
00043 {
00044
00045 namespace extension
00046 {
00047
00058 template <typename I>
00059 void fill(const Image<I>& ima, const mln_value(I)& val);
00060
00061
00062 # ifndef MLN_INCLUDE_ONLY
00063
00064
00065 namespace internal
00066 {
00067
00068
00069
00070 template <typename I>
00071 void do_fill(I& ima, const mln_value(I)& val);
00072
00073 template <typename I>
00074 void do_fill(mln::trait::image::ext_domain::some,
00075 mln::trait::image::ext_value::single,
00076 mln::trait::image::ext_domain::none,
00077 I& ima, const mln_value(I)& val)
00078 {
00079 ima.change_extension(val);
00080 }
00081
00082 template <typename I>
00083 void do_fill(mln::trait::image::ext_domain::some,
00084 mln::trait::image::ext_value::multiple,
00085 mln::trait::image::ext_domain::none,
00086 I& ima, const mln_value(I)& val)
00087 {
00088 border::fill(ima, val);
00089 ima.change_extension(val);
00090 }
00091
00092 template <typename I>
00093 void do_fill(mln::trait::image::ext_domain::some,
00094 mln::trait::image::ext_value::any,
00095 mln::trait::image::ext_domain::some,
00096 I& ima, const mln_value(I)& val)
00097 {
00098 mln::extension::fill(ima.unmorph_(), val);
00099 }
00100
00101 template <typename I>
00102 void do_fill(mln::trait::image::ext_domain::none,
00103 mln::trait::image::ext_value::any,
00104 mln::trait::image::ext_domain::any,
00105 I& ima, const mln_value(I)& val)
00106 {
00107
00108 }
00109
00110 template <typename I>
00111 void do_fill(I& ima, const mln_value(I)& val)
00112 {
00113 typedef typename I::delegatee D;
00114 do_fill(mln_trait_image_ext_domain(I)(),
00115 mln_trait_image_ext_value(I)(),
00116 mln_trait_image_ext_domain(D)(),
00117 ima, val);
00118 }
00119
00120
00121
00122
00123
00124 template <typename I>
00125 void fill_dispatch(mln::trait::image::ext_domain::none,
00126 mln::trait::image::ext_io::any,
00127 I& , const mln_value(I)& )
00128 {
00129
00130 }
00131
00132 template <typename I>
00133 void fill_dispatch(mln::trait::image::ext_domain::some,
00134 mln::trait::image::ext_io::read_only,
00135 I& ima, const mln_value(I)& val)
00136 {
00137
00138 border::fill(ima, val);
00139 }
00140
00141 template <typename I>
00142 void fill_dispatch(mln::trait::image::ext_domain::extendable,
00143 mln::trait::image::ext_io::read_write,
00144 I& ima, const mln_value(I)& val)
00145 {
00146
00147 border::fill(ima, val);
00148 }
00149
00150 template <typename I>
00151 void fill_dispatch(mln::trait::image::ext_domain::some,
00152 mln::trait::image::ext_io::read_write,
00153 I& ima, const mln_value(I)& val)
00154 {
00155 do_fill(ima, val);
00156 }
00157
00158 template <typename I>
00159 void fill_dispatch(const Image<I>& ima_, const mln_value(I)& val)
00160 {
00161 I& ima = const_cast<I&>(exact(ima_));
00162 fill_dispatch(mln_trait_image_ext_domain(I)(),
00163 mln_trait_image_ext_io(I)(),
00164 ima, val);
00165 }
00166
00167 }
00168
00169
00170
00171
00172 template <typename I>
00173 void fill(const Image<I>& ima, const mln_value(I)& val)
00174 {
00175 trace::entering("extension::fill");
00176
00177 mln_precondition(exact(ima).is_valid());
00178 internal::fill_dispatch(ima, val);
00179
00180 trace::exiting("extension::fill");
00181 }
00182
00183 # endif // ! MLN_INCLUDE_ONLY
00184
00185 }
00186
00187 }
00188
00189
00190 #endif // ! MLN_EXTENSION_FILL_HH