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/iterator/iterator_facade.hpp>
15 
16 #include <iterator>
17 
18 namespace boost { namespace gil {
19 
23 
26 
27 template <typename Iterator, // Models Iterator
28  typename DFn> // Models Returns the result of dereferencing a given iterator of type Iterator
29 class dereference_iterator_adaptor : public iterator_adaptor<dereference_iterator_adaptor<Iterator,DFn>,
30  Iterator,
31  typename DFn::value_type,
32  typename std::iterator_traits<Iterator>::iterator_category,
33  typename DFn::reference,
34  use_default> {
35  DFn _deref_fn;
36 public:
37  using parent_t = iterator_adaptor<dereference_iterator_adaptor<Iterator,DFn>,
38  Iterator,
39  typename DFn::value_type,
40  typename std::iterator_traits<Iterator>::iterator_category,
41  typename DFn::reference,
42  use_default>;
43  using reference = typename DFn::result_type;
44  using difference_type = typename std::iterator_traits<Iterator>::difference_type;
45  using dereference_fn = DFn;
46 
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);}
56 
57  // although iterator_adaptor defines these, the default implementation computes distance and compares for zero.
58  // it is often faster to just apply the relation operator to the base
59  bool operator> (const dereference_iterator_adaptor& p) const { return this->base_reference()> p.base_reference(); }
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(); }
65 
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; }
69 private:
70  template <typename Iterator1, typename DFn1>
71  friend class dereference_iterator_adaptor;
72  friend class boost::iterator_core_access;
73 
74  reference dereference() const { return _deref_fn(*(this->base_reference())); }
75 };
76 
77 template <typename I, typename DFn>
78 struct const_iterator_type<dereference_iterator_adaptor<I,DFn> > {
80 };
81 
82 template <typename I, typename DFn>
83 struct iterator_is_mutable<dereference_iterator_adaptor<I,DFn> > : public mpl::bool_<DFn::is_mutable> {};
84 
85 
86 template <typename I, typename DFn>
87 struct is_iterator_adaptor<dereference_iterator_adaptor<I,DFn> > : public mpl::true_{};
88 
89 template <typename I, typename DFn>
90 struct iterator_adaptor_get_base<dereference_iterator_adaptor<I,DFn> > {
91  using type = I;
92 };
93 
94 template <typename I, typename DFn, typename NewBaseIterator>
95 struct iterator_adaptor_rebind<dereference_iterator_adaptor<I,DFn>,NewBaseIterator> {
97 };
98 
100 // PixelBasedConcept
102 
103 template <typename I, typename DFn>
104 struct color_space_type<dereference_iterator_adaptor<I,DFn> > : public color_space_type<typename DFn::value_type> {};
105 
106 template <typename I, typename DFn>
107 struct channel_mapping_type<dereference_iterator_adaptor<I,DFn> > : public channel_mapping_type<typename DFn::value_type> {};
108 
109 template <typename I, typename DFn>
110 struct is_planar<dereference_iterator_adaptor<I,DFn> > : public is_planar<typename DFn::value_type> {};
111 
112 template <typename I, typename DFn>
113 struct channel_type<dereference_iterator_adaptor<I,DFn> > : public channel_type<typename DFn::value_type> {};
114 
115 
117 // MemoryBasedIteratorConcept
119 
120 template <typename Iterator, typename DFn>
121 struct byte_to_memunit<dereference_iterator_adaptor<Iterator,DFn> > : public byte_to_memunit<Iterator> {};
122 
123 template <typename Iterator, typename DFn>
124 inline typename std::iterator_traits<Iterator>::difference_type
125 memunit_step(const dereference_iterator_adaptor<Iterator,DFn>& p) {
126  return memunit_step(p.base());
127 }
128 
129 template <typename Iterator, typename DFn>
130 inline typename std::iterator_traits<Iterator>::difference_type
131 memunit_distance(const dereference_iterator_adaptor<Iterator,DFn>& p1,
133  return memunit_distance(p1.base(),p2.base());
134 }
135 
136 template <typename Iterator, typename DFn>
137 inline void memunit_advance(dereference_iterator_adaptor<Iterator,DFn>& p,
138  typename std::iterator_traits<Iterator>::difference_type diff) {
139  memunit_advance(p.base(), diff);
140 }
141 
142 template <typename Iterator, typename DFn>
144 memunit_advanced(const dereference_iterator_adaptor<Iterator,DFn>& p,
145  typename std::iterator_traits<Iterator>::difference_type diff) {
146  return dereference_iterator_adaptor<Iterator,DFn>(memunit_advanced(p.base(), diff), p.deref_fn());
147 }
148 
149 
150 template <typename Iterator, typename DFn>
151 inline
152 typename std::iterator_traits<dereference_iterator_adaptor<Iterator,DFn> >::reference
153 memunit_advanced_ref(const dereference_iterator_adaptor<Iterator,DFn>& p,
154  typename std::iterator_traits<Iterator>::difference_type diff) {
155  return *memunit_advanced(p, diff);
156 }
157 
159 // HasDynamicXStepTypeConcept
161 
162 template <typename Iterator, typename DFn>
163 struct dynamic_x_step_type<dereference_iterator_adaptor<Iterator,DFn> > {
165 };
166 
169 template <typename Iterator, typename Deref>
170 struct iterator_add_deref {
171  GIL_CLASS_REQUIRE(Deref, boost::gil, PixelDereferenceAdaptorConcept)
172 
174 
175  static type make(const Iterator& it, const Deref& d) { return type(it,d); }
176 };
177 
180 template <typename Iterator, typename PREV_DEREF, typename Deref>
181 struct iterator_add_deref<dereference_iterator_adaptor<Iterator, PREV_DEREF>,Deref> {
182 // GIL_CLASS_REQUIRE(Deref, boost::gil, PixelDereferenceAdaptorConcept)
183 
185 
186  static type make(const dereference_iterator_adaptor<Iterator, PREV_DEREF>& it, const Deref& d) {
187  return type(it.base(),deref_compose<Deref,PREV_DEREF>(d,it.deref_fn()));
188  }
189 };
190 
191 }} // namespace boost::gil
192 
193 #endif
Represents a unary function object that can be invoked upon dereferencing a pixel iterator...
Definition: pixel_dereference.hpp:52
Definition: pixel_iterator.hpp:110
metafunction predicate determining whether the given iterator is a plain one or an adaptor over anoth...
Definition: metafunctions.hpp:42
Definition: algorithm.hpp:30
Definition: algorithm.hpp:30
returns the base iterator for a given iterator adaptor. Provide an specialization when introducing ne...
Definition: metafunctions.hpp:43
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:105
Definition: color_convert.hpp:30
reference operator[](difference_type d) const
Definition: pixel_iterator_adaptor.hpp:55
Changes the base iterator of an iterator adaptor. Provide an specialization when introducing new iter...
Definition: pixel_iterator.hpp:35
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
Base template for types that model HasDynamicXStepTypeConcept.
Definition: dynamic_step.hpp:17