13 #ifndef GIL_VIRTUAL_LOCATOR_HPP
14 #define GIL_VIRTUAL_LOCATOR_HPP
25 #include <boost/iterator/iterator_facade.hpp>
28 namespace boost {
namespace gil {
33 template <
typename Deref,
bool IsTransposed>
40 typedef Deref deref_fn_t;
43 typedef typename parent_t::coord_t coord_t;
44 typedef typename parent_t::x_coord_t x_coord_t;
45 typedef typename parent_t::y_coord_t y_coord_t;
49 template <
typename NewDeref>
struct add_deref {
58 : _p(loc.pos(),
point_t(loc.step().x,loc.step().y*y_step), loc.deref_fn()) {}
59 template <
typename D,
bool TR> virtual_2d_locator(
const virtual_2d_locator<D,TR>& loc, coord_t x_step, coord_t y_step,
bool transpose=
false)
60 : _p(loc.pos(), transpose ?
61 point_t(loc.step().x*y_step,loc.step().y*x_step) :
62 point_t(loc.step().x*x_step,loc.step().y*y_step), loc.deref_fn()) { assert(transpose==(IsTransposed!=TR));}
65 virtual_2d_locator(
const virtual_2d_locator& pl) : _p(pl._p) {}
67 bool operator==(
const this_t& p)
const {
return _p==p._p; }
71 x_iterator const& x()
const {
return *gil_reinterpret_cast_c<x_iterator const*>(
this); }
75 y_coord_t y_distance_to(
const this_t& it2, x_coord_t)
const {
return (it2.pos()[1-IsTransposed] - pos()[1-IsTransposed])/step()[1-IsTransposed]; }
76 bool is_1d_traversable(x_coord_t)
const {
return false; }
79 const point_t& pos()
const {
return _p.pos(); }
80 const point_t& step()
const {
return _p.step(); }
81 const deref_fn_t& deref_fn()
const {
return _p.deref_fn(); }
83 template <
typename D,
bool TR>
friend class virtual_2d_locator;
91 template <
typename D,
bool TR>
92 struct channel_type<
virtual_2d_locator<D,TR> > :
public channel_type<typename virtual_2d_locator<D,TR>::parent_t> {
95 template <
typename D,
bool TR>
96 struct color_space_type<virtual_2d_locator<D,TR> > :
public color_space_type<typename virtual_2d_locator<D,TR>::parent_t> {
99 template <
typename D,
bool TR>
100 struct channel_mapping_type<virtual_2d_locator<D,TR> > :
public channel_mapping_type<typename virtual_2d_locator<D,TR>::parent_t> {
103 template <
typename D,
bool TR>
104 struct is_planar<virtual_2d_locator<D,TR> > :
public is_planar<typename virtual_2d_locator<D,TR>::parent_t> {
111 template <
typename D,
bool TR>
112 struct dynamic_x_step_type<virtual_2d_locator<D,TR> > {
113 typedef virtual_2d_locator<D,TR> type;
120 template <
typename D,
bool TR>
121 struct dynamic_y_step_type<virtual_2d_locator<D,TR> > {
122 typedef virtual_2d_locator<D,TR> type;
129 template <
typename D,
bool IsTransposed>
130 struct transposed_type<virtual_2d_locator<D,IsTransposed> > {
131 typedef virtual_2d_locator<D,1-IsTransposed> type;
base class for models of PixelLocatorConceptPixel locator is similar to a pixel iterator, but allows for 2D navigation of pixels within an image view. It has a 2D difference_type and supports random access operations like:
Definition: locator.hpp:118
An iterator that remembers its current X,Y position and invokes a function object with it upon derefe...
Definition: position_iterator.hpp:40
A 2D locator over a virtual image. Upon dereferencing, invokes a given function object passing it its...
Definition: virtual_locator.hpp:34
Locator for virtual image views.
Composes two dereference function objects. Similar to std::unary_compose but needs to pull some typed...
Definition: utilities.hpp:196
2D point both axes of which have the same dimension typeModels: Point2DConcept
Definition: gil_concept.hpp:52