27 #ifndef MLN_CORE_IMAGE_VMORPH_VIOLENT_CAST_IMAGE_HH
28 # define MLN_CORE_IMAGE_VMORPH_VIOLENT_CAST_IMAGE_HH
35 # include <mln/core/internal/image_value_morpher.hh>
36 # include <mln/value/set.hh>
37 # include <mln/value/cast.hh>
44 template <
typename T,
typename I>
struct violent_cast_image;
49 template <
typename T,
typename I>
50 struct data< violent_cast_image<T,I> >
62 template <
typename T,
typename I,
typename value_io>
63 struct violent_cast_image_trait_selector :
64 default_image_morpher< I, T, violent_cast_image<T,I> >
66 typedef trait::image::vw_io::none vw_io;
67 typedef trait::image::vw_set::none vw_set;
70 template <
typename T,
typename I>
71 struct violent_cast_image_trait_selector<T, I, trait::image::vw_io::read> :
72 default_image_morpher< I, T, violent_cast_image<T,I> >
74 typedef trait::image::vw_io::read vw_io;
77 template <
typename T,
typename I>
78 struct violent_cast_image_trait_selector<T, I, trait::image::vw_io::read_write> :
79 default_image_morpher< I, T, violent_cast_image<T,I> >
81 typedef trait::image::vw_io::read vw_io;
84 template <
typename T,
typename I>
85 struct image_< violent_cast_image<T,I> > :
86 violent_cast_image_trait_selector<T, I, mln_trait_image_vw_io(I)>
89 typedef mlc_equal(mln_trait_value_quant(T),
90 trait::value::quant::high) is_high_quant_;
92 typedef mlc_if(is_high_quant_,
93 trait::image::quant::high,
94 trait::image::quant::low) quant;
96 typedef trait::image::value_io::read_only value_io;
97 typedef trait::image::pw_io::read pw_io;
98 typedef trait::image::value_access::indirect value_access;
99 typedef trait::image::category::value_morpher category;
102 typedef trait::image::ext_domain::none ext_domain;
112 template <typename T, typename I>
135 T operator()(
const mln_psite(I)& p)
const;
138 T operator()(
const mln_psite(I)& p);
142 template <
typename T,
typename I>
144 violent_cast_image_(
const Image<I>& ima)
146 mln_precondition(exact(ima).is_valid());
152 # ifndef MLN_INCLUDE_ONLY
160 template <
typename T,
typename I>
171 template <
typename T,
typename I>
175 metal::bool_<sizeof(T) == sizeof(typename I::value)>::check();
176 mln_precondition(exact(ima).is_valid());
177 this->data_ =
new internal::data< violent_cast_image<T,I> >(exact(ima));
180 template <
typename T,
typename I>
185 mln_precondition(exact(ima).is_valid());
186 this->data_ =
new internal::data<violent_cast_image<T,I> >(exact(ima));
189 template <
typename T,
typename I>
194 mln_precondition(this->data_->ima_.has(p));
195 return *(T*)(
void*)&( this->data_->ima_(p) );
198 template <
typename T,
typename I>
203 return *(T*)(
void*)&( this->data_->ima_(p) );
206 # endif // ! MLN_INCLUDE_ONLY
211 #endif // ! MLN_CORE_IMAGE_VMORPH_VIOLENT_CAST_IMAGE_HH