12 #ifndef GIL_ITERATOR_FROM_2D_H
13 #define GIL_ITERATOR_FROM_2D_H
25 #include <boost/iterator/iterator_facade.hpp>
31 namespace boost {
namespace gil {
51 template <
typename Loc2>
53 typename Loc2::value_type,
54 std::random_access_iterator_tag,
55 typename Loc2::reference,
56 typename Loc2::coord_t> {
59 typedef iterator_facade<iterator_from_2d<Loc2>,
60 typename Loc2::value_type,
61 std::random_access_iterator_tag,
62 typename Loc2::reference,
63 typename Loc2::coord_t> parent_t;
64 typedef typename parent_t::reference reference;
65 typedef typename parent_t::difference_type difference_type;
66 typedef typename Loc2::x_iterator x_iterator;
67 typedef typename Loc2::point_t point_t;
69 std::ptrdiff_t width()
const {
return _width; }
70 std::ptrdiff_t x_pos()
const {
return _coords.x; }
71 std::ptrdiff_t y_pos()
const {
return _coords.y; }
75 reference
operator[](difference_type d)
const {
return *(*
this+d); }
77 bool is_1d_traversable()
const {
return _p.is_1d_traversable(width()); }
78 x_iterator& x() {
return _p.x(); }
81 iterator_from_2d(
const Loc2& p, std::ptrdiff_t width, std::ptrdiff_t x=0, std::ptrdiff_t y=0) : _coords(x,y), _width(width), _p(p) {}
82 iterator_from_2d(
const iterator_from_2d& pit) : _coords(pit._coords), _width(pit._width), _p(pit._p) {}
83 template <
typename Loc> iterator_from_2d(
const iterator_from_2d<Loc>& pit) : _coords(pit._coords), _width(pit._width), _p(pit._p) {}
86 template <
typename Loc>
friend class iterator_from_2d;
87 friend class boost::iterator_core_access;
88 reference dereference()
const {
return *_p; }
92 if (_coords.x>=_width) {
95 _p+=point_t(-_width,1);
104 _p+=point_t(_width,-1);
108 BOOST_FORCEINLINE
void advance(difference_type d) {
109 if (_width==0)
return;
111 if (_coords.x+d>=0) {
112 delta.x=(_coords.x+(std::ptrdiff_t)d)%_width - _coords.x;
113 delta.y=(_coords.x+(std::ptrdiff_t)d)/_width;
115 delta.x=(_coords.x+(std::ptrdiff_t)d*(1-_width))%_width -_coords.x;
116 delta.y=-(_width-_coords.x-(std::ptrdiff_t)d-1)/_width;
123 difference_type distance_to(
const iterator_from_2d& it)
const {
124 if (_width==0)
return 0;
125 return (it.y_pos()-_coords.y)*_width + (it.x_pos()-_coords.x);
128 bool equal(
const iterator_from_2d& it)
const {
129 assert(_width==it.width());
130 return _coords==it._coords && _p==it._p;
133 point2<std::ptrdiff_t> _coords;
134 std::ptrdiff_t _width;
138 template <
typename Loc>
139 struct const_iterator_type<iterator_from_2d<Loc> > {
140 typedef iterator_from_2d<typename Loc::const_t> type;
143 template <
typename Loc>
144 struct iterator_is_mutable<iterator_from_2d<Loc> > :
public iterator_is_mutable<typename Loc::x_iterator> {};
151 template <
typename Loc>
152 struct dynamic_x_step_type<iterator_from_2d<Loc> > {
153 typedef iterator_from_2d<typename dynamic_x_step_type<Loc>::type> type;
161 template <
typename Loc>
162 struct color_space_type<iterator_from_2d<Loc> > :
public color_space_type<Loc> {};
164 template <
typename Loc>
165 struct channel_mapping_type<iterator_from_2d<Loc> > :
public channel_mapping_type<Loc> {};
167 template <
typename Loc>
168 struct is_planar<iterator_from_2d<Loc> > :
public is_planar<Loc> {};
170 template <
typename Loc>
171 struct channel_type<iterator_from_2d<Loc> > :
public channel_type<Loc> {};
Concept check classes for GIL concepts.
Provides 1D random-access navigation to the pixels of the image. Models: PixelIteratorConcept, PixelBasedConcept, HasDynamicXStepTypeConcept.
Definition: iterator_from_2d.hpp:52
GIL's 2-dimensional locator over immutable GIL pixels.
Definition: gil_concept.hpp:1616
BOOST_FORCEINLINE bool equal(boost::gil::iterator_from_2d< Loc1 > first, boost::gil::iterator_from_2d< Loc1 > last, boost::gil::iterator_from_2d< Loc2 > first2)
std::equal(I1,I1,I2) with I1 and I2 being a iterator_from_2d
Definition: algorithm.hpp:934
reference operator[](difference_type d) const
Definition: iterator_from_2d.hpp:75