27 #ifndef MLN_OPT_ELEMENT_HH
28 # define MLN_OPT_ELEMENT_HH
34 # include <mln/core/concept/image.hh>
35 # include <mln/trait/images.hh>
45 mln_rvalue(I) element(const Image<I>& ima,
unsigned index);
49 mln_lvalue(I) element(Image<I>& ima,
unsigned index);
53 unsigned nelements(const Image<I>& ima);
56 # ifndef MLN_INCLUDE_ONLY
63 mln_rvalue(I) element_impl(trait::image::category::domain_morpher,
64 const Image<I>& ima,
unsigned index)
67 return element(*exact(ima).delegatee_());
72 mln_rvalue(I) element_impl(trait::image::category::any,
73 const Image<I>& ima,
unsigned index)
75 mlc_and(mlc_is(mln_trait_image_value_storage(I),
76 trait::image::value_storage::one_block),
77 mlc_is(mln_trait_image_value_access(I),
78 trait::image::value_access::direct))::check();
80 return exact(ima).element(index);
86 mln_lvalue(I) element_impl(trait::image::category::domain_morpher,
87 Image<I>& ima,
unsigned index)
90 return element(*exact(ima).delegatee_());
95 mln_lvalue(I) element_impl(trait::image::category::any,
96 Image<I>& ima,
unsigned index)
98 mlc_and(mlc_is(mln_trait_image_value_storage(I),
99 trait::image::value_storage::one_block),
100 mlc_is(mln_trait_image_value_access(I),
101 trait::image::value_access::direct))::check();
103 return exact(ima).element(index);
109 template <
typename I>
111 unsigned nelements_impl(trait::image::category::domain_morpher,
114 return nelements(*exact(ima).delegatee_());
117 template <
typename I>
119 unsigned nelements_impl(trait::image::category::any,
122 mlc_is(mln_trait_image_value_storage(I),
123 trait::image::value_storage::one_block)::check();
125 return exact(ima).nelements();
136 template <
typename I>
138 mln_rvalue(I) element(const Image<I>& ima,
unsigned index)
140 return impl::element_impl(mln_trait_image_category(I)(), ima, index);
143 template <
typename I>
145 mln_lvalue(I) element(Image<I>& ima,
unsigned index)
147 return impl::element_impl(mln_trait_image_category(I)(), ima, index);
151 template <
typename I>
153 unsigned nelements(
const Image<I>& ima)
155 return impl::nelements_impl(mln_trait_image_category(I)(), ima);
158 # endif // ! MLN_INCLUDE_ONLY
165 #endif // ! MLN_OPT_ELEMENT_HH