#include <boost/iterator/iterator_facade.hpp>
+#include <type_traits>
+
namespace boost { namespace gil {
/// \defgroup PixelIteratorModelVirtual position_iterator
/// \ingroup PixelIteratorModel
-/// \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.
-
+/// \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.
-/// \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.
-/// Models: StepIteratorConcept, PixelIteratorConcept, PixelBasedConcept, HasDynamicXStepTypeConcept
+/// \brief An iterator that remembers its current X,Y position and invokes a function object with it upon dereferencing.
+/// Used to create virtual image views.
+/// Models: StepIteratorConcept, PixelIteratorConcept, PixelBasedConcept, HasDynamicXStepTypeConcept
/// \ingroup PixelIteratorModelVirtual PixelBasedModel
-template <typename Deref, // A function object that given a point returns a pixel reference. Models PixelDereferenceAdaptorConcept
- int Dim> // the dimension to advance along
+/// \tparam Deref A function object that given a point returns a pixel reference. Models PixelDereferenceAdaptorConcept
+/// \tparam Dim Dimension to advance along
+template <typename Deref, int Dim>
struct position_iterator : public iterator_facade<position_iterator<Deref,Dim>,
typename Deref::value_type,
std::random_access_iterator_tag,
using type = position_iterator<typename Deref::const_t,Dim>;
};
-template <typename Deref,int Dim>
-struct iterator_is_mutable<position_iterator<Deref,Dim> > : public mpl::bool_<Deref::is_mutable> {
+template <typename Deref, int Dim>
+struct iterator_is_mutable<position_iterator<Deref, Dim>>
+ : std::integral_constant<bool, Deref::is_mutable>
+{
};
/////////////////////////////
struct channel_mapping_type<position_iterator<Deref,Dim> > : public channel_mapping_type<typename Deref::value_type> {};
template <typename Deref,int Dim>
-struct is_planar<position_iterator<Deref,Dim> > : public mpl::false_ {};
+struct is_planar<position_iterator<Deref, Dim>> : std::false_type {};
template <typename Deref,int Dim>
struct channel_type<position_iterator<Deref,Dim> > : public channel_type<typename Deref::value_type> {};