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>
18namespace boost {
namespace gil {
27template <
typename Iterator,
29class dereference_iterator_adaptor :
public iterator_adaptor<dereference_iterator_adaptor<Iterator,DFn>,
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;
47 dereference_iterator_adaptor() {}
48 template <
typename Iterator1>
49 dereference_iterator_adaptor(
const dereference_iterator_adaptor<Iterator1,DFn>& dit) : parent_t(dit.base()), _deref_fn(dit._deref_fn) {}
50 dereference_iterator_adaptor(Iterator it, DFn deref_fn=DFn()) : parent_t(it), _deref_fn(deref_fn) {}
51 template <
typename Iterator1,
typename DFn1>
52 dereference_iterator_adaptor(
const dereference_iterator_adaptor<Iterator1,DFn1>& it) : parent_t(it.base()), _deref_fn(it._deref_fn) {}
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())); }
77template <
typename I,
typename DFn>
79 using type = dereference_iterator_adaptor<typename const_iterator_type<I>::type,
typename DFn::const_t>;
82template <
typename I,
typename DFn>
84 : std::integral_constant<bool, DFn::is_mutable>
88template <
typename I,
typename DFn>
91template <
typename I,
typename DFn>
97template <
typename I,
typename DFn,
typename NewBaseIterator>
99 using type = dereference_iterator_adaptor<NewBaseIterator,DFn>;
106template <
typename I,
typename DFn>
109template <
typename I,
typename DFn>
112template <
typename I,
typename DFn>
115template <
typename I,
typename DFn>
123template <
typename Iterator,
typename DFn>
126template <
typename Iterator,
typename DFn>
128 ->
typename std::iterator_traits<Iterator>::difference_type
130 return memunit_step(p.base());
133template <
typename Iterator,
typename DFn>
136 ->
typename std::iterator_traits<Iterator>::difference_type
138 return memunit_distance(p1.base(),p2.base());
141template <
typename Iterator,
typename DFn>
143 typename std::iterator_traits<Iterator>::difference_type diff) {
144 memunit_advance(p.base(), diff);
147template <
typename Iterator,
typename DFn>
149 typename std::iterator_traits<Iterator>::difference_type diff)
156template <
typename Iterator,
typename DFn>
158 typename std::iterator_traits<Iterator>::difference_type diff)
159 ->
typename std::iterator_traits<dereference_iterator_adaptor<Iterator,DFn> >::reference
161 return *memunit_advanced(p, diff);
168template <
typename Iterator,
typename DFn>
170 using type = dereference_iterator_adaptor<typename dynamic_x_step_type<Iterator>::type,DFn>;
175template <
typename Iterator,
typename Deref>
181 static type make(
const Iterator& it,
const Deref& d) {
return type(it,d); }
186template <
typename Iterator,
typename PREV_DEREF,
typename Deref>
Composes two dereference function objects. Similar to std::unary_compose but needs to pull some alias...
Definition utilities.hpp:131
An adaptor over an existing iterator that provides for custom filter on dereferencing the object....
Definition pixel_iterator_adaptor.hpp:34
reference operator[](difference_type d) const
Definition pixel_iterator_adaptor.hpp:55
defined(BOOST_NO_CXX17_HDR_MEMORY_RESOURCE)
Definition algorithm.hpp:36
Represents a unary function object that can be invoked upon dereferencing a pixel iterator.
Definition pixel_dereference.hpp:54
Definition pixel_iterator.hpp:124
Definition color_convert.hpp:31
Returns the type of an iterator just like the input iterator, except operating over immutable values.
Definition pixel_iterator.hpp:40
Base template for types that model HasDynamicXStepTypeConcept.
Definition dynamic_step.hpp:17
metafunction predicate determining whether the given iterator is a plain one or an adaptor over anoth...
Definition pixel_iterator.hpp:28
returns the base iterator for a given iterator adaptor. Provide an specialization when introducing ne...
Definition metafunctions.hpp:36
Changes the base iterator of an iterator adaptor. Provide an specialization when introducing new iter...
Definition pixel_iterator.hpp:36
Returns the type (and creates an instance) of an iterator that invokes the given dereference adaptor ...
Definition pixel_iterator_adaptor.hpp:176
Metafunction predicate returning whether the given iterator allows for changing its values.
Definition pixel_iterator.hpp:49