43struct planar_pixel_iterator
47 planar_pixel_iterator<ChannelPtr, ColorSpace>,
48 pixel<typename std::iterator_traits<ChannelPtr>::value_type,layout<ColorSpace>>,
49 std::random_access_iterator_tag,
50 planar_pixel_reference<typename std::iterator_traits<ChannelPtr>::reference, ColorSpace> const
52 detail::homogeneous_color_base
56 mp11::mp_size<ColorSpace>::value
60 using parent_t = iterator_facade
62 planar_pixel_iterator<ChannelPtr, ColorSpace>,
64 std::random_access_iterator_tag,
68 using color_base_parent_t = detail::homogeneous_color_base
72 mp11::mp_size<ColorSpace>::value
75 using channel_t =
typename std::iterator_traits<ChannelPtr>::value_type;
78 using value_type =
typename parent_t::value_type;
79 using reference =
typename parent_t::reference;
80 using difference_type =
typename parent_t::difference_type;
82 planar_pixel_iterator() : color_base_parent_t(0) {}
83 planar_pixel_iterator(
bool) {}
85 planar_pixel_iterator(
const ChannelPtr& v0,
const ChannelPtr& v1) : color_base_parent_t(v0,v1) {}
86 planar_pixel_iterator(
const ChannelPtr& v0,
const ChannelPtr& v1,
const ChannelPtr& v2) : color_base_parent_t(v0,v1,v2) {}
87 planar_pixel_iterator(
const ChannelPtr& v0,
const ChannelPtr& v1,
const ChannelPtr& v2,
const ChannelPtr& v3) : color_base_parent_t(v0,v1,v2,v3) {}
88 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) {}
90 template <
typename IC1,
typename C1>
91 planar_pixel_iterator(
const planar_pixel_iterator<IC1,C1>& ptr) : color_base_parent_t(ptr) {}
98 function_requires<PixelsCompatibleConcept<P,value_type> >();
101 struct address_of {
template <
typename T> T* operator()(T& t) {
return &t; } };
102 template <
typename P>
103 planar_pixel_iterator& operator=(P* pix) {
104 function_requires<PixelsCompatibleConcept<P,value_type> >();
105 static_transform(*pix,*
this, address_of());
116 reference
operator[](difference_type d)
const {
return memunit_advanced_ref(*
this,d*
sizeof(channel_t));}
118 reference operator->()
const {
return **
this; }
121 bool operator< (
const planar_pixel_iterator& ptr)
const {
return gil::at_c<0>(*
this)< gil::at_c<0>(ptr); }
122 bool operator!=(
const planar_pixel_iterator& ptr)
const {
return gil::at_c<0>(*
this)!=gil::at_c<0>(ptr); }
124 friend class boost::iterator_core_access;
126 void increment() { static_transform(*
this,*
this,detail::inc<ChannelPtr>()); }
127 void decrement() { static_transform(*
this,*
this,detail::dec<ChannelPtr>()); }
128 void advance(std::ptrdiff_t d){ static_transform(*
this,*
this,std::bind(detail::plus_asymmetric<ChannelPtr,std::ptrdiff_t>(),std::placeholders::_1,d)); }
129 reference dereference()
const {
return this->
template deref<reference>(); }
131 std::ptrdiff_t distance_to(
const planar_pixel_iterator& it)
const {
return gil::at_c<0>(it)-gil::at_c<0>(*
this); }
132 bool equal(
const planar_pixel_iterator& it)
const {
return gil::at_c<0>(*
this)==gil::at_c<0>(it); }