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 (void) ima;
00108 (void) val;
00109
00110 }
00111
00112 template <typename I>
00113 void do_fill(I& ima, const mln_value(I)& val)
00114 {
00115 typedef typename I::delegatee D;
00116 do_fill(mln_trait_image_ext_domain(I)(),
00117 mln_trait_image_ext_value(I)(),
00118 mln_trait_image_ext_domain(D)(),
00119 ima, val);
00120 }
00121
00122
00123
00124
00125
00126 template <typename I>
00127 void fill_dispatch(mln::trait::image::ext_domain::none,
00128 mln::trait::image::ext_io::any,
00129 I& , const mln_value(I)& )
00130 {
00131
00132 }
00133
00134 template <typename I>
00135 void fill_dispatch(mln::trait::image::ext_domain::some,
00136 mln::trait::image::ext_io::read_only,
00137 I& ima, const mln_value(I)& val)
00138 {
00139
00140 border::fill(ima, val);
00141 }
00142
00143 template <typename I>
00144 void fill_dispatch(mln::trait::image::ext_domain::extendable,
00145 mln::trait::image::ext_io::read_write,
00146 I& ima, const mln_value(I)& val)
00147 {
00148
00149 border::fill(ima, val);
00150 }
00151
00152 template <typename I>
00153 void fill_dispatch(mln::trait::image::ext_domain::some,
00154 mln::trait::image::ext_io::read_write,
00155 I& ima, const mln_value(I)& val)
00156 {
00157 do_fill(ima, val);
00158 }
00159
00160 template <typename I>
00161 void fill_dispatch(const Image<I>& ima_, const mln_value(I)& val)
00162 {
00163 I& ima = const_cast<I&>(exact(ima_));
00164 fill_dispatch(mln_trait_image_ext_domain(I)(),
00165 mln_trait_image_ext_io(I)(),
00166 ima, val);
00167 }
00168
00169 }
00170
00171
00172
00173
00174 template <typename I>
00175 void fill(const Image<I>& ima, const mln_value(I)& val)
00176 {
00177 trace::entering("extension::fill");
00178
00179 mln_precondition(exact(ima).is_valid());
00180 internal::fill_dispatch(ima, val);
00181
00182 trace::exiting("extension::fill");
00183 }
00184
00185 # endif // ! MLN_INCLUDE_ONLY
00186
00187 }
00188
00189 }
00190
00191
00192 #endif // ! MLN_EXTENSION_FILL_HH