8#ifndef BOOST_GIL_PLANAR_PIXEL_ITERATOR_HPP
9#define BOOST_GIL_PLANAR_PIXEL_ITERATOR_HPP
11#include <boost/gil/pixel.hpp>
12#include <boost/gil/step_iterator.hpp>
13#include <boost/gil/detail/mp11.hpp>
15#include <boost/stl_interfaces/iterator_interface.hpp>
20namespace boost {
namespace gil {
23template <
typename ChannelReference,
typename ColorSpace>
24struct planar_pixel_reference;
42template <
typename ChannelPtr,
typename ColorSpace>
45 stl_interfaces::iterator_interface<
46#if !BOOST_STL_INTERFACES_USE_DEDUCED_THIS
47 planar_pixel_iterator<ChannelPtr, ColorSpace>,
49 std::random_access_iterator_tag,
50 pixel<typename std::iterator_traits<ChannelPtr>::value_type,layout<ColorSpace>>,
51 planar_pixel_reference<typename std::iterator_traits<ChannelPtr>::reference, ColorSpace> const
53 detail::homogeneous_color_base
57 mp11::mp_size<ColorSpace>::value
61 using parent_t = stl_interfaces::iterator_interface<
62#if !BOOST_STL_INTERFACES_USE_DEDUCED_THIS
65 std::random_access_iterator_tag,
70 using color_base_parent_t = detail::homogeneous_color_base
74 mp11::mp_size<ColorSpace>::value
77 using channel_t =
typename std::iterator_traits<ChannelPtr>::value_type;
80 using value_type =
typename parent_t::value_type;
81 using reference =
typename parent_t::reference;
82 using difference_type =
typename parent_t::difference_type;
83 using iterator_category =
typename parent_t::iterator_concept;
89 planar_pixel_iterator(
const ChannelPtr& v0,
const ChannelPtr& v1,
const ChannelPtr& v2) : color_base_parent_t(v0,v1,v2) {}
90 planar_pixel_iterator(
const ChannelPtr& v0,
const ChannelPtr& v1,
const ChannelPtr& v2,
const ChannelPtr& v3) : color_base_parent_t(v0,v1,v2,v3) {}
91 planar_pixel_iterator(
const ChannelPtr& v0,
const ChannelPtr& v1,
const ChannelPtr& v2,
const ChannelPtr& v3,
const ChannelPtr& v4) : color_base_parent_t(v0,v1,v2,v3,v4) {}
93 template <
typename IC1,
typename C1>
101 function_requires<PixelsCompatibleConcept<P,value_type> >();
104 struct address_of {
template <
typename T> T* operator()(T& t) {
return &t; } };
105 template <
typename P>
106 planar_pixel_iterator& operator=(P* pix) {
107 function_requires<PixelsCompatibleConcept<P,value_type> >();
108 static_transform(*pix,*
this, address_of());
117 constexpr auto operator*() const noexcept -> reference {
return dereference(); }
119 constexpr auto operator+=(difference_type d) -> planar_pixel_iterator& { advance(d);
return *
this; }
121 constexpr auto operator++() noexcept -> planar_pixel_iterator& { increment();
return *
this; }
122 constexpr auto operator--() noexcept -> planar_pixel_iterator& { decrement();
return *
this; }
124 constexpr auto operator++(
int)
noexcept -> planar_pixel_iterator {
auto tmp = *
this; increment();
return tmp; }
125 constexpr auto operator--(
int)
noexcept -> planar_pixel_iterator {
auto tmp = *
this; decrement();
return tmp; }
127 constexpr auto operator-(
const planar_pixel_iterator& other)
const noexcept {
return -distance_to(other); }
129 constexpr bool operator==(
const planar_pixel_iterator& other)
const noexcept {
return equal(other); }
132 friend struct boost::stl_interfaces::access;
134 void increment() { static_transform(*
this,*
this,detail::inc<ChannelPtr>()); }
135 void decrement() { static_transform(*
this,*
this,detail::dec<ChannelPtr>()); }
136 void advance(std::ptrdiff_t d){ static_transform(*
this,*
this,std::bind(detail::plus_asymmetric<ChannelPtr,std::ptrdiff_t>(),std::placeholders::_1,d)); }
137 reference dereference()
const {
return this->
template deref<reference>(); }
139 std::ptrdiff_t distance_to(
const planar_pixel_iterator& it)
const {
return gil::at_c<0>(it)-gil::at_c<0>(*
this); }
140 bool equal(
const planar_pixel_iterator& it)
const {
return gil::at_c<0>(*
this)==gil::at_c<0>(it); }
145struct channel_iterator_is_mutable : std::true_type {};
148struct channel_iterator_is_mutable<I const*> : std::false_type {};
152template <
typename IC,
typename C>
153struct const_iterator_type<planar_pixel_iterator<IC,C> > {
155 using channel_t =
typename std::iterator_traits<IC>::value_type;
157 using type = planar_pixel_iterator<typename channel_traits<channel_t>::const_pointer,C>;
161template <
typename IC,
typename C>
162struct iterator_is_mutable<planar_pixel_iterator<IC,C> > :
public detail::channel_iterator_is_mutable<IC> {};
168template <
typename IC,
typename C,
int K>
169struct kth_element_type<planar_pixel_iterator<IC, C>, K>
174template <
typename IC,
typename C,
int K>
175struct kth_element_reference_type<planar_pixel_iterator<IC, C>, K>
176 : std::add_lvalue_reference<IC> {};
178template <
typename IC,
typename C,
int K>
179struct kth_element_const_reference_type<planar_pixel_iterator<IC, C>, K>
180 : std::add_lvalue_reference<typename std::add_const<IC>::type>
187template <
typename IC,
typename C>
188struct color_space_type<planar_pixel_iterator<IC,C>>
193template <
typename IC,
typename C>
194struct channel_mapping_type<planar_pixel_iterator<IC, C>>
195 : channel_mapping_type<typename planar_pixel_iterator<IC,C>::value_type>
198template <
typename IC,
typename C>
199struct is_planar<planar_pixel_iterator<IC, C>> : std::true_type {};
201template <
typename IC,
typename C>
202struct channel_type<planar_pixel_iterator<IC, C>>
204 using type =
typename std::iterator_traits<IC>::value_type;
211template <
typename IC,
typename C>
212inline auto memunit_step(planar_pixel_iterator<IC,C>
const&)
215 return sizeof(
typename std::iterator_traits<IC>::value_type);
218template <
typename IC,
typename C>
219inline auto memunit_distance(planar_pixel_iterator<IC,C>
const& p1, planar_pixel_iterator<IC,C>
const& p2)
222 return memunit_distance(gil::at_c<0>(p1),gil::at_c<0>(p2));
225template <
typename IC>
226struct memunit_advance_fn {
227 memunit_advance_fn(std::ptrdiff_t diff) : _diff(diff) {}
228 IC operator()(
const IC& p)
const {
return memunit_advanced(p,_diff); }
230 std::ptrdiff_t _diff;
233template <
typename IC,
typename C>
234inline void memunit_advance(planar_pixel_iterator<IC,C>& p, std::ptrdiff_t diff) {
235 static_transform(p, p, memunit_advance_fn<IC>(diff));
238template <
typename IC,
typename C>
239inline auto memunit_advanced(planar_pixel_iterator<IC,C>
const& p, std::ptrdiff_t diff)
240 -> planar_pixel_iterator<IC,C>
242 planar_pixel_iterator<IC,C> ret=p;
243 memunit_advance(ret, diff);
247template <
typename ChannelPtr,
typename ColorSpace>
248inline auto memunit_advanced_ref(planar_pixel_iterator<ChannelPtr,ColorSpace>
const& ptr, std::ptrdiff_t diff)
249 -> planar_pixel_reference<typename std::iterator_traits<ChannelPtr>::reference,ColorSpace>
251 return planar_pixel_reference<typename std::iterator_traits<ChannelPtr>::reference,ColorSpace>(ptr, diff);
258template <
typename IC,
typename C>
259struct dynamic_x_step_type<planar_pixel_iterator<IC,C> > {
260 using type = memory_based_step_iterator<planar_pixel_iterator<IC,C>>;
defined(BOOST_NO_CXX17_HDR_MEMORY_RESOURCE)
Definition algorithm.hpp:36
Represents a color space and ordering of channels in memory.
Definition utilities.hpp:265
Represents a pixel value (a container of channels). Models: HomogeneousColorBaseValueConcept,...
Definition pixel.hpp:106
An iterator over planar pixels. Models HomogeneousColorBaseConcept, PixelIteratorConcept,...
Definition planar_pixel_iterator.hpp:59
planar_pixel_iterator(P *pix)
Definition planar_pixel_iterator.hpp:100
A reference proxy to a planar pixel.
Definition planar_pixel_reference.hpp:46