DGtal  0.9.4beta
Public Types | Public Member Functions | Protected Member Functions
DGtal::IteratorCompletion< TDerived > Class Template Reference

#include <DGtal/base/IteratorCompletion.h>

Inheritance diagram for DGtal::IteratorCompletion< TDerived >:
[legend]

Public Types

typedef IteratorCompletionTraits< TDerived >::Iterator Iterator
 
typedef IteratorCompletionTraits< TDerived >::ConstIterator ConstIterator
 
typedef IteratorCompletionTraits< TDerived >::DistanceFunctor DistanceFunctor
 
typedef boost::reverse_iterator< IteratorReverseIterator
 
typedef boost::reverse_iterator< ConstIteratorConstReverseIterator
 
typedef SimpleRandomAccessRangeFromPoint< ConstIterator, Iterator, DistanceFunctorRange
 
typedef SimpleRandomAccessConstRangeFromPoint< ConstIterator, DistanceFunctorConstRange
 
typedef std::ptrdiff_t Difference
 

Public Member Functions

ReverseIterator rbegin ()
 
ConstReverseIterator rbegin () const
 
ConstReverseIterator crbegin () const
 
ReverseIterator rend ()
 
ConstReverseIterator rend () const
 
ConstReverseIterator crend () const
 
Range range ()
 
ConstRange constRange () const
 

Protected Member Functions

 ~IteratorCompletion ()
 

Detailed Description

template<typename TDerived>
class DGtal::IteratorCompletion< TDerived >

Aim: Class that uses CRTP to add reverse iterators and ranges to a derived class.

Description of template class 'IteratorCompletionTraits'

This class adds new iterators to a given class if it provides a minimal interface for random-access iterators related to points.

More precisely, it provides:

Each derived class of IteratorCompletion must specialize IteratorCompletionTraits in order to provide enough informations on his iterators, especially a distance functor between a given point and the begin iterator.

Template Parameters
TDerivedType of the derived class (CRTP).

The following snippets illustrate how to use it to easily build a concepts::CImage model from a C-style array (better use ArrayImageAdapter for that purpose).

After common includes:

#include <new>
#include <cstddef>
#include <algorithm>
#include <iostream>
#include <DGtal/base/Common.h>
#include <DGtal/base/IteratorCompletion.h>
#include <DGtal/kernel/domains/HyperRectDomain.h>
#include <DGtal/kernel/domains/Linearizer.h>
#include <DGtal/kernel/SpaceND.h>
#include <DGtal/images/CImage.h>

we start with the head of our class, including typedefs, constructor and destructor:

// A minimal image from a C-style array with reverse-iterators and ranges.
template < typename T, DGtal::Dimension N >
class MyImage
: public DGtal::IteratorCompletion< MyImage<T, N> > // CRTP
{
public:
// Typedefs
typedef MyImage<T, N> Self;
typedef typename DGtal::IteratorCompletionTraits<Self>::Iterator Iterator; // to be coherent with the traits that use IteratorCompletion
typedef T Value; // The image values type
typedef DGtal::SpaceND<N> Space; // The image space type
typedef DGtal::HyperRectDomain<Space> Domain; // The image domain type
typedef typename Space::Point Point; // The associated point type
// Contructor
MyImage( Domain const& aDomain = Domain() )
: myDomain(aDomain), myData( new T[ myDomain.size() ] )
{}
// Destructor
~MyImage()
{
delete[] myData;
}

As you can see, the MyImage class inherits from IteratorCompletion templated with his own type (CRTP). The public inheritance is necessary is order to make visible the methods and typedefs provided by IteratorCompletion.

Then, we add the basic interface needed for images:

// Unary Functor
Value operator() ( Point const& aPoint ) const
{
return myData[ Linearizer::getIndex(aPoint, myDomain) ];
}
// Getter
Value getValue( Point const& aPoint ) const
{
return operator()(aPoint);
}
// Setter
void setValue( Point const& aPoint, Value const& aValue )
{
myData[ Linearizer::getIndex(aPoint, myDomain) ] = aValue;
}
// Returns the associated domain
Domain const& domain() const
{
return myDomain;
}
// Assignability (needed for CImage concept)
Self& operator= ( Self const& other )
{
if ( this != &other )
{
myDomain = other.domain();
delete[] myData;
myData = new Value[ myDomain.size() ];
std::copy( other.begin(), other.end(), begin() );
}
return *this;
}

and the minimal iterator accessors:

// Begin mutable iterator
Iterator begin()
{
return myData;
}
// Begin constant iterator
ConstIterator begin() const
{
return myData;
}
// End mutable iterator
Iterator end()
{
return myData + myDomain.size();
}
// End constant iterator
ConstIterator end() const
{
return myData + myDomain.size();
}

The class is finally closed with the private members:

private:
Domain myDomain;
T* myData;
};

A specialization of IteratorCompletionTraits is needed in order to provide IteratorCompletion with the Iterator and ConstIterator type, and a DistanceFunctor that returns the distance from the begin iterator to a given point (see SimpleRandomAccessRangeFromPoint and SimpleRandomAccessConstRangeFromPoint):

namespace DGtal
{
// Specialization of IteratorCompletionTraits for MyVector
template < typename T, Dimension N >
class IteratorCompletionTraits< MyImage<T, N> >
{
public:
typedef MyImage<T, N> Self;
typedef T* Iterator;
typedef T const* ConstIterator;
{
public:
typedef typename Self::Domain Domain;
typedef typename Self::Point Point;
typedef typename Self::Difference Difference;
DistanceFunctor( Self const* aVector )
: myDomain(aVector->domain())
{}
Difference operator() ( Point const& aPoint ) const
{
return Self::Linearizer::getIndex( aPoint, myDomain );
}
private:
Domain myDomain;
};
};
}

We have now a concepts::CImage model that can be used like any image:

using namespace std;
// Typedefs
typedef MyImage<double, 2> My2DImage;
typedef My2DImage::Value Value;
typedef My2DImage::Domain Domain;
typedef My2DImage::Point Point;
// Checks CImage concept
BOOST_CONCEPT_ASSERT( (DGtal::concepts::CImage<My2DImage>) );
// Construction
My2DImage image( Domain( Point(0,0), Point(2,3) ) );
// Filling
Value i = 0;
for ( My2DImage::Iterator it = image.begin(), it_end = image.end() ; it != it_end; ++it )
{
*it = ++i;
}
// Modifying a value
image.setValue( Point(1,1), -1 );
// Forward reading using range
My2DImage::ConstRange range = image.constRange();
copy( range.begin(), range.end(), ostream_iterator<Value>( cout, " " ) );
cout << endl;
// Backward reading using reverse iterators
copy( image.rbegin(), image.rend(), ostream_iterator<Value>( cout, " " ) );
cout << endl;
See also
ArrayImageAdapter.h
exampleIteratorCompletion.cpp

Definition at line 116 of file IteratorCompletion.h.

Member Typedef Documentation

template<typename TDerived>
typedef IteratorCompletionTraits<TDerived>::ConstIterator DGtal::IteratorCompletion< TDerived >::ConstIterator

Constant iterator type.

Definition at line 121 of file IteratorCompletion.h.

Constant range type.

Definition at line 127 of file IteratorCompletion.h.

template<typename TDerived>
typedef boost::reverse_iterator<ConstIterator> DGtal::IteratorCompletion< TDerived >::ConstReverseIterator

Constant reverse iterator type.

Definition at line 125 of file IteratorCompletion.h.

template<typename TDerived>
typedef std::ptrdiff_t DGtal::IteratorCompletion< TDerived >::Difference

Type of the distance between two iterators.

Definition at line 128 of file IteratorCompletion.h.

template<typename TDerived>
typedef IteratorCompletionTraits<TDerived>::DistanceFunctor DGtal::IteratorCompletion< TDerived >::DistanceFunctor

Type of the functor calculating the distance between iterators.

Definition at line 122 of file IteratorCompletion.h.

template<typename TDerived>
typedef IteratorCompletionTraits<TDerived>::Iterator DGtal::IteratorCompletion< TDerived >::Iterator

Mutable iterator type.

Definition at line 120 of file IteratorCompletion.h.

Mutable range type.

Definition at line 126 of file IteratorCompletion.h.

template<typename TDerived>
typedef boost::reverse_iterator<Iterator> DGtal::IteratorCompletion< TDerived >::ReverseIterator

Mutable reverse iterator type.

Definition at line 124 of file IteratorCompletion.h.

Constructor & Destructor Documentation

template<typename TDerived>
DGtal::IteratorCompletion< TDerived >::~IteratorCompletion ( )
inlineprotected

Protected destructor to avoid memory leak.

Definition at line 224 of file IteratorCompletion.h.

225  {}

Member Function Documentation

template<typename TDerived>
ConstRange DGtal::IteratorCompletion< TDerived >::constRange ( ) const
inline
Returns
a constant range over the derived class values.
Warning
the derived class must have begin() and end() methods that return constant random-access iterators.
In addition, the class must provide a distance functor to a point.

Definition at line 211 of file IteratorCompletion.h.

212  {
213  TDerived const* const derived = static_cast<TDerived const*>(this);
214  return ConstRange(
215  derived->begin(),
216  derived->end(),
217  typename IteratorCompletionTraits<TDerived>::DistanceFunctor( derived )
218  );
219  }
SimpleRandomAccessConstRangeFromPoint< ConstIterator, DistanceFunctor > ConstRange
Constant range type.
template<typename TDerived>
ConstReverseIterator DGtal::IteratorCompletion< TDerived >::crbegin ( ) const
inline
Returns
a constant reverse-iterator pointing to the last value (C++11).
Warning
the derived class must have a cend() method that returns a constant bidirectional iterator.

Definition at line 154 of file IteratorCompletion.h.

155  {
156  return ConstReverseIterator( static_cast<TDerived*>(this)->cend() );
157  }
boost::reverse_iterator< ConstIterator > ConstReverseIterator
Constant reverse iterator type.
template<typename TDerived>
ConstReverseIterator DGtal::IteratorCompletion< TDerived >::crend ( ) const
inline
Returns
a constant reverse-iterator pointing before the first value (C++11).
Warning
the derived class must have a cbegin() method that returns a constant bidirectional iterator.

Definition at line 184 of file IteratorCompletion.h.

185  {
186  return ConstReverseIterator( static_cast<TDerived*>(this)->cbegin() );
187  }
boost::reverse_iterator< ConstIterator > ConstReverseIterator
Constant reverse iterator type.
template<typename TDerived>
Range DGtal::IteratorCompletion< TDerived >::range ( )
inline
Returns
a mutable range over the derived class values.
Warning
the derived class must have begin() and end() methods that return mutable random-access iterators.
In addition, the class must provide a distance functor to a point.

Definition at line 195 of file IteratorCompletion.h.

196  {
197  TDerived* const derived = static_cast<TDerived*>(this);
198  return Range(
199  derived->begin(),
200  derived->end(),
201  typename IteratorCompletionTraits<TDerived>::DistanceFunctor( derived )
202  );
203  }
SimpleRandomAccessRangeFromPoint< ConstIterator, Iterator, DistanceFunctor > Range
Mutable range type.
template<typename TDerived>
ReverseIterator DGtal::IteratorCompletion< TDerived >::rbegin ( )
inline
Returns
a mutable reverse-iterator pointing to the last value.
Warning
the derived class must have a end() method that returns a mutable bidirectional iterator.

Definition at line 134 of file IteratorCompletion.h.

135  {
136  return ReverseIterator( static_cast<TDerived*>(this)->end() );
137  }
boost::reverse_iterator< Iterator > ReverseIterator
Mutable reverse iterator type.
template<typename TDerived>
ConstReverseIterator DGtal::IteratorCompletion< TDerived >::rbegin ( ) const
inline
Returns
a constant reverse-iterator pointing to the last value.
Warning
the derived class must have a end() method that returns a constant bidirectional iterator.

Definition at line 144 of file IteratorCompletion.h.

145  {
146  return ConstReverseIterator( static_cast<TDerived*>(this)->end() );
147  }
boost::reverse_iterator< ConstIterator > ConstReverseIterator
Constant reverse iterator type.
template<typename TDerived>
ReverseIterator DGtal::IteratorCompletion< TDerived >::rend ( )
inline
Returns
a mutable reverse-iterator pointing before the first value.
Warning
the derived class must have a begin() method that returns a mutable bidirectional iterator.

Definition at line 164 of file IteratorCompletion.h.

165  {
166  return ReverseIterator( static_cast<TDerived*>(this)->begin() );
167  }
boost::reverse_iterator< Iterator > ReverseIterator
Mutable reverse iterator type.
template<typename TDerived>
ConstReverseIterator DGtal::IteratorCompletion< TDerived >::rend ( ) const
inline
Returns
a constant reverse-iterator pointing before the first value.
Warning
the derived class must have a begin() method that returns a constant bidirectional iterator.

Definition at line 174 of file IteratorCompletion.h.

175  {
176  return ConstReverseIterator( static_cast<TDerived*>(this)->begin() );
177  }
boost::reverse_iterator< ConstIterator > ConstReverseIterator
Constant reverse iterator type.

The documentation for this class was generated from the following file: