Chris@16: /* Chris@16: Copyright 2005-2007 Adobe Systems Incorporated Chris@16: Chris@16: Use, modification and distribution are subject to the Boost Software License, Chris@16: Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at Chris@16: http://www.boost.org/LICENSE_1_0.txt). Chris@16: Chris@16: See http://opensource.adobe.com/gil for most recent version including documentation. Chris@16: */ Chris@16: Chris@16: /*************************************************************************************************/ Chris@16: Chris@16: #ifndef GIL_POSITION_ITERATOR_HPP Chris@16: #define GIL_POSITION_ITERATOR_HPP Chris@16: Chris@16: //////////////////////////////////////////////////////////////////////////////////////// Chris@16: /// \file Chris@16: /// \brief Locator for virtual image views Chris@16: /// \author Lubomir Bourdev and Hailin Jin \n Chris@16: /// Adobe Systems Incorporated Chris@16: /// \date 2005-2007 \n Last updated on February 12, 2007 Chris@16: /// Chris@16: //////////////////////////////////////////////////////////////////////////////////////// Chris@16: Chris@16: #include Chris@16: #include "locator.hpp" Chris@16: Chris@16: namespace boost { namespace gil { Chris@16: Chris@16: /// \defgroup PixelIteratorModelVirtual position_iterator Chris@16: /// \ingroup PixelIteratorModel Chris@16: /// \brief An iterator that remembers its current X,Y position and invokes a function object with it upon dereferencing. Models PixelIteratorConcept, PixelBasedConcept, HasDynamicXStepTypeConcept. Used to create virtual image views. Chris@16: Chris@16: Chris@16: /// \brief An iterator that remembers its current X,Y position and invokes a function object with it upon dereferencing. Models PixelIteratorConcept. Used to create virtual image views. Chris@16: /// Models: StepIteratorConcept, PixelIteratorConcept, PixelBasedConcept, HasDynamicXStepTypeConcept Chris@16: /// \ingroup PixelIteratorModelVirtual PixelBasedModel Chris@16: template // the dimension to advance along Chris@16: struct position_iterator : public iterator_facade, Chris@16: typename Deref::value_type, Chris@16: std::random_access_iterator_tag, Chris@16: typename Deref::reference, Chris@16: typename Deref::argument_type::template axis::coord_t> { Chris@16: typedef iterator_facade, Chris@16: typename Deref::value_type, Chris@16: std::random_access_iterator_tag, Chris@16: typename Deref::reference, Chris@16: typename Deref::argument_type::template axis::coord_t> parent_t; Chris@16: typedef typename parent_t::difference_type difference_type; Chris@16: typedef typename parent_t::reference reference; Chris@16: typedef typename Deref::argument_type point_t; Chris@16: Chris@16: position_iterator() {} Chris@16: position_iterator(const point_t& p, const point_t& step, const Deref& d) : _p(p), _step(step), _d(d) {} Chris@16: Chris@16: position_iterator(const position_iterator& p) : _p(p._p), _step(p._step), _d(p._d) {} Chris@16: template position_iterator(const position_iterator& p) : _p(p._p), _step(p._step), _d(p._d) {} Chris@16: position_iterator& operator=(const position_iterator& p) { _p=p._p; _d=p._d; _step=p._step; return *this; } Chris@16: Chris@16: const point_t& pos() const { return _p; } Chris@16: const point_t& step() const { return _step; } Chris@16: const Deref& deref_fn() const { return _d; } Chris@16: Chris@16: void set_step(difference_type s) { _step[Dim]=s; } Chris@16: /// For some reason operator[] provided by iterator_adaptor returns a custom class that is convertible to reference Chris@16: /// We require our own reference because it is registered in iterator_traits Chris@16: reference operator[](difference_type d) const { point_t p=_p; p[Dim]+=d*_step[Dim]; return _d(p); } Chris@16: Chris@16: private: Chris@16: point_t _p, _step; Chris@16: Deref _d; Chris@16: Chris@16: template friend struct position_iterator; Chris@16: friend class boost::iterator_core_access; Chris@16: reference dereference() const { return _d(_p); } Chris@16: void increment() { _p[Dim]+=_step[Dim]; } Chris@16: void decrement() { _p[Dim]-=_step[Dim]; } Chris@16: void advance(difference_type d) { _p[Dim]+=d*_step[Dim]; } Chris@16: Chris@16: difference_type distance_to(const position_iterator& it) const { return (it._p[Dim]-_p[Dim])/_step[Dim]; } Chris@16: bool equal(const position_iterator& it) const { return _p==it._p; } Chris@16: }; Chris@16: Chris@16: template Chris@16: struct const_iterator_type > { Chris@16: typedef position_iterator type; Chris@16: }; Chris@16: Chris@16: template Chris@16: struct iterator_is_mutable > : public mpl::bool_ { Chris@16: }; Chris@16: Chris@16: ///////////////////////////// Chris@16: // PixelBasedConcept Chris@16: ///////////////////////////// Chris@16: Chris@16: template Chris@16: struct color_space_type > : public color_space_type {}; Chris@16: Chris@16: template Chris@16: struct channel_mapping_type > : public channel_mapping_type {}; Chris@16: Chris@16: template Chris@16: struct is_planar > : public mpl::false_ {}; Chris@16: Chris@16: template Chris@16: struct channel_type > : public channel_type {}; Chris@16: Chris@16: ///////////////////////////// Chris@16: // HasDynamicXStepTypeConcept Chris@16: ///////////////////////////// Chris@16: Chris@16: template Chris@16: struct dynamic_x_step_type > { Chris@16: typedef position_iterator type; Chris@16: }; Chris@16: Chris@16: } } // namespace boost::gil Chris@16: Chris@16: #endif