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> 14 #include <boost/iterator/iterator_facade.hpp> 18 namespace boost {
namespace gil {
20 template <
typename ChannelReference,
typename ColorSpace>
21 struct planar_pixel_reference;
39 template <
typename ChannelPtr,
typename ColorSpace>
40 struct planar_pixel_iterator :
public iterator_facade<planar_pixel_iterator<ChannelPtr,ColorSpace>,
41 pixel<typename std::iterator_traits<ChannelPtr>::value_type,layout<ColorSpace> >,
42 std::random_access_iterator_tag,
43 const planar_pixel_reference<typename std::iterator_traits<ChannelPtr>::reference,ColorSpace> >,
44 public detail::homogeneous_color_base<ChannelPtr,layout<ColorSpace>,mpl::size<ColorSpace>::value > {
46 using parent_t = iterator_facade<planar_pixel_iterator<ChannelPtr,ColorSpace>,
47 pixel<typename std::iterator_traits<ChannelPtr>::value_type,layout<ColorSpace>>,
48 std::random_access_iterator_tag,
49 const planar_pixel_reference<typename std::iterator_traits<ChannelPtr>::reference,ColorSpace>>;
50 using color_base_parent_t = detail::homogeneous_color_base<ChannelPtr,layout<ColorSpace>,mpl::size<ColorSpace>::value>;
51 using channel_t =
typename std::iterator_traits<ChannelPtr>::value_type;
53 using value_type =
typename parent_t::value_type;
54 using reference =
typename parent_t::reference;
55 using difference_type =
typename parent_t::difference_type;
57 planar_pixel_iterator() : color_base_parent_t(0) {}
58 planar_pixel_iterator(
bool) {}
60 planar_pixel_iterator(
const ChannelPtr& v0,
const ChannelPtr& v1) : color_base_parent_t(v0,v1) {}
61 planar_pixel_iterator(
const ChannelPtr& v0,
const ChannelPtr& v1,
const ChannelPtr& v2) : color_base_parent_t(v0,v1,v2) {}
62 planar_pixel_iterator(
const ChannelPtr& v0,
const ChannelPtr& v1,
const ChannelPtr& v2,
const ChannelPtr& v3) : color_base_parent_t(v0,v1,v2,v3) {}
63 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) {}
65 template <
typename IC1,
typename C1>
66 planar_pixel_iterator(
const planar_pixel_iterator<IC1,C1>& ptr) : color_base_parent_t(ptr) {}
73 function_requires<PixelsCompatibleConcept<P,value_type> >();
76 struct address_of {
template <
typename T> T* operator()(T& t) {
return &t; } };
79 function_requires<PixelsCompatibleConcept<P,value_type> >();
80 static_transform(*pix,*
this, address_of());
91 reference
operator[](difference_type d)
const {
return memunit_advanced_ref(*
this,d*
sizeof(channel_t));}
93 reference operator->()
const {
return **
this; }
96 bool operator< (
const planar_pixel_iterator& ptr)
const {
return gil::at_c<0>(*this)< gil::at_c<0>(ptr); }
97 bool operator!=(
const planar_pixel_iterator& ptr)
const {
return gil::at_c<0>(*this)!=gil::at_c<0>(ptr); }
99 friend class boost::iterator_core_access;
104 reference dereference()
const {
return this->
template deref<reference>(); }
106 std::ptrdiff_t distance_to(
const planar_pixel_iterator& it)
const {
return gil::at_c<0>(it)-gil::at_c<0>(*
this); }
111 template <
typename IC>
struct channel_iterator_is_mutable :
public mpl::true_ {};
112 template <
typename T>
struct channel_iterator_is_mutable<const T*> :
public mpl::false_ {};
115 template <
typename IC,
typename C>
118 using channel_t =
typename std::iterator_traits<IC>::value_type;
124 template <
typename IC,
typename C>
125 struct iterator_is_mutable<planar_pixel_iterator<IC,C> > :
public detail::channel_iterator_is_mutable<IC> {};
131 template <
typename IC,
typename C,
int K>
132 struct kth_element_type<planar_pixel_iterator<IC,C>, K> {
136 template <
typename IC,
typename C,
int K>
137 struct kth_element_reference_type<planar_pixel_iterator<IC,C>, K> :
public add_reference<IC> {};
139 template <
typename IC,
typename C,
int K>
140 struct kth_element_const_reference_type<planar_pixel_iterator<IC,C>, K> :
public add_reference<typename add_const<IC>::type> {};
146 template <
typename IC,
typename C>
147 struct color_space_type<planar_pixel_iterator<IC,C> > {
151 template <
typename IC,
typename C>
152 struct channel_mapping_type<planar_pixel_iterator<IC,C> > :
public channel_mapping_type<typename planar_pixel_iterator<IC,C>::value_type> {};
154 template <
typename IC,
typename C>
155 struct is_planar<planar_pixel_iterator<IC,C> > :
public mpl::true_ {};
157 template <
typename IC,
typename C>
159 using type =
typename std::iterator_traits<IC>::value_type;
166 template <
typename IC,
typename C>
167 inline std::ptrdiff_t memunit_step(
const planar_pixel_iterator<IC,C>&) {
return sizeof(
typename std::iterator_traits<IC>::value_type); }
169 template <
typename IC,
typename C>
171 return memunit_distance(gil::at_c<0>(p1),gil::at_c<0>(p2));
174 template <
typename IC>
175 struct memunit_advance_fn {
176 memunit_advance_fn(std::ptrdiff_t diff) : _diff(diff) {}
177 IC operator()(
const IC& p)
const {
return memunit_advanced(p,_diff); }
179 std::ptrdiff_t _diff;
182 template <
typename IC,
typename C>
184 static_transform(p, p, memunit_advance_fn<IC>(diff));
187 template <
typename IC,
typename C>
190 memunit_advance(ret, diff);
194 template <
typename ChannelPtr,
typename ColorSpace>
204 template <
typename IC,
typename C>
A reference proxy to a planar pixel. Models: HomogeneousColorBaseConcept, HomogeneousPixelConcept.
Definition: metafunctions.hpp:33
plus function object whose arguments may be of different type.
Definition: utilities.hpp:202
Definition: algorithm.hpp:30
An iterator over planar pixels. Models HomogeneousColorBaseConcept, PixelIteratorConcept, HomogeneousPixelBasedConcept, MemoryBasedIteratorConcept, HasDynamicXStepTypeConcept.
Definition: algorithm.hpp:34
operator– wrapped in a function object
Definition: utilities.hpp:223
operator++ wrapped in a function object
Definition: utilities.hpp:214
BOOST_FORCEINLINE bool equal(boost::gil::iterator_from_2d< Loc1 > first, boost::gil::iterator_from_2d< Loc1 > last, boost::gil::iterator_from_2d< Loc2 > first2)
std::equal(I1,I1,I2) with I1 and I2 being a iterator_from_2d
Definition: algorithm.hpp:929
Definition: color_convert.hpp:30
planar_pixel_iterator(P *pix)
Definition: planar_pixel_iterator.hpp:72
Metafunction predicate returning whether the given iterator allows for changing its values...
Definition: pixel_iterator.hpp:48
Returns the type of an iterator just like the input iterator, except operating over immutable values...
Definition: pixel_iterator.hpp:39
reference operator[](difference_type d) const
Definition: planar_pixel_iterator.hpp:91
Base template for types that model HasDynamicXStepTypeConcept.
Definition: dynamic_step.hpp:17
MEMORY-BASED STEP ITERATOR.
Definition: algorithm.hpp:36