8 #ifndef BOOST_GIL_PIXEL_ITERATOR_ADAPTOR_HPP 9 #define BOOST_GIL_PIXEL_ITERATOR_ADAPTOR_HPP 11 #include <boost/gil/concepts.hpp> 12 #include <boost/gil/pixel_iterator.hpp> 14 #include <boost/iterator/iterator_facade.hpp> 18 namespace boost {
namespace gil {
27 template <
typename Iterator,
31 typename DFn::value_type,
32 typename std::iterator_traits<Iterator>::iterator_category,
33 typename DFn::reference,
37 using parent_t = iterator_adaptor<dereference_iterator_adaptor<Iterator,DFn>,
39 typename DFn::value_type,
40 typename std::iterator_traits<Iterator>::iterator_category,
41 typename DFn::reference,
43 using reference =
typename DFn::result_type;
44 using difference_type =
typename std::iterator_traits<Iterator>::difference_type;
45 using dereference_fn = DFn;
48 template <
typename Iterator1>
51 template <
typename Iterator1,
typename DFn1>
55 reference
operator[](difference_type d)
const {
return *(*
this+d);}
60 bool operator< (
const dereference_iterator_adaptor& p)
const {
return this->base_reference()< p.base_reference(); }
61 bool operator>=(
const dereference_iterator_adaptor& p)
const {
return this->base_reference()>=p.base_reference(); }
62 bool operator<=(
const dereference_iterator_adaptor& p)
const {
return this->base_reference()<=p.base_reference(); }
63 bool operator==(
const dereference_iterator_adaptor& p)
const {
return this->base_reference()==p.base_reference(); }
64 bool operator!=(
const dereference_iterator_adaptor& p)
const {
return this->base_reference()!=p.base_reference(); }
66 Iterator& base() {
return this->base_reference(); }
67 const Iterator& base()
const {
return this->base_reference(); }
68 const DFn& deref_fn()
const {
return _deref_fn; }
70 template <
typename Iterator1,
typename DFn1>
71 friend class dereference_iterator_adaptor;
72 friend class boost::iterator_core_access;
74 reference dereference()
const {
return _deref_fn(*(this->base_reference())); }
77 template <
typename I,
typename DFn>
78 struct const_iterator_type<dereference_iterator_adaptor<I,DFn> > {
79 using type = dereference_iterator_adaptor<typename const_iterator_type<I>::type,
typename DFn::const_t>;
82 template <
typename I,
typename DFn>
83 struct iterator_is_mutable<dereference_iterator_adaptor<I, DFn>>
84 : std::integral_constant<bool, DFn::is_mutable>
88 template <
typename I,
typename DFn>
89 struct is_iterator_adaptor<dereference_iterator_adaptor<I, DFn>> : std::true_type {};
91 template <
typename I,
typename DFn>
92 struct iterator_adaptor_get_base<dereference_iterator_adaptor<I, DFn>>
97 template <
typename I,
typename DFn,
typename NewBaseIterator>
98 struct iterator_adaptor_rebind<dereference_iterator_adaptor<I,DFn>,NewBaseIterator> {
99 using type = dereference_iterator_adaptor<NewBaseIterator,DFn>;
106 template <
typename I,
typename DFn>
107 struct color_space_type<dereference_iterator_adaptor<I,DFn> > :
public color_space_type<typename DFn::value_type> {};
109 template <
typename I,
typename DFn>
110 struct channel_mapping_type<dereference_iterator_adaptor<I,DFn> > :
public channel_mapping_type<typename DFn::value_type> {};
112 template <
typename I,
typename DFn>
113 struct is_planar<dereference_iterator_adaptor<I,DFn> > :
public is_planar<typename DFn::value_type> {};
115 template <
typename I,
typename DFn>
116 struct channel_type<dereference_iterator_adaptor<I,DFn> > :
public channel_type<typename DFn::value_type> {};
123 template <
typename Iterator,
typename DFn>
124 struct byte_to_memunit<dereference_iterator_adaptor<Iterator,DFn> > :
public byte_to_memunit<Iterator> {};
126 template <
typename Iterator,
typename DFn>
127 inline typename std::iterator_traits<Iterator>::difference_type
128 memunit_step(
const dereference_iterator_adaptor<Iterator,DFn>& p) {
129 return memunit_step(p.base());
132 template <
typename Iterator,
typename DFn>
133 inline typename std::iterator_traits<Iterator>::difference_type
134 memunit_distance(
const dereference_iterator_adaptor<Iterator,DFn>& p1,
135 const dereference_iterator_adaptor<Iterator,DFn>& p2) {
136 return memunit_distance(p1.base(),p2.base());
139 template <
typename Iterator,
typename DFn>
140 inline void memunit_advance(dereference_iterator_adaptor<Iterator,DFn>& p,
141 typename std::iterator_traits<Iterator>::difference_type diff) {
142 memunit_advance(p.base(), diff);
145 template <
typename Iterator,
typename DFn>
146 inline dereference_iterator_adaptor<Iterator,DFn>
147 memunit_advanced(
const dereference_iterator_adaptor<Iterator,DFn>& p,
148 typename std::iterator_traits<Iterator>::difference_type diff) {
149 return dereference_iterator_adaptor<Iterator,DFn>(memunit_advanced(p.base(), diff), p.deref_fn());
153 template <
typename Iterator,
typename DFn>
155 typename std::iterator_traits<dereference_iterator_adaptor<Iterator,DFn> >::reference
156 memunit_advanced_ref(
const dereference_iterator_adaptor<Iterator,DFn>& p,
157 typename std::iterator_traits<Iterator>::difference_type diff) {
158 return *memunit_advanced(p, diff);
165 template <
typename Iterator,
typename DFn>
166 struct dynamic_x_step_type<dereference_iterator_adaptor<Iterator,DFn> > {
167 using type = dereference_iterator_adaptor<typename dynamic_x_step_type<Iterator>::type,DFn>;
172 template <
typename Iterator,
typename Deref>
173 struct iterator_add_deref {
174 GIL_CLASS_REQUIRE(Deref, boost::gil, PixelDereferenceAdaptorConcept)
176 using type = dereference_iterator_adaptor<Iterator, Deref>;
178 static type make(
const Iterator& it,
const Deref& d) {
return type(it,d); }
183 template <
typename Iterator,
typename PREV_DEREF,
typename Deref>
Returns the type (and creates an instance) of an iterator that invokes the given dereference adaptor ...
Definition: locator.hpp:27
An adaptor over an existing iterator that provides for custom filter on dereferencing the object....
Definition: pixel_iterator_adaptor.hpp:29
Composes two dereference function objects. Similar to std::unary_compose but needs to pull some alias...
Definition: utilities.hpp:121
reference operator[](difference_type d) const
Definition: pixel_iterator_adaptor.hpp:55