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_ALIAS_NEIGHB2D_HH
00027 # define MLN_CORE_ALIAS_NEIGHB2D_HH
00028
00035
00036 # include <cmath>
00037 # include <mln/core/alias/window2d.hh>
00038 # include <mln/core/neighb.hh>
00039 # include <mln/convert/from_to.hh>
00040 # include <mln/make/double_neighb2d.hh>
00041 # include <mln/fun/p2b/chess.hh>
00042
00043
00044 namespace mln
00045 {
00046
00051 typedef neighb<window2d> neighb2d;
00052
00053 }
00054
00055
00056 namespace mln
00057 {
00058
00060
00072 const neighb2d& c4();
00073
00074
00076
00088 const neighb2d& c8();
00089
00090
00092
00103 const neighb2d& c2_row();
00104
00105
00107
00119 const neighb2d& c2_col();
00120
00121
00122
00123 neighb< win::multiple<window2d, mln::fun::p2b::chess> > c6_2d();
00124
00125
00126
00127 namespace convert
00128 {
00129
00130 namespace over_load
00131 {
00132
00133 template <unsigned S>
00134 void from_to_(const bool (&values)[S], neighb2d& nbh);
00135
00136 template <unsigned R, unsigned C>
00137 void from_to_(bool const (&values)[R][C], neighb2d& nbh);
00138
00139 }
00140
00141 }
00142
00143
00144
00145 # ifndef MLN_INCLUDE_ONLY
00146
00147 inline
00148 const neighb2d& c4()
00149 {
00150 static neighb2d it;
00151 if (it.size() == 0)
00152 {
00153 static const bool vals[] = { 0, 1, 0,
00154 1, 0, 1,
00155 0, 1, 0 };
00156 convert::from_to(vals, it);
00157 }
00158 return it;
00159 }
00160
00161 inline
00162 const neighb2d& c8()
00163 {
00164 static neighb2d it;
00165 if (it.size() == 0)
00166 {
00167 static const bool vals[] = { 1, 1, 1,
00168 1, 0, 1,
00169 1, 1, 1 };
00170 convert::from_to(vals, it);
00171 }
00172 return it;
00173 }
00174
00175 inline
00176 const neighb2d& c2_row()
00177 {
00178 static neighb2d it;
00179 if (it.size() == 0)
00180 {
00181 static const bool vals[] = { 0, 0, 0,
00182 1, 0, 1,
00183 0, 0, 0 };
00184 convert::from_to(vals, it);
00185 }
00186 return it;
00187 }
00188
00189 inline
00190 const neighb2d& c2_col()
00191 {
00192 static neighb2d it;
00193 if (it.size() == 0)
00194 {
00195 static const bool vals[] = { 0, 1, 0,
00196 0, 0, 0,
00197 0, 1, 0 };
00198 convert::from_to(vals, it);
00199 }
00200 return it;
00201 }
00202
00203
00204 inline
00205 neighb< win::multiple<window2d, mln::fun::p2b::chess> >
00206 c6_2d()
00207 {
00208 bool vert[] = { 1, 1, 0,
00209 1, 0, 1,
00210 0, 1, 1 };
00211
00212 bool hori[] = { 0, 1, 1,
00213 1, 0, 1,
00214 1, 1, 0 };
00215
00216 return make::double_neighb2d(fun::p2b::chess(),
00217 vert,
00218 hori);
00219 }
00220
00221
00222 namespace convert
00223 {
00224
00225 namespace over_load
00226 {
00227
00228 template <unsigned S>
00229 void
00230 from_to_(const bool (&values)[S], neighb2d& nbh)
00231 {
00232 enum { h = mlc_sqrt_int(S) / 2 };
00233 mlc_bool((2 * h + 1) * (2 * h + 1) == S)::check();
00234 window2d& win = nbh.hook_win_();
00235 convert::from_to(values, win);
00236 mln_postcondition(win.is_neighbable_());
00237 }
00238
00239 template <unsigned R, unsigned C>
00240 void
00241 from_to_(bool const (&values)[R][C], neighb2d& nbh)
00242 {
00243 mlc_bool(R % 2 == 1)::check();
00244 mlc_bool(C % 2 == 1)::check();
00245 window2d& win = nbh.hook_win_();
00246 convert::from_to(values, win);
00247 mln_postcondition(win.is_neighbable_());
00248 }
00249
00250 }
00251
00252 }
00253
00254 # endif // ! MLN_INCLUDE_ONLY
00255
00256 }
00257
00258
00259
00260 #endif // ! MLN_CORE_ALIAS_NEIGHB2D_HH