43#if !BOOST_STL_INTERFACES_USE_DEDUCED_THIS
44 iterator_from_2d<Loc2>,
46 std::random_access_iterator_tag,
47 typename Loc2::value_type,
48 typename Loc2::reference>
52 using parent_t = stl_interfaces::iterator_interface<
53#if !BOOST_STL_INTERFACES_USE_DEDUCED_THIS
56 std::random_access_iterator_tag,
57 typename Loc2::value_type,
58 typename Loc2::reference>;
61 using difference_type =
typename parent_t::difference_type;
62 using reference =
typename parent_t::reference;
63 using iterator_category =
typename parent_t::iterator_concept;
65 using x_iterator =
typename Loc2::x_iterator;
66 using point_t =
typename Loc2::point_t;
68 std::ptrdiff_t width()
const {
return _width; }
69 std::ptrdiff_t x_pos()
const {
return _coords.x; }
70 std::ptrdiff_t y_pos()
const {
return _coords.y; }
72 bool is_1d_traversable()
const {
return _p.is_1d_traversable(width()); }
73 x_iterator& x() {
return _p.x(); }
76 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) {}
81 constexpr auto operator*()
const noexcept -> reference {
return dereference(); }
83 constexpr auto operator+=(difference_type d) ->
iterator_from_2d& { advance(d);
return *
this; }
85 constexpr auto operator++()
noexcept ->
iterator_from_2d& { increment();
return *
this; }
86 constexpr auto operator--()
noexcept ->
iterator_from_2d& { decrement();
return *
this; }
88 constexpr auto operator++(
int)
noexcept ->
iterator_from_2d {
auto tmp = *
this; increment();
return tmp; }
89 constexpr auto operator--(
int)
noexcept ->
iterator_from_2d {
auto tmp = *
this; decrement();
return tmp; }
91 constexpr auto operator-(
iterator_from_2d other)
const noexcept {
return -distance_to(other); }
93 constexpr bool operator==(
iterator_from_2d other)
const noexcept {
return equal(other); }
98 friend struct boost::stl_interfaces::access;
100 reference dereference()
const {
return *_p; }
104 if (_coords.x>=_width) {
107 _p+=point_t(-_width,1);
116 _p+=point_t(_width,-1);
120 BOOST_FORCEINLINE
void advance(difference_type d) {
121 if (_width==0)
return;
123 if (_coords.x+d>=0) {
124 delta.x=(_coords.x+(std::ptrdiff_t)d)%_width - _coords.x;
125 delta.y=(_coords.x+(std::ptrdiff_t)d)/_width;
127 delta.x=(_coords.x+(std::ptrdiff_t)d*(1-_width))%_width -_coords.x;
128 delta.y=-(_width-_coords.x-(std::ptrdiff_t)d-1)/_width;
136 if (_width==0)
return 0;
137 return (it.y_pos()-_coords.y)*_width + (it.x_pos()-_coords.x);
142 BOOST_ASSERT(_width == it.width());
143 return _coords == it._coords && _p == it._p;
147 std::ptrdiff_t _width;