13 #ifndef GIL_COLOR_BASE_HPP
14 #define GIL_COLOR_BASE_HPP
27 #include <boost/config.hpp>
28 #include <boost/mpl/range_c.hpp>
29 #include <boost/mpl/size.hpp>
30 #include <boost/mpl/vector_c.hpp>
31 #include <boost/type_traits.hpp>
32 #include <boost/utility/enable_if.hpp>
38 namespace boost {
namespace gil {
41 template <
typename P> P* memunit_advanced(
const P* p, std::ptrdiff_t diff);
44 template <
int K,
typename ColorBase>
45 typename disable_if<is_const<ColorBase>,
typename kth_semantic_element_reference_type<ColorBase,K>::type>::type
semantic_at_c(ColorBase& p);
46 template <
int K,
typename ColorBase>
47 typename kth_semantic_element_const_reference_type<ColorBase,K>::type
semantic_at_c(
const ColorBase& p);
52 template <
typename ColorBase,
int K>
struct kth_element_type;
53 template <
typename ColorBase,
int K>
struct kth_element_type<const ColorBase,K> :
public kth_element_type<ColorBase,K> {};
54 template <
typename ColorBase,
int K>
struct kth_element_reference_type;
55 template <
typename ColorBase,
int K>
struct kth_element_reference_type<const ColorBase,K> :
public kth_element_reference_type<ColorBase,K> {};
56 template <
typename ColorBase,
int K>
struct kth_element_const_reference_type;
57 template <
typename ColorBase,
int K>
struct kth_element_const_reference_type<const ColorBase,K> :
public kth_element_const_reference_type<ColorBase,K> {};
61 template <
typename DstLayout,
typename SrcLayout,
int K>
62 struct mapping_transform
63 :
public mpl::at<typename SrcLayout::channel_mapping_t,
64 typename detail::type_to_index<typename DstLayout::channel_mapping_t,mpl::integral_c<int,K> >::type
72 #if BOOST_WORKAROUND(BOOST_MSVC, >= 1400)
74 #pragma warning(disable:4512) //assignment operator could not be generated
79 template <
typename Element,
typename Layout>
80 struct homogeneous_color_base<Element,Layout,1> {
84 typedef Layout layout_t;
88 homogeneous_color_base() {}
89 homogeneous_color_base(Element v) : _v0(v) {}
92 operator Element ()
const {
return _v0; }
94 template <
typename E2,
typename L2> homogeneous_color_base(
const homogeneous_color_base<E2,L2,1>& c) : _v0(gil::at_c<0>(c)) {}
100 template <
typename Element,
typename Layout>
101 struct homogeneous_color_base<Element,Layout,2> {
105 typedef Layout layout_t;
111 homogeneous_color_base() {}
112 explicit homogeneous_color_base(Element v) : _v0(v), _v1(v) {}
113 homogeneous_color_base(Element v0, Element v1) : _v0(v0), _v1(v1) {}
115 template <
typename E2,
typename L2> homogeneous_color_base(
const homogeneous_color_base<E2,L2,2>& c) :
116 _v0(
gil::at_c<mapping_transform<Layout,L2,0>::value>(c)),
117 _v1(
gil::at_c<mapping_transform<Layout,L2,1>::value>(c)) {}
120 template <
typename E2,
typename L2> homogeneous_color_base( homogeneous_color_base<E2,L2,2>& c) :
121 _v0(
gil::at_c<mapping_transform<Layout,L2,0>::value>(c)),
122 _v1(
gil::at_c<mapping_transform<Layout,L2,1>::value>(c)) {}
125 template <
typename P> homogeneous_color_base(P* p,
bool) :
126 _v0(&semantic_at_c<0>(*p)),
127 _v1(&semantic_at_c<1>(*p)) {}
128 template <
typename Ref> Ref deref()
const {
129 return Ref(*semantic_at_c<0>(*
this),
130 *semantic_at_c<1>(*
this)); }
133 template <
typename Ptr> homogeneous_color_base(
const Ptr& ptr, std::ptrdiff_t diff)
134 : _v0(*memunit_advanced(semantic_at_c<0>(ptr),diff)),
135 _v1(*memunit_advanced(semantic_at_c<1>(ptr),diff)) {}
138 Element at_c_dynamic(std::size_t i)
const {
139 if (i==0)
return _v0;
146 template <
typename Element,
typename Layout>
147 struct homogeneous_color_base<Element,Layout,3> {
149 Element _v0, _v1, _v2;
151 typedef Layout layout_t;
159 homogeneous_color_base() {}
160 explicit homogeneous_color_base(Element v) : _v0(v), _v1(v), _v2(v) {}
161 homogeneous_color_base(Element v0, Element v1, Element v2) : _v0(v0), _v1(v1), _v2(v2) {}
163 template <
typename E2,
typename L2> homogeneous_color_base(
const homogeneous_color_base<E2,L2,3>& c) :
164 _v0(
gil::at_c<mapping_transform<Layout,L2,0>::value>(c)),
165 _v1(
gil::at_c<mapping_transform<Layout,L2,1>::value>(c)),
166 _v2(
gil::at_c<mapping_transform<Layout,L2,2>::value>(c)) {}
169 template <
typename E2,
typename L2> homogeneous_color_base( homogeneous_color_base<E2,L2,3>& c) :
170 _v0(
gil::at_c<mapping_transform<Layout,L2,0>::value>(c)),
171 _v1(
gil::at_c<mapping_transform<Layout,L2,1>::value>(c)),
172 _v2(
gil::at_c<mapping_transform<Layout,L2,2>::value>(c)) {}
175 template <
typename P> homogeneous_color_base(P* p,
bool) :
176 _v0(&semantic_at_c<0>(*p)),
177 _v1(&semantic_at_c<1>(*p)),
178 _v2(&semantic_at_c<2>(*p)) {}
179 template <
typename Ref> Ref deref()
const {
180 return Ref(*semantic_at_c<0>(*
this),
181 *semantic_at_c<1>(*
this),
182 *semantic_at_c<2>(*
this)); }
185 template <
typename Ptr> homogeneous_color_base(
const Ptr& ptr, std::ptrdiff_t diff)
186 : _v0(*memunit_advanced(semantic_at_c<0>(ptr),diff)),
187 _v1(*memunit_advanced(semantic_at_c<1>(ptr),diff)),
188 _v2(*memunit_advanced(semantic_at_c<2>(ptr),diff)) {}
191 Element at_c_dynamic(std::size_t i)
const {
202 template <
typename Element,
typename Layout>
203 struct homogeneous_color_base<Element,Layout,4> {
205 Element _v0, _v1, _v2, _v3;
207 typedef Layout layout_t;
216 homogeneous_color_base() {}
217 explicit homogeneous_color_base(Element v) : _v0(v), _v1(v), _v2(v), _v3(v) {}
218 homogeneous_color_base(Element v0, Element v1, Element v2, Element v3) : _v0(v0), _v1(v1), _v2(v2), _v3(v3) {}
220 template <
typename E2,
typename L2> homogeneous_color_base(
const homogeneous_color_base<E2,L2,4>& c) :
221 _v0(
gil::at_c<mapping_transform<Layout,L2,0>::value>(c)),
222 _v1(
gil::at_c<mapping_transform<Layout,L2,1>::value>(c)),
223 _v2(
gil::at_c<mapping_transform<Layout,L2,2>::value>(c)),
224 _v3(
gil::at_c<mapping_transform<Layout,L2,3>::value>(c)) {}
227 template <
typename E2,
typename L2> homogeneous_color_base( homogeneous_color_base<E2,L2,4>& c) :
228 _v0(
gil::at_c<mapping_transform<Layout,L2,0>::value>(c)),
229 _v1(
gil::at_c<mapping_transform<Layout,L2,1>::value>(c)),
230 _v2(
gil::at_c<mapping_transform<Layout,L2,2>::value>(c)),
231 _v3(
gil::at_c<mapping_transform<Layout,L2,3>::value>(c)) {}
234 template <
typename P> homogeneous_color_base(P* p,
bool) :
235 _v0(&semantic_at_c<0>(*p)),
236 _v1(&semantic_at_c<1>(*p)),
237 _v2(&semantic_at_c<2>(*p)),
238 _v3(&semantic_at_c<3>(*p)) {}
240 template <
typename Ref> Ref deref()
const {
241 return Ref(*semantic_at_c<0>(*
this),
242 *semantic_at_c<1>(*
this),
243 *semantic_at_c<2>(*
this),
244 *semantic_at_c<3>(*
this)); }
247 template <
typename Ptr> homogeneous_color_base(
const Ptr& ptr, std::ptrdiff_t diff)
248 : _v0(*memunit_advanced(semantic_at_c<0>(ptr),diff)),
249 _v1(*memunit_advanced(semantic_at_c<1>(ptr),diff)),
250 _v2(*memunit_advanced(semantic_at_c<2>(ptr),diff)),
251 _v3(*memunit_advanced(semantic_at_c<3>(ptr),diff)) {}
254 Element at_c_dynamic(std::size_t i)
const {
266 template <
typename Element,
typename Layout>
267 struct homogeneous_color_base<Element,Layout,5> {
269 Element _v0, _v1, _v2, _v3, _v4;
271 typedef Layout layout_t;
282 homogeneous_color_base() {}
283 explicit homogeneous_color_base(Element v) : _v0(v), _v1(v), _v2(v), _v3(v), _v4(v) {}
284 homogeneous_color_base(Element v0, Element v1, Element v2, Element v3, Element v4) : _v0(v0), _v1(v1), _v2(v2), _v3(v3), _v4(v4) {}
286 template <
typename E2,
typename L2> homogeneous_color_base(
const homogeneous_color_base<E2,L2,5>& c) :
287 _v0(
gil::at_c<mapping_transform<Layout,L2,0>::value>(c)),
288 _v1(
gil::at_c<mapping_transform<Layout,L2,1>::value>(c)),
289 _v2(
gil::at_c<mapping_transform<Layout,L2,2>::value>(c)),
290 _v3(
gil::at_c<mapping_transform<Layout,L2,3>::value>(c)),
291 _v4(
gil::at_c<mapping_transform<Layout,L2,4>::value>(c)) {}
294 template <
typename E2,
typename L2> homogeneous_color_base( homogeneous_color_base<E2,L2,5>& c) :
295 _v0(
gil::at_c<mapping_transform<Layout,L2,0>::value>(c)),
296 _v1(
gil::at_c<mapping_transform<Layout,L2,1>::value>(c)),
297 _v2(
gil::at_c<mapping_transform<Layout,L2,2>::value>(c)),
298 _v3(
gil::at_c<mapping_transform<Layout,L2,3>::value>(c)),
299 _v4(
gil::at_c<mapping_transform<Layout,L2,4>::value>(c)) {}
302 template <
typename P> homogeneous_color_base(P* p,
bool) :
303 _v0(&semantic_at_c<0>(*p)),
304 _v1(&semantic_at_c<1>(*p)),
305 _v2(&semantic_at_c<2>(*p)),
306 _v3(&semantic_at_c<3>(*p)),
307 _v4(&semantic_at_c<4>(*p)) {}
309 template <
typename Ref> Ref deref()
const {
310 return Ref(*semantic_at_c<0>(*
this),
311 *semantic_at_c<1>(*
this),
312 *semantic_at_c<2>(*
this),
313 *semantic_at_c<3>(*
this),
314 *semantic_at_c<4>(*
this)); }
317 template <
typename Ptr> homogeneous_color_base(
const Ptr& ptr, std::ptrdiff_t diff)
318 : _v0(*memunit_advanced(semantic_at_c<0>(ptr),diff)),
319 _v1(*memunit_advanced(semantic_at_c<1>(ptr),diff)),
320 _v2(*memunit_advanced(semantic_at_c<2>(ptr),diff)),
321 _v3(*memunit_advanced(semantic_at_c<3>(ptr),diff)),
322 _v4(*memunit_advanced(semantic_at_c<4>(ptr),diff)) {}
325 Element at_c_dynamic(std::size_t i)
const {
336 #if BOOST_WORKAROUND(BOOST_MSVC, >= 1400)
350 template <
typename Element,
typename Layout,
int K>
352 dynamic_at_c(homogeneous_color_base<Element,Layout,K>& cb, std::size_t i) {
354 return (gil_reinterpret_cast<Element*>(&cb))[i];
357 template <
typename Element,
typename Layout,
int K>
359 dynamic_at_c(
const homogeneous_color_base<Element,Layout,K>& cb, std::size_t i) {
361 return (gil_reinterpret_cast_c<const Element*>(&cb))[i];
364 template <
typename Element,
typename Layout,
int K>
365 typename element_reference_type<homogeneous_color_base<Element&,Layout,K> >::type
366 dynamic_at_c(
const homogeneous_color_base<Element&,Layout,K>& cb, std::size_t i) {
368 return cb.at_c_dynamic(i);
371 template <
typename Element,
typename Layout,
int K>
372 typename element_const_reference_type<homogeneous_color_base<const Element&,Layout,K> >::type
373 dynamic_at_c(
const homogeneous_color_base<const Element&,Layout,K>& cb, std::size_t i) {
375 return cb.at_c_dynamic(i);
381 template <
typename Element,
typename Layout,
int K1,
int K>
382 struct kth_element_type<detail::homogeneous_color_base<Element,Layout,K1>, K> {
383 typedef Element type;
386 template <
typename Element,
typename Layout,
int K1,
int K>
387 struct kth_element_reference_type<detail::homogeneous_color_base<Element,Layout,K1>, K> :
public add_reference<Element> {};
389 template <
typename Element,
typename Layout,
int K1,
int K>
390 struct kth_element_const_reference_type<detail::homogeneous_color_base<Element,Layout,K1>, K> :
public add_reference<typename add_const<Element>::type> {};
394 template <
int K,
typename E,
typename L,
int N>
inline
395 typename add_reference<E>::type
396 at_c( detail::homogeneous_color_base<E,L,N>& p) {
return p.at(mpl::int_<K>()); }
400 template <
int K,
typename E,
typename L,
int N>
inline
401 typename add_reference<typename add_const<E>::type>::type
402 at_c(
const detail::homogeneous_color_base<E,L,N>& p) {
return p.at(mpl::int_<K>()); }
406 template <
typename T>
void operator()(T& x, T& y)
const {
412 template <
typename E,
typename L,
int N>
inline
413 void swap(detail::homogeneous_color_base<E,L,N>& x, detail::homogeneous_color_base<E,L,N>& y) {
414 static_for_each(x,y,detail::swap_fn());
kth_semantic_element_const_reference_type< ColorBase, K >::type semantic_at_c(const ColorBase &p)
A constant accessor to the K-th semantic element of a color base.
Definition: color_base_algorithm.hpp:130
Concept check classes for GIL concepts.
Specifies the return type of the constant element accessor at_c of a homogeneous color base...
Definition: color_base.hpp:51
add_reference< typename add_const< E >::type >::type at_c(const detail::homogeneous_color_base< E, L, N > &p)
Provides constant access to the K-th element, in physical order.
Definition: color_base.hpp:402
Specifies the return type of the mutable element accessor at_c of a homogeneous color base...
Definition: color_base.hpp:50
Various utilities not specific to the image library. Some are non-standard STL extensions or generic ...