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_GEOM_PMIN_PMAX_HH
00027 # define MLN_GEOM_PMIN_PMAX_HH
00028
00033
00034 # include <utility>
00035
00036 # include <mln/core/concept/site_set.hh>
00037 # include <mln/core/concept/box.hh>
00038
00039
00040
00041 namespace mln
00042 {
00043
00044 namespace geom
00045 {
00046
00047
00049 template <typename S>
00050 std::pair<mln_site(S), mln_site(S)>
00051 pmin_pmax(const Site_Set<S>& s);
00052
00053
00056 template <typename S>
00057 void
00058 pmin_pmax(const Site_Set<S>& s, mln_site(S)& pmin, mln_site(S)& pmax);
00059
00060
00063 template <typename I>
00064 std::pair<mln_site(I), mln_site(I)>
00065 pmin_pmax(const Site_Iterator<I>& p);
00066
00067
00070 template <typename I>
00071 void
00072 pmin_pmax(const Site_Iterator<I>& p, mln_site(I)& pmin, mln_site(I)& pmax);
00073
00074
00075
00076 # ifndef MLN_INCLUDE_ONLY
00077
00078
00079
00080
00081 template <typename I>
00082 inline
00083 void
00084 pmin_pmax(const Site_Iterator<I>& p_, mln_site(I)& pmin, mln_site(I)& pmax)
00085 {
00086 I p = exact(p_);
00087
00088
00089 p.start();
00090 mln_precondition(p.is_valid());
00091 pmin = pmax = p;
00092
00093
00094 typedef mln_site(I) P;
00095 for_all_remaining(p)
00096 for (unsigned i = 0; i < P::dim; ++i)
00097 if (p[i] < pmin[i])
00098 pmin[i] = p[i];
00099 else if (p[i] > pmax[i])
00100 pmax[i] = p[i];
00101 }
00102
00103 template <typename I>
00104 inline
00105 std::pair<mln_site(I), mln_site(I)>
00106 pmin_pmax(const Site_Iterator<I>& p)
00107 {
00108 typedef mln_site(I) P;
00109 std::pair<P, P> tmp;
00110 pmin_pmax(p, tmp.first, tmp.second);
00111 return tmp;
00112 }
00113
00114
00115
00116
00117 namespace impl
00118 {
00119
00120
00121
00122 template <typename S>
00123 inline
00124 void
00125 pmin_pmax_(const Site_Set<S>& s, mln_site(S)& pmin, mln_site(S)& pmax)
00126 {
00127 mln_piter(S) it(exact(s));
00128 pmin_pmax(it, pmin, pmax);
00129 }
00130
00131
00132
00133 template <typename B>
00134 inline
00135 void
00136 pmin_pmax_(const Box<B>& b, mln_site(B)& pmin, mln_site(B)& pmax)
00137 {
00138 pmin = exact(b).pmin();
00139 pmax = exact(b).pmax();
00140 }
00141
00142 }
00143
00144
00145 template <typename S>
00146 inline
00147 void
00148 pmin_pmax(const Site_Set<S>& s, mln_site(S)& pmin, mln_site(S)& pmax)
00149 {
00150 mln_precondition(exact(s).nsites() != 0);
00151 impl::pmin_pmax_(exact(s), pmin, pmax);
00152 }
00153
00154 template <typename S>
00155 inline
00156 std::pair<mln_site(S), mln_site(S)>
00157 pmin_pmax(const Site_Set<S>& s)
00158 {
00159 mln_precondition(exact(s).nsites() != 0);
00160 typedef mln_site(S) P;
00161 std::pair<P, P> tmp;
00162 pmin_pmax(s, tmp.first, tmp.second);
00163 return tmp;
00164 }
00165
00166 # endif // ! MLN_INCLUDE_ONLY
00167
00168 }
00169
00170 }
00171
00172
00173 #endif // ! MLN_GEOM_PMIN_PMAX_HH