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/stl_interfaces/iterator_interface.hpp>
18namespace boost {
namespace gil {
27template <
typename Iterator,
30#if !BOOST_STL_INTERFACES_USE_DEDUCED_THIS
31 dereference_iterator_adaptor<Iterator,DFn>,
33 typename std::iterator_traits<Iterator>::iterator_category,
34 typename DFn::value_type,
35 typename DFn::reference>
38 using parent_t = stl_interfaces::iterator_interface<
39#if !BOOST_STL_INTERFACES_USE_DEDUCED_THIS
42 typename std::iterator_traits<Iterator>::iterator_category,
43 typename DFn::value_type,
44 typename DFn::reference>;
45 using reference =
typename DFn::result_type;
46 using difference_type =
typename std::iterator_traits<Iterator>::difference_type;
47 using iterator_category =
typename parent_t::iterator_concept;
48 using dereference_fn = DFn;
51 template <
typename Iterator1>
54 template <
typename Iterator1,
typename DFn1>
57 constexpr auto operator*()
const noexcept -> reference {
return dereference(); }
59 Iterator& base() {
return this->base_reference(); }
60 const Iterator& base()
const {
return this->base_reference(); }
61 const DFn& deref_fn()
const {
return _deref_fn; }
67 constexpr auto base_reference()
noexcept -> Iterator& {
return it_; }
68 constexpr auto base_reference()
const noexcept -> Iterator
const& {
return it_; }
71 template <
typename Iterator1,
typename DFn1>
73 friend struct boost::stl_interfaces::access;
75 reference dereference()
const {
return _deref_fn(*(this->base_reference())); }
78template <
typename I,
typename DFn>
83template <
typename I,
typename DFn>
84struct iterator_is_mutable<dereference_iterator_adaptor<I, DFn>>
85 : std::integral_constant<bool, DFn::is_mutable>
89template <
typename I,
typename DFn>
90struct is_iterator_adaptor<dereference_iterator_adaptor<I, DFn>> : std::true_type {};
92template <
typename I,
typename DFn>
93struct iterator_adaptor_get_base<dereference_iterator_adaptor<I, DFn>>
98template <
typename I,
typename DFn,
typename NewBaseIterator>
99struct iterator_adaptor_rebind<dereference_iterator_adaptor<I,DFn>,NewBaseIterator> {
100 using type = dereference_iterator_adaptor<NewBaseIterator,DFn>;
107template <
typename I,
typename DFn>
108struct color_space_type<dereference_iterator_adaptor<I,DFn> > :
public color_space_type<typename DFn::value_type> {};
110template <
typename I,
typename DFn>
111struct channel_mapping_type<dereference_iterator_adaptor<I,DFn> > :
public channel_mapping_type<typename DFn::value_type> {};
113template <
typename I,
typename DFn>
114struct is_planar<dereference_iterator_adaptor<I,DFn> > :
public is_planar<typename DFn::value_type> {};
116template <
typename I,
typename DFn>
117struct channel_type<dereference_iterator_adaptor<I,DFn> > :
public channel_type<typename DFn::value_type> {};
124template <
typename Iterator,
typename DFn>
125struct byte_to_memunit<dereference_iterator_adaptor<Iterator,DFn>> :
public byte_to_memunit<Iterator> {};
127template <
typename Iterator,
typename DFn>
128inline auto memunit_step(dereference_iterator_adaptor<Iterator,DFn>
const& p)
129 ->
typename std::iterator_traits<Iterator>::difference_type
131 return memunit_step(p.base());
134template <
typename Iterator,
typename DFn>
135inline auto memunit_distance(dereference_iterator_adaptor<Iterator,DFn>
const& p1,
136 dereference_iterator_adaptor<Iterator,DFn>
const& p2)
137 ->
typename std::iterator_traits<Iterator>::difference_type
139 return memunit_distance(p1.base(),p2.base());
142template <
typename Iterator,
typename DFn>
143inline void memunit_advance(dereference_iterator_adaptor<Iterator,DFn>& p,
144 typename std::iterator_traits<Iterator>::difference_type diff) {
145 memunit_advance(p.base(), diff);
148template <
typename Iterator,
typename DFn>
149inline auto memunit_advanced(dereference_iterator_adaptor<Iterator,DFn>
const& p,
150 typename std::iterator_traits<Iterator>::difference_type diff)
151 -> dereference_iterator_adaptor<Iterator,DFn>
153 return dereference_iterator_adaptor<Iterator,DFn>(memunit_advanced(p.base(), diff), p.deref_fn());
157template <
typename Iterator,
typename DFn>
158inline auto memunit_advanced_ref(dereference_iterator_adaptor<Iterator,DFn>
const& p,
159 typename std::iterator_traits<Iterator>::difference_type diff)
160 ->
typename std::iterator_traits<dereference_iterator_adaptor<Iterator,DFn> >::reference
162 return *memunit_advanced(p, diff);
169template <
typename Iterator,
typename DFn>
170struct dynamic_x_step_type<dereference_iterator_adaptor<Iterator,DFn> > {
171 using type = dereference_iterator_adaptor<typename dynamic_x_step_type<Iterator>::type,DFn>;
176template <
typename Iterator,
typename Deref>
182 static type make(
const Iterator& it,
const Deref& d) {
return type(it,d); }
187template <
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:128
An adaptor over an existing iterator that provides for custom filter on dereferencing the object....
Definition pixel_iterator_adaptor.hpp:36
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
Returns the type of an iterator just like the input iterator, except operating over immutable values.
Definition pixel_iterator.hpp:40
Returns the type (and creates an instance) of an iterator that invokes the given dereference adaptor ...
Definition pixel_iterator_adaptor.hpp:177