27 #ifndef MLN_CORE_IMAGE_VMORPH_CAST_IMAGE_HH
28 # define MLN_CORE_IMAGE_VMORPH_CAST_IMAGE_HH
37 # include <mln/core/internal/image_value_morpher.hh>
38 # include <mln/value/set.hh>
39 # include <mln/value/cast.hh>
46 template <
typename T,
typename I>
struct cast_image_;
52 template <
typename T,
typename I>
53 struct data< cast_image_<T,I> >
66 template <
typename T,
typename I,
typename value_io>
67 struct cast_image_trait_selector :
68 default_image_morpher< I, T, cast_image_<T,I> >
70 typedef trait::image::vw_io::none vw_io;
71 typedef trait::image::vw_set::none vw_set;
74 template <
typename T,
typename I>
75 struct cast_image_trait_selector<T, I, trait::image::vw_io::read> :
76 default_image_morpher< I, T, cast_image_<T,I> >
78 typedef trait::image::vw_io::read vw_io;
81 template <
typename T,
typename I>
82 struct cast_image_trait_selector<T, I, trait::image::vw_io::read_write> :
83 default_image_morpher< I, T, cast_image_<T,I> >
85 typedef trait::image::vw_io::read vw_io;
88 template <
typename T,
typename I>
89 struct image_< cast_image_<T,I> > :
90 cast_image_trait_selector<T, I, mln_trait_image_vw_io(I)>
93 typedef mlc_equal(mln_trait_value_quant(T),
94 trait::value::quant::high) is_high_quant_;
96 typedef mlc_if(is_high_quant_,
97 trait::image::quant::high,
98 trait::image::quant::low) quant;
100 typedef trait::image::category::value_morpher category;
101 typedef trait::image::value_io::read_only value_io;
102 typedef trait::image::pw_io::read pw_io;
103 typedef trait::image::value_access::indirect value_access;
106 typedef trait::image::ext_domain::none ext_domain;
117 template <typename T, typename I>
119 public internal::image_value_morpher< I, T, cast_image_<T,I> >
131 typedef cast_image_< tag::value_<T>, tag::image_<I> > skeleton;
134 cast_image_(
const Image<I>& ima);
137 void init_(
const Image<I>& ima);
140 T operator()(
const mln_psite(I)& p)
const;
143 T operator()(
const mln_psite(I)& p);
147 template <
typename T,
typename I>
149 cast_image(
const Image<I>& ima)
151 mln_precondition(exact(ima).is_valid());
152 cast_image_<T,I> tmp(ima);
157 # ifndef MLN_INCLUDE_ONLY
165 template <
typename T,
typename I>
176 template <
typename T,
typename I>
178 cast_image_<T,I>::cast_image_(
const Image<I>& ima)
180 mln_precondition(exact(ima).is_valid());
181 this->data_ =
new internal::data< cast_image_<T,I> >(exact(ima));
184 template <
typename T,
typename I>
187 cast_image_<T,I>::init_(
const Image<I>& ima)
189 mln_precondition(exact(ima).is_valid());
190 this->data_ =
new internal::data<cast_image_<T,I> >(exact(ima));
193 template <
typename T,
typename I>
196 cast_image_<T,I>::operator()(
const mln_psite(I)& p)
const
198 mln_precondition(this->data_->ima_.has(p));
199 return mln::value::cast<T>( this->data_->ima_(p) );
202 template <
typename T,
typename I>
205 cast_image_<T,I>::operator()(
const mln_psite(I)& p)
207 return mln::value::cast<T>( this->data_->ima_(p) );
210 # endif // ! MLN_INCLUDE_ONLY
215 #endif // ! MLN_CORE_IMAGE_VMORPH_CAST_IMAGE_HH