/Lib/include/boost/gil/pixel_iterator_adaptor.hpp

https://bitbucket.org/mihail_rylov/ayuine2c-winrt · C++ Header · 208 lines · 123 code · 44 blank · 41 comment · 0 complexity · 2250bfe5e14b8fde4582df112516101d MD5 · raw file

  1. /*
  2. Copyright 2005-2007 Adobe Systems Incorporated
  3. Use, modification and distribution are subject to the Boost Software License,
  4. Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
  5. http://www.boost.org/LICENSE_1_0.txt).
  6. See http://opensource.adobe.com/gil for most recent version including documentation.
  7. */
  8. /*************************************************************************************************/
  9. #ifndef GIL_PIXEL_ITERATOR_ADAPTOR_H
  10. #define GIL_PIXEL_ITERATOR_ADAPTOR_H
  11. ////////////////////////////////////////////////////////////////////////////////////////
  12. /// \file
  13. /// \brief pixel step iterator, pixel image iterator and pixel dereference iterator
  14. /// \author Lubomir Bourdev and Hailin Jin \n
  15. /// Adobe Systems Incorporated
  16. /// \date 2005-2007 \n Last updated on February 16, 2007
  17. ///
  18. ////////////////////////////////////////////////////////////////////////////////////////
  19. #include <iterator>
  20. #include <boost/iterator/iterator_facade.hpp>
  21. #include "gil_config.hpp"
  22. #include "gil_concept.hpp"
  23. #include "pixel_iterator.hpp"
  24. namespace boost { namespace gil {
  25. /// \defgroup PixelIteratorModelDerefPtr dereference_iterator_adaptor
  26. /// \ingroup PixelIteratorModel
  27. /// \brief An iterator that invokes a provided function object upon dereference. Models: IteratorAdaptorConcept, PixelIteratorConcept
  28. /// \ingroup PixelIteratorModelDerefPtr PixelBasedModel
  29. /// \brief An adaptor over an existing iterator that provides for custom filter on dereferencing the object. Models: IteratorAdaptorConcept, PixelIteratorConcept
  30. template <typename Iterator, // Models Iterator
  31. typename DFn> // Models Returns the result of dereferencing a given iterator of type Iterator
  32. class dereference_iterator_adaptor : public iterator_adaptor<dereference_iterator_adaptor<Iterator,DFn>,
  33. Iterator,
  34. typename DFn::value_type,
  35. use_default,
  36. typename DFn::reference,
  37. use_default> {
  38. DFn _deref_fn;
  39. public:
  40. typedef iterator_adaptor<dereference_iterator_adaptor<Iterator,DFn>,
  41. Iterator,
  42. typename DFn::value_type,
  43. use_default,
  44. typename DFn::reference,
  45. use_default> parent_t;
  46. typedef typename DFn::result_type reference;
  47. typedef typename std::iterator_traits<Iterator>::difference_type difference_type;
  48. typedef DFn dereference_fn;
  49. dereference_iterator_adaptor() {}
  50. template <typename Iterator1>
  51. dereference_iterator_adaptor(const dereference_iterator_adaptor<Iterator1,DFn>& dit) : parent_t(dit.base()), _deref_fn(dit._deref_fn) {}
  52. dereference_iterator_adaptor(Iterator it, DFn deref_fn=DFn()) : parent_t(it), _deref_fn(deref_fn) {}
  53. template <typename Iterator1, typename DFn1>
  54. dereference_iterator_adaptor(const dereference_iterator_adaptor<Iterator1,DFn1>& it) : parent_t(it.base()), _deref_fn(it._deref_fn) {}
  55. /// For some reason operator[] provided by iterator_facade returns a custom class that is convertible to reference
  56. /// We require our own reference because it is registered in iterator_traits
  57. reference operator[](difference_type d) const { return *(*this+d);}
  58. // although iterator_adaptor defines these, the default implementation computes distance and compares for zero.
  59. // it is often faster to just apply the relation operator to the base
  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. 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; }
  69. private:
  70. template <typename Iterator1, typename DFn1>
  71. friend class dereference_iterator_adaptor;
  72. friend class boost::iterator_core_access;
  73. reference dereference() const { return _deref_fn(*(this->base_reference())); }
  74. };
  75. template <typename I, typename DFn>
  76. struct const_iterator_type<dereference_iterator_adaptor<I,DFn> > {
  77. typedef dereference_iterator_adaptor<typename const_iterator_type<I>::type,typename DFn::const_t> type;
  78. };
  79. template <typename I, typename DFn>
  80. struct iterator_is_mutable<dereference_iterator_adaptor<I,DFn> > : public mpl::bool_<DFn::is_mutable> {};
  81. template <typename I, typename DFn>
  82. struct is_iterator_adaptor<dereference_iterator_adaptor<I,DFn> > : public mpl::true_{};
  83. template <typename I, typename DFn>
  84. struct iterator_adaptor_get_base<dereference_iterator_adaptor<I,DFn> > {
  85. typedef I type;
  86. };
  87. template <typename I, typename DFn, typename NewBaseIterator>
  88. struct iterator_adaptor_rebind<dereference_iterator_adaptor<I,DFn>,NewBaseIterator> {
  89. typedef dereference_iterator_adaptor<NewBaseIterator,DFn> type;
  90. };
  91. /////////////////////////////
  92. // PixelBasedConcept
  93. /////////////////////////////
  94. template <typename I, typename DFn>
  95. struct color_space_type<dereference_iterator_adaptor<I,DFn> > : public color_space_type<typename DFn::value_type> {};
  96. template <typename I, typename DFn>
  97. struct channel_mapping_type<dereference_iterator_adaptor<I,DFn> > : public channel_mapping_type<typename DFn::value_type> {};
  98. template <typename I, typename DFn>
  99. struct is_planar<dereference_iterator_adaptor<I,DFn> > : public is_planar<typename DFn::value_type> {};
  100. template <typename I, typename DFn>
  101. struct channel_type<dereference_iterator_adaptor<I,DFn> > : public channel_type<typename DFn::value_type> {};
  102. /////////////////////////////
  103. // MemoryBasedIteratorConcept
  104. /////////////////////////////
  105. template <typename Iterator, typename DFn>
  106. struct byte_to_memunit<dereference_iterator_adaptor<Iterator,DFn> > : public byte_to_memunit<Iterator> {};
  107. template <typename Iterator, typename DFn>
  108. inline typename std::iterator_traits<Iterator>::difference_type
  109. memunit_step(const dereference_iterator_adaptor<Iterator,DFn>& p) {
  110. return memunit_step(p.base());
  111. }
  112. template <typename Iterator, typename DFn>
  113. inline typename std::iterator_traits<Iterator>::difference_type
  114. memunit_distance(const dereference_iterator_adaptor<Iterator,DFn>& p1,
  115. const dereference_iterator_adaptor<Iterator,DFn>& p2) {
  116. return memunit_distance(p1.base(),p2.base());
  117. }
  118. template <typename Iterator, typename DFn>
  119. inline void memunit_advance(dereference_iterator_adaptor<Iterator,DFn>& p,
  120. typename std::iterator_traits<Iterator>::difference_type diff) {
  121. memunit_advance(p.base(), diff);
  122. }
  123. template <typename Iterator, typename DFn>
  124. inline dereference_iterator_adaptor<Iterator,DFn>
  125. memunit_advanced(const dereference_iterator_adaptor<Iterator,DFn>& p,
  126. typename std::iterator_traits<Iterator>::difference_type diff) {
  127. return dereference_iterator_adaptor<Iterator,DFn>(memunit_advanced(p.base(), diff), p.deref_fn());
  128. }
  129. template <typename Iterator, typename DFn>
  130. inline
  131. typename std::iterator_traits<dereference_iterator_adaptor<Iterator,DFn> >::reference
  132. memunit_advanced_ref(const dereference_iterator_adaptor<Iterator,DFn>& p,
  133. typename std::iterator_traits<Iterator>::difference_type diff) {
  134. return *memunit_advanced(p, diff);
  135. }
  136. /////////////////////////////
  137. // HasDynamicXStepTypeConcept
  138. /////////////////////////////
  139. template <typename Iterator, typename DFn>
  140. struct dynamic_x_step_type<dereference_iterator_adaptor<Iterator,DFn> > {
  141. typedef dereference_iterator_adaptor<typename dynamic_x_step_type<Iterator>::type,DFn> type;
  142. };
  143. /// \brief Returns the type (and creates an instance) of an iterator that invokes the given dereference adaptor upon dereferencing
  144. /// \ingroup PixelIteratorModelDerefPtr
  145. template <typename Iterator, typename Deref>
  146. struct iterator_add_deref {
  147. GIL_CLASS_REQUIRE(Deref, boost::gil, PixelDereferenceAdaptorConcept)
  148. typedef dereference_iterator_adaptor<Iterator, Deref> type;
  149. static type make(const Iterator& it, const Deref& d) { return type(it,d); }
  150. };
  151. /// \ingroup PixelIteratorModelDerefPtr
  152. /// \brief For dereference iterator adaptors, compose the new function object after the old one
  153. template <typename Iterator, typename PREV_DEREF, typename Deref>
  154. struct iterator_add_deref<dereference_iterator_adaptor<Iterator, PREV_DEREF>,Deref> {
  155. // GIL_CLASS_REQUIRE(Deref, boost::gil, PixelDereferenceAdaptorConcept)
  156. typedef dereference_iterator_adaptor<Iterator, deref_compose<Deref,PREV_DEREF> > type;
  157. static type make(const dereference_iterator_adaptor<Iterator, PREV_DEREF>& it, const Deref& d) {
  158. return type(it.base(),deref_compose<Deref,PREV_DEREF>(d,it.deref_fn()));
  159. }
  160. };
  161. } } // namespace boost::gil
  162. #endif