Loading [MathJax]/extensions/MathMenu.js
DGtal 2.0.0
DGtal::Circulator< TIterator > Class Template Reference

Aim: Provides an adapter for classical iterators that can iterate through the underlying data structure as in a loop. The increment (resp. decrement) operator encapsulates the validity test and the assignement to the begin (resp. end) iterator of a given range, when the end (resp. beginning) has been reached. For instance, the pre-increment operator does: More...

#include <DGtal/base/Circulator.h>

Inheritance diagram for DGtal::Circulator< TIterator >:
[legend]

Public Types

typedef TIterator Iterator
typedef Circulator< TIterator > Self
typedef CirculatorType Type
typedef boost::iterator_category< TIterator >::type iterator_category
typedef std::iterator_traits< TIterator >::value_type value_type
typedef std::iterator_traits< TIterator >::difference_type difference_type
typedef std::iterator_traits< TIterator >::pointer pointer
typedef std::iterator_traits< TIterator >::reference reference

Public Member Functions

 Circulator ()
 Circulator (const Iterator &i, const Iterator &itb, const Iterator &ite)
 ~Circulator ()
 Circulator (const Circulator &other)
template<typename other_Iterator>
 Circulator (const Circulator< other_Iterator > &other)
Circulatoroperator= (const Circulator &other)
template<typename other_Iterator>
Circulatoroperator= (const Circulator< other_Iterator > &other)
bool isValid () const
Iterator base () const
Iterator begin () const
Iterator end () const
reference operator* () const
pointer operator-> () const
Selfoperator++ ()
Self operator++ (int)
Selfoperator-- ()
Self operator-- (int)
bool operator== (const Self &other) const
bool operator!= (const Self &other) const
template<typename OtherIterator>
bool operator== (const OtherIterator &other) const
template<typename OtherIterator>
bool operator!= (const OtherIterator &other) const
Selfoperator+= (difference_type d)
Selfoperator-= (difference_type d)
Self operator+ (difference_type d) const
Self operator- (difference_type d) const
difference_type operator- (const Self &c) const
reference operator[] (difference_type d) const
bool operator< (const Self &) const
bool operator<= (const Self &) const
bool operator> (const Self &c) const
bool operator>= (const Self &c) const

Protected Attributes

Iterator myCurrentIt
Iterator myBeginIt
Iterator myEndIt
bool myFlagIsValid

Private Member Functions

 BOOST_STATIC_ASSERT ((boost::is_same< typename IteratorCirculatorTraits< TIterator >::Type, IteratorType >::value))

Detailed Description

template<typename TIterator>
class DGtal::Circulator< TIterator >

Aim: Provides an adapter for classical iterators that can iterate through the underlying data structure as in a loop. The increment (resp. decrement) operator encapsulates the validity test and the assignement to the begin (resp. end) iterator of a given range, when the end (resp. beginning) has been reached. For instance, the pre-increment operator does:

Description of template class 'Circulator'

return *this;
Iterator myCurrentIt
Definition Circulator.h:430

whereas the pre-decrement operator does (if at least bidirectional):

Be aware that random access operators are quite different for circular iterators and classical iterators. Firstly, the difference between two circular iterators c and d is always positive and such that (c-d) + (d-c) is equal to the size of the underlying range. Secondly, comparison operators 'less than' and 'less than or equal to' always return 'true', whereas 'greater than' and 'greater than or equal to' always return 'false'.

Template Parameters
TIteratorany forward, bidirectional or random access iterator
Examples
geometry/curves/exampleAlphaThickSegmentTgtCover.cpp.

Definition at line 85 of file Circulator.h.

Member Typedef Documentation

◆ difference_type

template<typename TIterator>
typedef std::iterator_traits<TIterator>::difference_type DGtal::Circulator< TIterator >::difference_type

Definition at line 104 of file Circulator.h.

◆ Iterator

template<typename TIterator>
typedef TIterator DGtal::Circulator< TIterator >::Iterator

Definition at line 95 of file Circulator.h.

◆ iterator_category

template<typename TIterator>
typedef boost::iterator_category<TIterator>::type DGtal::Circulator< TIterator >::iterator_category

Definition at line 101 of file Circulator.h.

◆ pointer

template<typename TIterator>
typedef std::iterator_traits<TIterator>::pointer DGtal::Circulator< TIterator >::pointer

Definition at line 105 of file Circulator.h.

◆ reference

template<typename TIterator>
typedef std::iterator_traits<TIterator>::reference DGtal::Circulator< TIterator >::reference

Definition at line 106 of file Circulator.h.

◆ Self

template<typename TIterator>
typedef Circulator<TIterator> DGtal::Circulator< TIterator >::Self

Definition at line 96 of file Circulator.h.

◆ Type

template<typename TIterator>
typedef CirculatorType DGtal::Circulator< TIterator >::Type

Definition at line 98 of file Circulator.h.

◆ value_type

template<typename TIterator>
typedef std::iterator_traits<TIterator>::value_type DGtal::Circulator< TIterator >::value_type

Definition at line 103 of file Circulator.h.

Constructor & Destructor Documentation

◆ Circulator() [1/4]

template<typename TIterator>
DGtal::Circulator< TIterator >::Circulator ( )
inline

Default constructor. Default-initializes iterator members NB: not valid

Definition at line 118 of file Circulator.h.

118: myCurrentIt(), myBeginIt(), myEndIt(), myFlagIsValid(false) {}

◆ Circulator() [2/4]

template<typename TIterator>
DGtal::Circulator< TIterator >::Circulator ( const Iterator & i,
const Iterator & itb,
const Iterator & ite )
inline

Constructor. This object can iterate through the underlying data structure as in a loop, because it knows the begin and end iterator of the range.

Parameters
iany iterator
itbbegin iterator
iteend iterator

Definition at line 129 of file Circulator.h.

133 { if (myBeginIt == myEndIt) myFlagIsValid = false; }
Aim: Provides an adapter for classical iterators that can iterate through the underlying data structu...
Definition Circulator.h:86

◆ ~Circulator()

template<typename TIterator>
DGtal::Circulator< TIterator >::~Circulator ( )
inline

Destructor.

Definition at line 138 of file Circulator.h.

138{}

◆ Circulator() [3/4]

template<typename TIterator>
DGtal::Circulator< TIterator >::Circulator ( const Circulator< TIterator > & other)
inline

Copy constructor.

Parameters
otherthe object to clone.

Definition at line 144 of file Circulator.h.

◆ Circulator() [4/4]

template<typename TIterator>
template<typename other_Iterator>
DGtal::Circulator< TIterator >::Circulator ( const Circulator< other_Iterator > & other)
inline

Copy of circulators that adapts other iterator types (not const / const).

Parameters
otherthe object to clone.

Definition at line 155 of file Circulator.h.

156 : myCurrentIt(other.base()),
159 {}
bool isValid() const
Definition Circulator.h:206
Iterator base() const
Definition Circulator.h:216
Iterator end() const
Definition Circulator.h:228
Iterator begin() const
Definition Circulator.h:222

Member Function Documentation

◆ base()

template<typename TIterator>
Iterator DGtal::Circulator< TIterator >::base ( ) const
inline
Returns
member [myCurrentIt], the underlying iterator.

Definition at line 216 of file Circulator.h.

217 { return myCurrentIt; }

Referenced by basicForwardTest(), main(), DGtal::Circulator< ConstIterator >::operator=(), and DGtal::Circulator< ConstIterator >::operator==().

◆ begin()

template<typename TIterator>
Iterator DGtal::Circulator< TIterator >::begin ( ) const
inline
Returns
member [myBeginIt], begin iterator of the underlying range.

Definition at line 222 of file Circulator.h.

223 { return myBeginIt; }

Referenced by basicForwardTest(), DGtal::Circulator< ConstIterator >::operator=(), and DGtal::Circulator< ConstIterator >::operator==().

◆ BOOST_STATIC_ASSERT()

template<typename TIterator>
DGtal::Circulator< TIterator >::BOOST_STATIC_ASSERT ( (boost::is_same< typename IteratorCirculatorTraits< TIterator >::Type, IteratorType >::value) )
private

◆ end()

template<typename TIterator>
Iterator DGtal::Circulator< TIterator >::end ( ) const
inline
Returns
member [myEndIt], end iterator of the underlying range.

Definition at line 228 of file Circulator.h.

229 { return myEndIt; }

Referenced by basicForwardTest(), DGtal::Circulator< ConstIterator >::operator=(), and DGtal::Circulator< ConstIterator >::operator==().

◆ isValid()

◆ operator!=() [1/2]

template<typename TIterator>
template<typename OtherIterator>
bool DGtal::Circulator< TIterator >::operator!= ( const OtherIterator & other) const
inline

Definition at line 334 of file Circulator.h.

334{ return !(*this == other); }

◆ operator!=() [2/2]

template<typename TIterator>
bool DGtal::Circulator< TIterator >::operator!= ( const Self & other) const
inline

Definition at line 317 of file Circulator.h.

317{ return !(*this == other); }

◆ operator*()

template<typename TIterator>
reference DGtal::Circulator< TIterator >::operator* ( ) const
inline
Returns
*myCurrentIt.

Definition at line 234 of file Circulator.h.

235 {
236 //ASSERT( myCurrentIt != myEndIt ); //myCurrentIt == myEndIt when using reverse iterators on circulators
237 ASSERT( isValid() );
238 return *myCurrentIt;
239 }

◆ operator+()

template<typename TIterator>
Self DGtal::Circulator< TIterator >::operator+ ( difference_type d) const
inline

Definition at line 377 of file Circulator.h.

378 {
379 Self tmp = *this;
380 return tmp += d;
381 }
Circulator< TIterator > Self
Definition Circulator.h:96

◆ operator++() [1/2]

template<typename TIterator>
Self & DGtal::Circulator< TIterator >::operator++ ( )
inline

Pre-increment

Definition at line 258 of file Circulator.h.

259 {
260 ASSERT( isValid() );
261 ++myCurrentIt;
263 return *this;
264 }

Referenced by DGtal::Circulator< ConstIterator >::operator++().

◆ operator++() [2/2]

template<typename TIterator>
Self DGtal::Circulator< TIterator >::operator++ ( int )
inline

Post-increment

Definition at line 269 of file Circulator.h.

270 {
271 Self tmp = *this;
272 operator++();
273 return tmp;
274 }
Self & operator++()
Definition Circulator.h:258

◆ operator+=()

template<typename TIterator>
Self & DGtal::Circulator< TIterator >::operator+= ( difference_type d)
inline

Definition at line 340 of file Circulator.h.

341 {
342 if ( isValid() )
343 {
344 //size range
346 ASSERT( n > 0 );
347 //difference modulo n
348 if ( (d >= n)||(-d >= n) )
349 d = d%n;
350 ASSERT( (d < n)&&(-d < n) );
351 //position of the current iterator
353 ASSERT( (j >= 0) && (j < n) );
354 //deviation between the position of the past-the-end value
355 //and the current iterator
356 typename Iterator::difference_type e = n - j;
357 if (d >= 0)
358 { //in case of positive distance
359 if (d < e) j += d;
360 else j = d - e;
361 }
362 else
363 { //in case of negative distance
364 if (-d <= j) j += d;
365 else j = j + d + n;
366 }
367 ASSERT( (j >= 0) && (j < n) );
369 return *this;
370 }
371 else
372 return *this;
373 }

Referenced by DGtal::Circulator< ConstIterator >::operator-=().

◆ operator-() [1/2]

template<typename TIterator>
difference_type DGtal::Circulator< TIterator >::operator- ( const Self & c) const
inline

Definition at line 389 of file Circulator.h.

390 {
392 if (d >= 0)
393 return d;
394 else
395 {
397 ASSERT( n > 0 );
398 return (n + d);
399 }
400 }

◆ operator-() [2/2]

template<typename TIterator>
Self DGtal::Circulator< TIterator >::operator- ( difference_type d) const
inline

Definition at line 383 of file Circulator.h.

384 {
385 Self tmp = *this;
386 return tmp += -d;
387 }

◆ operator--() [1/2]

template<typename TIterator>
Self & DGtal::Circulator< TIterator >::operator-- ( )
inline

Pre-decrement

Definition at line 280 of file Circulator.h.

281 {
282 ASSERT( isValid() );
284 --myCurrentIt;
285 return *this;
286 }

Referenced by DGtal::Circulator< ConstIterator >::operator--().

◆ operator--() [2/2]

template<typename TIterator>
Self DGtal::Circulator< TIterator >::operator-- ( int )
inline

Post-decrement

Definition at line 291 of file Circulator.h.

292 {
293 Self tmp = *this;
294 operator--();
295 return tmp;
296 }
Self & operator--()
Definition Circulator.h:280

◆ operator-=()

template<typename TIterator>
Self & DGtal::Circulator< TIterator >::operator-= ( difference_type d)
inline

Definition at line 375 of file Circulator.h.

375{ return operator+=( -d); }
Self & operator+=(difference_type d)
Definition Circulator.h:340

◆ operator->()

template<typename TIterator>
pointer DGtal::Circulator< TIterator >::operator-> ( ) const
inline
Returns
pointer to myCurrentIt

Definition at line 244 of file Circulator.h.

245 {
246 //ASSERT( myCurrentIt != myEndIt ); //myCurrentIt == myEndIt when using reverse iterators on circulators
247 ASSERT( isValid() );
248 return myCurrentIt.operator->();
249 }

◆ operator<()

template<typename TIterator>
bool DGtal::Circulator< TIterator >::operator< ( const Self & ) const
inline

Definition at line 409 of file Circulator.h.

410 {
411 return true;
412 }

◆ operator<=()

template<typename TIterator>
bool DGtal::Circulator< TIterator >::operator<= ( const Self & ) const
inline

Definition at line 413 of file Circulator.h.

414 {
415 return true;
416 }

Referenced by DGtal::Circulator< ConstIterator >::operator>().

◆ operator=() [1/2]

template<typename TIterator>
Circulator & DGtal::Circulator< TIterator >::operator= ( const Circulator< TIterator > & other)
inline

Assignment.

Parameters
otherthe object to copy.
Returns
a reference on 'this'.

Definition at line 166 of file Circulator.h.

167 {
168 if ( this != &other )
169 {
173 if (myBeginIt != myEndIt)
174 myFlagIsValid = true;
175 else
176 myFlagIsValid = false;
177 }
178 return *this;
179 }

◆ operator=() [2/2]

template<typename TIterator>
template<typename other_Iterator>
Circulator & DGtal::Circulator< TIterator >::operator= ( const Circulator< other_Iterator > & other)
inline

Assignment that adapts other iterator types (not const / const).

Parameters
otherthe object to copy.
Returns
a reference on 'this'.

Definition at line 187 of file Circulator.h.

188 {
189 if ( this != &other )
190 {
193 myEndIt = other.end();
194 if (myBeginIt != myEndIt)
195 myFlagIsValid = true;
196 else
197 myFlagIsValid = false;
198 }
199 return *this;
200 }

◆ operator==() [1/2]

template<typename TIterator>
template<typename OtherIterator>
bool DGtal::Circulator< TIterator >::operator== ( const OtherIterator & other) const
inline

Definition at line 320 of file Circulator.h.

321 {
322 return ( ( (!isValid())&&(!other.isValid()) )
323 ||
324 ( ( isValid() && other.isValid())
325 &&
326 ( (myBeginIt == other.begin())
327 &&(myEndIt == other.end())
328 &&(myCurrentIt == other.base())
329 )
330 )
331 );
332 }

◆ operator==() [2/2]

template<typename TIterator>
bool DGtal::Circulator< TIterator >::operator== ( const Self & other) const
inline

Definition at line 304 of file Circulator.h.

305 {
306 return ( ( (!isValid())&&(!other.isValid()) )
307 ||
308 ( ( isValid() && other.isValid())
309 &&
310 ( (myBeginIt == other.begin())
311 &&(myEndIt == other.end())
312 &&(myCurrentIt == other.base())
313 )
314 )
315 );
316 }

◆ operator>()

template<typename TIterator>
bool DGtal::Circulator< TIterator >::operator> ( const Self & c) const
inline

Definition at line 417 of file Circulator.h.

418 {
419 return !operator<=(c);
420 }
bool operator<=(const Self &) const
Definition Circulator.h:413

Referenced by DGtal::Circulator< ConstIterator >::operator>=().

◆ operator>=()

template<typename TIterator>
bool DGtal::Circulator< TIterator >::operator>= ( const Self & c) const
inline

Definition at line 421 of file Circulator.h.

422 {
423 return !operator>(c);
424 }
bool operator>(const Self &c) const
Definition Circulator.h:417

◆ operator[]()

template<typename TIterator>
reference DGtal::Circulator< TIterator >::operator[] ( difference_type d) const
inline

Definition at line 401 of file Circulator.h.

402 {
403 Self tmp = *this;
404 tmp += d;
405 return *tmp;
406 }

Field Documentation

◆ myBeginIt

template<typename TIterator>
Iterator DGtal::Circulator< TIterator >::myBeginIt
protected

Definition at line 431 of file Circulator.h.

Referenced by DGtal::Circulator< ConstIterator >::operator=().

◆ myCurrentIt

template<typename TIterator>
Iterator DGtal::Circulator< TIterator >::myCurrentIt
protected

◆ myEndIt

template<typename TIterator>
Iterator DGtal::Circulator< TIterator >::myEndIt
protected

Definition at line 432 of file Circulator.h.

Referenced by DGtal::Circulator< ConstIterator >::operator=().

◆ myFlagIsValid

template<typename TIterator>
bool DGtal::Circulator< TIterator >::myFlagIsValid
protected

Definition at line 433 of file Circulator.h.


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