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_INTERNAL_IMAGE_IDENTITY_HH
00027 # define MLN_CORE_INTERNAL_IMAGE_IDENTITY_HH
00028
00035
00036 # include <mln/core/internal/image_morpher.hh>
00037
00038
00039 namespace mln
00040 {
00041
00042 namespace internal
00043 {
00044
00045
00046
00047
00048 template <typename trait_speed, typename I, typename E>
00049 struct image_identity_impl__fastest
00050 {
00051
00052 };
00053
00054 template <typename I, typename E>
00055 struct image_identity_impl__fastest< mln::trait::image::speed::fastest, I, E >
00056 {
00057 private:
00058
00059 mlc_const(I)& del_() const
00060 {
00061 return * internal::force_exact<const E>(*this).delegatee_();
00062 }
00063
00064 I& del_()
00065 {
00066 return * internal::force_exact<E>(*this).delegatee_();
00067 }
00068
00069 public:
00070
00071 int delta_index(const mln_deduce(I, psite, delta)& dp) const
00072 {
00073 return del_().delta_index(dp);
00074 }
00075
00076 mln_site(I) point_at_index(unsigned i) const
00077 {
00078 return del_().point_at_index(i);
00079 }
00080
00081 unsigned border() const
00082 {
00083 return del_().border();
00084 }
00085
00086 mln_qlf_value(I)* buffer()
00087 {
00088 return del_().buffer();
00089 }
00090
00091 const mln_value(I)* buffer() const
00092 {
00093 return del_().buffer();
00094 }
00095
00096 mln_rvalue(I) element(unsigned i) const
00097 {
00098 return del_().element(i);
00099 }
00100
00101 mln_lvalue(I) element(unsigned i)
00102 {
00103 return del_().element(i);
00104 }
00105
00106 unsigned nelements() const
00107 {
00108 return del_().nelements();
00109 }
00110 };
00111
00112
00113
00114 template <typename I, typename E>
00115 struct image_identity_impl
00116 : image_identity_impl__fastest< mln_trait_image_speed(E), I, E >
00117 {
00118 };
00119
00120
00121
00126 template <typename I, typename S, typename E>
00127 class image_identity
00128 : public image_identity_impl<I, E>,
00129 public image_morpher<I, mln_value(I), S, E>
00130 {
00131 public:
00132
00134 typedef mln_value(I) value;
00135
00137 typedef mln_rvalue(I) rvalue;
00138
00140 typedef mln_morpher_lvalue(I) lvalue;
00141
00143 rvalue operator()(const mln_psite(S)& p) const;
00144
00146 lvalue operator()(const mln_psite(S)& p);
00147
00148
00149 const mln_domain(I)& domain() const;
00150 bool has(const mln_psite(I)& p) const;
00151
00152 protected:
00153
00155 image_identity();
00156 };
00157
00158
00159
00160 # ifndef MLN_INCLUDE_ONLY
00161
00162 template <typename I, typename S, typename E>
00163 inline
00164 image_identity<I, S, E>::image_identity()
00165 {
00166 }
00167
00168 template <typename I, typename S, typename E>
00169 inline
00170 mln_rvalue(I)
00171 image_identity<I, S, E>::operator()(const mln_psite(S)& p) const
00172 {
00173 mln_precondition(this->delegatee_() != 0);
00174 return this->delegatee_()->operator()(p);
00175 }
00176
00177 template <typename I, typename S, typename E>
00178 inline
00179 typename image_identity<I, S, E>::lvalue
00180 image_identity<I, S, E>::operator()(const mln_psite(S)& p)
00181 {
00182 mln_precondition(this->delegatee_() != 0);
00183 return this->delegatee_()->operator()(p);
00184 }
00185
00186 template <typename I, typename S, typename E>
00187 inline
00188 const mln_domain(I)&
00189 image_identity<I, S, E>::domain() const
00190 {
00191 mln_precondition(this->delegatee_() != 0);
00192 return this->delegatee_()->domain();
00193 }
00194
00195 template <typename I, typename S, typename E>
00196 inline
00197 bool
00198 image_identity<I, S, E>::has(const mln_psite(I)& p) const
00199 {
00200 mln_precondition(this->delegatee_() != 0);
00201 return this->delegatee_()->has(p);
00202 }
00203
00204 # endif // ! MLN_INCLUDE_ONLY
00205
00206 }
00207
00208 }
00209
00210
00211 #endif // ! MLN_CORE_INTERNAL_IMAGE_IDENTITY_HH