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
00027 #ifndef MLN_CORE_IMAGE_VMORPH_CAST_IMAGE_HH
00028 # define MLN_CORE_IMAGE_VMORPH_CAST_IMAGE_HH
00029
00036
00037 # include <mln/core/internal/image_value_morpher.hh>
00038 # include <mln/value/set.hh>
00039 # include <mln/value/cast.hh>
00040
00041
00042 namespace mln
00043 {
00044
00045
00046 template <typename T, typename I> struct cast_image_;
00047
00048
00049 namespace internal
00050 {
00052 template <typename T, typename I>
00053 struct data< cast_image_<T,I> >
00054 {
00055 data(const I& ima);
00056 const I& ima_;
00057 };
00058
00059 }
00060
00061
00062
00063 namespace trait
00064 {
00065
00066 template <typename T, typename I, typename value_io>
00067 struct cast_image_trait_selector :
00068 default_image_morpher< I, T, cast_image_<T,I> >
00069 {
00070 typedef trait::image::vw_io::none vw_io;
00071 typedef trait::image::vw_set::none vw_set;
00072 };
00073
00074 template <typename T, typename I>
00075 struct cast_image_trait_selector<T, I, trait::image::vw_io::read> :
00076 default_image_morpher< I, T, cast_image_<T,I> >
00077 {
00078 typedef trait::image::vw_io::read vw_io;
00079 };
00080
00081 template <typename T, typename I>
00082 struct cast_image_trait_selector<T, I, trait::image::vw_io::read_write> :
00083 default_image_morpher< I, T, cast_image_<T,I> >
00084 {
00085 typedef trait::image::vw_io::read vw_io;
00086 };
00087
00088 template <typename T, typename I>
00089 struct image_< cast_image_<T,I> > :
00090 cast_image_trait_selector<T, I, mln_trait_image_vw_io(I)>
00091 {
00092 private:
00093 typedef mlc_equal(mln_trait_value_quant(T),
00094 trait::value::quant::high) is_high_quant_;
00095 public:
00096 typedef mlc_if(is_high_quant_,
00097 trait::image::quant::high,
00098 trait::image::quant::low) quant;
00099
00100 typedef trait::image::category::value_morpher category;
00101 typedef trait::image::value_io::read_only value_io;
00102 typedef trait::image::pw_io::read pw_io;
00103 typedef trait::image::value_access::indirect value_access;
00104
00106 typedef trait::image::ext_domain::none ext_domain;
00107 };
00108
00109 }
00110
00111
00112
00117 template <typename T, typename I>
00118 struct cast_image_ :
00119 public internal::image_value_morpher< I, T, cast_image_<T,I> >
00120 {
00122 typedef T value;
00123
00125 typedef T rvalue;
00126
00128 typedef T lvalue;
00129
00131 typedef cast_image_< tag::value_<T>, tag::image_<I> > skeleton;
00132
00134 cast_image_(const Image<I>& ima);
00135
00137 void init_(const Image<I>& ima);
00138
00140 T operator()(const mln_psite(I)& p) const;
00141
00143 T operator()(const mln_psite(I)& p);
00144 };
00145
00146
00147 template <typename T, typename I>
00148 cast_image_<T,I>
00149 cast_image(const Image<I>& ima)
00150 {
00151 mln_precondition(exact(ima).is_valid());
00152 cast_image_<T,I> tmp(ima);
00153 return tmp;
00154 }
00155
00156
00157 # ifndef MLN_INCLUDE_ONLY
00158
00159
00160
00161
00162 namespace internal
00163 {
00164
00165 template <typename T, typename I>
00166 inline
00167 data< cast_image_<T,I> >::data(const I& ima)
00168 : ima_(ima)
00169 {
00170 }
00171
00172 }
00173
00174
00175
00176 template <typename T, typename I>
00177 inline
00178 cast_image_<T,I>::cast_image_(const Image<I>& ima)
00179 {
00180 mln_precondition(exact(ima).is_valid());
00181 this->data_ = new internal::data< cast_image_<T,I> >(exact(ima));
00182 }
00183
00184 template <typename T, typename I>
00185 inline
00186 void
00187 cast_image_<T,I>::init_(const Image<I>& ima)
00188 {
00189 mln_precondition(exact(ima).is_valid());
00190 this->data_ = new internal::data<cast_image_<T,I> >(exact(ima));
00191 }
00192
00193 template <typename T, typename I>
00194 inline
00195 T
00196 cast_image_<T,I>::operator()(const mln_psite(I)& p) const
00197 {
00198 mln_precondition(this->data_->ima_.has(p));
00199 return mln::value::cast<T>( this->data_->ima_(p) );
00200 }
00201
00202 template <typename T, typename I>
00203 inline
00204 T
00205 cast_image_<T,I>::operator()(const mln_psite(I)& p)
00206 {
00207 return mln::value::cast<T>( this->data_->ima_(p) );
00208 }
00209
00210 # endif // ! MLN_INCLUDE_ONLY
00211
00212 }
00213
00214
00215 #endif // ! MLN_CORE_IMAGE_VMORPH_CAST_IMAGE_HH