Boost GIL


pixel_iterator_adaptor.hpp
1//
2// Copyright 2005-2007 Adobe Systems Incorporated
3//
4// Distributed under the Boost Software License, Version 1.0
5// See accompanying file LICENSE_1_0.txt or copy at
6// http://www.boost.org/LICENSE_1_0.txt
7//
8#ifndef BOOST_GIL_PIXEL_ITERATOR_ADAPTOR_HPP
9#define BOOST_GIL_PIXEL_ITERATOR_ADAPTOR_HPP
10
11#include <boost/gil/concepts.hpp>
12#include <boost/gil/pixel_iterator.hpp>
13
14#include <boost/stl_interfaces/iterator_interface.hpp>
15
16#include <iterator>
17
18namespace boost { namespace gil {
19
23
26
27template <typename Iterator, // Models Iterator
28 typename DFn> // Models Returns the result of dereferencing a given iterator of type Iterator
29class dereference_iterator_adaptor : public stl_interfaces::iterator_interface<
30#if !BOOST_STL_INTERFACES_USE_DEDUCED_THIS
31 dereference_iterator_adaptor<Iterator,DFn>,
32#endif
33 typename std::iterator_traits<Iterator>::iterator_category,
34 typename DFn::value_type,
35 typename DFn::reference>
36{
37public:
38 using parent_t = stl_interfaces::iterator_interface<
39#if !BOOST_STL_INTERFACES_USE_DEDUCED_THIS
41#endif
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;
49
51 template <typename Iterator1>
52 dereference_iterator_adaptor(const dereference_iterator_adaptor<Iterator1,DFn>& dit) : it_(dit.base()), _deref_fn(dit._deref_fn) {}
53 dereference_iterator_adaptor(Iterator it, DFn deref_fn=DFn()) : it_(it), _deref_fn(deref_fn) {}
54 template <typename Iterator1, typename DFn1>
55 dereference_iterator_adaptor(const dereference_iterator_adaptor<Iterator1,DFn1>& it) : it_(it.base()), _deref_fn(it._deref_fn) {}
56
57 constexpr auto operator*() const noexcept -> reference { return dereference(); }
58
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; }
62
63protected:
64 Iterator it_;
65 DFn _deref_fn;
66
67 constexpr auto base_reference() noexcept -> Iterator& { return it_; }
68 constexpr auto base_reference() const noexcept -> Iterator const& { return it_; }
69
70private:
71 template <typename Iterator1, typename DFn1>
73 friend struct boost::stl_interfaces::access;
74
75 reference dereference() const { return _deref_fn(*(this->base_reference())); }
76};
77
78template <typename I, typename DFn>
81};
82
83template <typename I, typename DFn>
84struct iterator_is_mutable<dereference_iterator_adaptor<I, DFn>>
85 : std::integral_constant<bool, DFn::is_mutable>
86{};
87
88
89template <typename I, typename DFn>
90struct is_iterator_adaptor<dereference_iterator_adaptor<I, DFn>> : std::true_type {};
91
92template <typename I, typename DFn>
93struct iterator_adaptor_get_base<dereference_iterator_adaptor<I, DFn>>
94{
95 using type = I;
96};
97
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>;
101};
102
104// PixelBasedConcept
106
107template <typename I, typename DFn>
108struct color_space_type<dereference_iterator_adaptor<I,DFn> > : public color_space_type<typename DFn::value_type> {};
109
110template <typename I, typename DFn>
111struct channel_mapping_type<dereference_iterator_adaptor<I,DFn> > : public channel_mapping_type<typename DFn::value_type> {};
112
113template <typename I, typename DFn>
114struct is_planar<dereference_iterator_adaptor<I,DFn> > : public is_planar<typename DFn::value_type> {};
115
116template <typename I, typename DFn>
117struct channel_type<dereference_iterator_adaptor<I,DFn> > : public channel_type<typename DFn::value_type> {};
118
119
121// MemoryBasedIteratorConcept
123
124template <typename Iterator, typename DFn>
125struct byte_to_memunit<dereference_iterator_adaptor<Iterator,DFn>> : public byte_to_memunit<Iterator> {};
126
127template <typename Iterator, typename DFn>
128inline auto memunit_step(dereference_iterator_adaptor<Iterator,DFn> const& p)
129 -> typename std::iterator_traits<Iterator>::difference_type
130{
131 return memunit_step(p.base());
132}
133
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
138{
139 return memunit_distance(p1.base(),p2.base());
140}
141
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);
146}
147
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>
152{
153 return dereference_iterator_adaptor<Iterator,DFn>(memunit_advanced(p.base(), diff), p.deref_fn());
154}
155
156
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
161{
162 return *memunit_advanced(p, diff);
163}
164
166// HasDynamicXStepTypeConcept
168
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>;
172};
173
176template <typename Iterator, typename Deref>
178 BOOST_GIL_CLASS_REQUIRE(Deref, boost::gil, PixelDereferenceAdaptorConcept)
179
181
182 static type make(const Iterator& it, const Deref& d) { return type(it,d); }
183};
184
187template <typename Iterator, typename PREV_DEREF, typename Deref>
188struct iterator_add_deref<dereference_iterator_adaptor<Iterator, PREV_DEREF>,Deref> {
189// BOOST_GIL_CLASS_REQUIRE(Deref, boost::gil, PixelDereferenceAdaptorConcept)
190
192
193 static type make(const dereference_iterator_adaptor<Iterator, PREV_DEREF>& it, const Deref& d) {
194 return type(it.base(),deref_compose<Deref,PREV_DEREF>(d,it.deref_fn()));
195 }
196};
197
198}} // namespace boost::gil
199
200#endif
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