8#ifndef BOOST_GIL_CONCEPTS_COLOR_BASE_HPP
9#define BOOST_GIL_CONCEPTS_COLOR_BASE_HPP
11#include <boost/gil/concepts/basic.hpp>
12#include <boost/gil/concepts/color.hpp>
13#include <boost/gil/concepts/concept_check.hpp>
14#include <boost/gil/concepts/fwd.hpp>
16#include <boost/core/ignore_unused.hpp>
19#if defined(BOOST_CLANG)
20#pragma clang diagnostic push
21#pragma clang diagnostic ignored "-Wunknown-pragmas"
22#pragma clang diagnostic ignored "-Wunused-local-typedefs"
25#if defined(BOOST_GCC) && (BOOST_GCC >= 40900)
26#pragma GCC diagnostic push
27#pragma GCC diagnostic ignored "-Wunused-local-typedefs"
30namespace boost {
namespace gil {
35template <
typename Element,
typename Layout,
int K>
36struct homogeneous_color_base;
40template <
int K,
typename E,
typename L,
int N>
41auto at_c(detail::homogeneous_color_base<E, L, N>& p)
42 ->
typename std::add_lvalue_reference<E>::type;
44template <
int K,
typename E,
typename L,
int N>
45auto at_c(detail::homogeneous_color_base<E, L, N>
const& p)
46 ->
typename std::add_lvalue_reference<typename std::add_const<E>::type>::type;
48template <
typename P,
typename C,
typename L>
51template <
int K,
typename P,
typename C,
typename L>
52auto at_c(packed_pixel<P, C, L>& p)
53 ->
typename kth_element_reference_type<packed_pixel<P, C, L>, K>::type;
55template <
int K,
typename P,
typename C,
typename L>
56auto at_c(packed_pixel<P, C, L>
const& p)
57 ->
typename kth_element_const_reference_type<packed_pixel<P, C, L>, K>::type;
59template <
typename B,
typename C,
typename L,
bool M>
60struct bit_aligned_pixel_reference;
62template <
int K,
typename B,
typename C,
typename L,
bool M>
63inline auto at_c(bit_aligned_pixel_reference<B, C, L, M>
const& p)
64 ->
typename kth_element_reference_type
66 bit_aligned_pixel_reference<B, C, L, M>,
71template <
int K,
typename ColorBase>
73 ->
typename std::enable_if
75 !std::is_const<ColorBase>::value,
76 typename kth_semantic_element_reference_type<ColorBase, K>::type
79template <
int K,
typename ColorBase>
81 ->
typename kth_semantic_element_const_reference_type<ColorBase, K>::type;
136template <
typename ColorBase>
141 gil_function_requires<CopyConstructible<ColorBase>>();
142 gil_function_requires<EqualityComparable<ColorBase>>();
144 using color_space_t =
typename ColorBase::layout_t::color_space_t;
145 gil_function_requires<ColorSpaceConcept<color_space_t>>();
147 using channel_mapping_t =
typename ColorBase::layout_t::channel_mapping_t;
152 using TN =
typename kth_element_type<ColorBase, num_elements - 1>::type;
153 using RN =
typename kth_element_const_reference_type<ColorBase, num_elements - 1>::type;
155 RN r = gil::at_c<num_elements - 1>(cb);
156 boost::ignore_unused(r);
159 semantic_at_c<0>(cb);
182template <
typename ColorBase>
187 gil_function_requires<ColorBaseConcept<ColorBase>>();
188 gil_function_requires<Assignable<ColorBase>>();
189 gil_function_requires<Swappable<ColorBase>>();
191 using R0 =
typename kth_element_reference_type<ColorBase, 0>::type;
193 R0 r = gil::at_c<0>(cb);
194 gil::at_c<0>(cb) = r;
206template <
typename ColorBase>
211 gil_function_requires<MutableColorBaseConcept<ColorBase>>();
212 gil_function_requires<Regular<ColorBase>>();
226template <
typename ColorBase>
231 gil_function_requires<ColorBaseConcept<ColorBase>>();
235 using T0 =
typename kth_element_type<ColorBase, 0>::type;
236 using TN =
typename kth_element_type<ColorBase, num_elements - 1>::type;
238 static_assert(std::is_same<T0, TN>::value,
"");
240 using R0 =
typename kth_element_const_reference_type<ColorBase, 0>::type;
241 R0 r = dynamic_at_c(cb, 0);
242 boost::ignore_unused(r);
256template <
typename ColorBase>
261 gil_function_requires<ColorBaseConcept<ColorBase>>();
262 gil_function_requires<HomogeneousColorBaseConcept<ColorBase>>();
263 using R0 =
typename kth_element_reference_type<ColorBase, 0>::type;
264 R0 r = dynamic_at_c(cb, 0);
265 boost::ignore_unused(r);
266 dynamic_at_c(cb, 0) = dynamic_at_c(cb, 0);
281template <
typename ColorBase>
286 gil_function_requires<MutableHomogeneousColorBaseConcept<ColorBase>>();
287 gil_function_requires<Regular<ColorBase>>();
302template <
typename ColorBase1,
typename ColorBase2>
307 static_assert(std::is_same
309 typename ColorBase1::layout_t::color_space_t,
310 typename ColorBase2::layout_t::color_space_t
321#if defined(BOOST_CLANG)
322#pragma clang diagnostic pop
325#if defined(BOOST_GCC) && (BOOST_GCC >= 40900)
326#pragma GCC diagnostic pop
auto semantic_at_c(ColorBase &p) -> typename std::enable_if< !std::is_const< ColorBase >::value, typename kth_semantic_element_reference_type< ColorBase, K >::type >::type
A mutable accessor to the K-th semantic element of a color base.
Definition: color_base_algorithm.hpp:119
defined(BOOST_NO_CXX17_HDR_MEMORY_RESOURCE)
Definition: algorithm.hpp:36
A color base is a container of color elements (such as channels, channel references or channel pointe...
Definition: concepts/color_base.hpp:138
Color base that also has a default-constructor. Refines Regular.
Definition: concepts/color_base.hpp:208
Two color bases are compatible if they have the same color space and their elements are compatible,...
Definition: concepts/color_base.hpp:304
Color base whose elements all have the same type.
Definition: concepts/color_base.hpp:228
Homogeneous color base that also has a default constructor. Refines Regular.
Definition: concepts/color_base.hpp:283
Color base which allows for modifying its elements.
Definition: concepts/color_base.hpp:184
Homogeneous color base that allows for modifying its elements.
Definition: concepts/color_base.hpp:258
Returns an integral constant type specifying the number of elements in a color base.
Definition: color_base_algorithm.hpp:42