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     BOOST_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