DGtal 1.4.0
Loading...
Searching...
No Matches
DGtal::HyperRectDomain_subIterator< TPoint > Class Template Reference

#include <DGtal/kernel/domains/HyperRectDomain_Iterator.h>

Inheritance diagram for DGtal::HyperRectDomain_subIterator< TPoint >:
[legend]

Public Types

using Point = TPoint
 
using Self = HyperRectDomain_subIterator<TPoint>
 
using Dimension = typename Point::Dimension
 
using DifferenceType = typename std::iterator_traits<Self>::difference_type
 Type of the difference between two iterators (usually std::ptrdiff_t except for BigInteger).
 

Public Member Functions

 HyperRectDomain_subIterator (const TPoint &p, const TPoint &lower, const TPoint &upper, const std::vector< Dimension > &subDomain)
 

Private Member Functions

const Pointdereference () const
 Dereference.
 
bool equal (const Self &other) const
 Compare iterators.
 
void increment ()
 Increments the iterator in order to scan the domain points dimension by dimension (by using the subDomain order given by the user).
 
void decrement ()
 Decrements the iterator in order to scan the domain points dimension by dimension (by using the subDomain order given by the user).
 
void advance (DifferenceType const &n)
 Advances the iterator in order to scan the domain points dimension by dimension (by using the subDomain order given by the user).
 
DifferenceType distance_to (const Self &other) const
 Distance between two iterators on the same domain (by using the subDomain order given by the user).
 

Private Attributes

TPoint myPoint
 Current Point in the domain.
 
TPoint mylower
 Copies of the Domain limits.
 
TPoint myupper
 
std::vector< DimensionmySubDomain
 
DifferenceType pos
 Iterator position in the current sequence.
 

Friends

class boost::iterator_core_access
 

Detailed Description

template<typename TPoint>
class DGtal::HyperRectDomain_subIterator< TPoint >

Description of class 'HyperRectDomain_subIterator'

Aim:

Definition at line 316 of file HyperRectDomain_Iterator.h.

Member Typedef Documentation

◆ DifferenceType

template<typename TPoint >
using DGtal::HyperRectDomain_subIterator< TPoint >::DifferenceType = typename std::iterator_traits<Self>::difference_type

Type of the difference between two iterators (usually std::ptrdiff_t except for BigInteger).

Definition at line 333 of file HyperRectDomain_Iterator.h.

◆ Dimension

template<typename TPoint >
using DGtal::HyperRectDomain_subIterator< TPoint >::Dimension = typename Point::Dimension

Definition at line 332 of file HyperRectDomain_Iterator.h.

◆ Point

template<typename TPoint >
using DGtal::HyperRectDomain_subIterator< TPoint >::Point = TPoint

Definition at line 330 of file HyperRectDomain_Iterator.h.

◆ Self

template<typename TPoint >
using DGtal::HyperRectDomain_subIterator< TPoint >::Self = HyperRectDomain_subIterator<TPoint>

Definition at line 331 of file HyperRectDomain_Iterator.h.

Constructor & Destructor Documentation

◆ HyperRectDomain_subIterator()

template<typename TPoint >
DGtal::HyperRectDomain_subIterator< TPoint >::HyperRectDomain_subIterator ( const TPoint & p,
const TPoint & lower,
const TPoint & upper,
const std::vector< Dimension > & subDomain )
inline

Definition at line 335 of file HyperRectDomain_Iterator.h.

338 : myPoint( p ), mylower( lower ), myupper( upper )
339 {
340 ASSERT_MSG( // For an empty domain, lower = upper + diag(1) so that begin() == end().
341 lower.isLower(upper) || lower == upper + TPoint::diagonal(0).partialCopy( TPoint::diagonal(1), subDomain ),
342 "The lower bound must be lower than the upper bound or, for an empty domain, be equal to the upper bound + diagonal(1)."
343 );
344
345 ASSERT_MSG(
346 ( lower.isLower(p) && p.isLower(upper) ) || p == lower || p == upper,
347 "The point must be inside the domain or be equal to one of his bound."
348 );
349
350 ASSERT_MSG(
351 subDomain.size() <= TPoint::dimension,
352 "The sub-range cannot have more dimensions than the ambiant space."
353 );
354
355 mySubDomain.reserve( subDomain.size() );
356 for ( typename std::vector<Dimension>::const_iterator it = subDomain.begin();
357 it != subDomain.end(); ++it )
358 {
359 ASSERT_MSG(
360 *it <= TPoint::dimension,
361 "Invalid dimension in the sub-range."
362 );
363 mySubDomain.push_back( *it );
364 }
365
366 // Calculating iterator position in the sequence
367 pos = 0;
368 DifferenceType delta = 1;
369 for ( Dimension i = 0; i < mySubDomain.size(); ++i )
370 {
371 auto const ii = mySubDomain[i];
372 pos += delta * (myPoint[ii] - mylower[ii]);
373 delta *= myupper[ii] - mylower[ii] + 1;
374 }
375 }
TPoint mylower
Copies of the Domain limits.
DifferenceType pos
Iterator position in the current sequence.
typename std::iterator_traits< Self >::difference_type DifferenceType
Type of the difference between two iterators (usually std::ptrdiff_t except for BigInteger).
TPoint myPoint
Current Point in the domain.
Vector lower(const Vector &z, unsigned int k)
Vector upper(const Vector &z, unsigned int k)

References lower(), DGtal::HyperRectDomain_subIterator< TPoint >::mylower, DGtal::HyperRectDomain_subIterator< TPoint >::myPoint, DGtal::HyperRectDomain_subIterator< TPoint >::mySubDomain, DGtal::HyperRectDomain_subIterator< TPoint >::myupper, DGtal::HyperRectDomain_subIterator< TPoint >::pos, and upper().

Member Function Documentation

◆ advance()

template<typename TPoint >
void DGtal::HyperRectDomain_subIterator< TPoint >::advance ( DifferenceType const & n)
inlineprivate

Advances the iterator in order to scan the domain points dimension by dimension (by using the subDomain order given by the user).

Definition at line 441 of file HyperRectDomain_Iterator.h.

442 {
443 pos += n;
444 if (n > 0)
445 {
446 myPoint[mySubDomain[0]] += n;
447 for ( Dimension i = 0; myPoint[mySubDomain[i]] > myupper[mySubDomain[i]] && i < mySubDomain.size() - 1; ++i )
448 {
449 auto const ii = mySubDomain[i];
450 typename Point::Component const shift = myPoint[ii] - mylower[ii];
451 typename Point::Component const length = myupper[ii] - mylower[ii] + 1;
452 myPoint[mySubDomain[i+1]] += shift / length;
453 myPoint[ii] = mylower[ii] + (shift % length);
454 }
455 }
456 else if (n < 0)
457 {
458 myPoint[mySubDomain[0]] += n;
459 for ( Dimension i = 0; myPoint[mySubDomain[i]] < mylower[mySubDomain[i]] && i < mySubDomain.size() - 1; ++i )
460 {
461 auto const ii = mySubDomain[i];
462 typename Point::Component const shift = myupper[ii] - myPoint[ii];
463 typename Point::Component const length = myupper[ii] - mylower[ii] + 1;
464 myPoint[mySubDomain[i+1]] -= shift / length;
465 myPoint[ii] = myupper[ii] - (shift % length);
466 }
467 }
468 }

References DGtal::HyperRectDomain_subIterator< TPoint >::mylower, DGtal::HyperRectDomain_subIterator< TPoint >::myPoint, DGtal::HyperRectDomain_subIterator< TPoint >::mySubDomain, DGtal::HyperRectDomain_subIterator< TPoint >::myupper, and DGtal::HyperRectDomain_subIterator< TPoint >::pos.

◆ decrement()

template<typename TPoint >
void DGtal::HyperRectDomain_subIterator< TPoint >::decrement ( )
inlineprivate

Decrements the iterator in order to scan the domain points dimension by dimension (by using the subDomain order given by the user).

Definition at line 426 of file HyperRectDomain_Iterator.h.

427 {
428 --pos;
429 --myPoint[mySubDomain[0]];
430 for ( Dimension i = 0; myPoint[mySubDomain[i]] < mylower[mySubDomain[i]] && i < mySubDomain.size() - 1; ++i )
431 {
432 --myPoint[mySubDomain[i+1]];
434 }
435 }

References DGtal::HyperRectDomain_subIterator< TPoint >::mylower, DGtal::HyperRectDomain_subIterator< TPoint >::myPoint, DGtal::HyperRectDomain_subIterator< TPoint >::mySubDomain, DGtal::HyperRectDomain_subIterator< TPoint >::myupper, and DGtal::HyperRectDomain_subIterator< TPoint >::pos.

◆ dereference()

template<typename TPoint >
const Point & DGtal::HyperRectDomain_subIterator< TPoint >::dereference ( ) const
inlineprivate

Dereference.

Definition at line 381 of file HyperRectDomain_Iterator.h.

382 {
383 ASSERT_MSG( // we must be between [begin,end]
384 mylower.isLower(myPoint) && myPoint.isLower(myupper),
385 "The iterator points outside the domain."
386 );
387
388 return myPoint;
389
390 }

References DGtal::HyperRectDomain_subIterator< TPoint >::mylower, DGtal::HyperRectDomain_subIterator< TPoint >::myPoint, and DGtal::HyperRectDomain_subIterator< TPoint >::myupper.

◆ distance_to()

template<typename TPoint >
DifferenceType DGtal::HyperRectDomain_subIterator< TPoint >::distance_to ( const Self & other) const
inlineprivate

Distance between two iterators on the same domain (by using the subDomain order given by the user).

Definition at line 474 of file HyperRectDomain_Iterator.h.

475 {
476 ASSERT_MSG( // we should only compare iterators on the same domain and same dimensions
477 mylower == other.mylower && myupper == other.myupper && mySubDomain == other.mySubDomain,
478 "The compared iterators iterate on different domains or different dimensions."
479 );
480
481 return other.pos - pos;
482 }

References DGtal::HyperRectDomain_subIterator< TPoint >::mylower, DGtal::HyperRectDomain_subIterator< TPoint >::mySubDomain, DGtal::HyperRectDomain_subIterator< TPoint >::myupper, and DGtal::HyperRectDomain_subIterator< TPoint >::pos.

◆ equal()

template<typename TPoint >
bool DGtal::HyperRectDomain_subIterator< TPoint >::equal ( const Self & other) const
inlineprivate

Compare iterators.

Note
compare only the pointed point, not the iterated domain.

Definition at line 396 of file HyperRectDomain_Iterator.h.

397 {
398 ASSERT_MSG( // we should only compare iterators on the same domain and same dimensions
399 mylower == other.mylower && myupper == other.myupper && mySubDomain == other.mySubDomain,
400 "The compared iterators iterate on different domains or different dimensions."
401 );
402
403 return pos == other.pos;
404 }

References DGtal::HyperRectDomain_subIterator< TPoint >::mylower, DGtal::HyperRectDomain_subIterator< TPoint >::mySubDomain, DGtal::HyperRectDomain_subIterator< TPoint >::myupper, and DGtal::HyperRectDomain_subIterator< TPoint >::pos.

◆ increment()

template<typename TPoint >
void DGtal::HyperRectDomain_subIterator< TPoint >::increment ( )
inlineprivate

Increments the iterator in order to scan the domain points dimension by dimension (by using the subDomain order given by the user).

Definition at line 411 of file HyperRectDomain_Iterator.h.

412 {
413 ++pos;
414 ++myPoint[mySubDomain[0]];
415 for ( Dimension i = 0; myPoint[mySubDomain[i]] > myupper[mySubDomain[i]] && i < mySubDomain.size() - 1; ++i )
416 {
417 ++myPoint[mySubDomain[i+1]];
419 }
420 }

References DGtal::HyperRectDomain_subIterator< TPoint >::mylower, DGtal::HyperRectDomain_subIterator< TPoint >::myPoint, DGtal::HyperRectDomain_subIterator< TPoint >::mySubDomain, DGtal::HyperRectDomain_subIterator< TPoint >::myupper, and DGtal::HyperRectDomain_subIterator< TPoint >::pos.

Friends And Related Symbol Documentation

◆ boost::iterator_core_access

template<typename TPoint >
friend class boost::iterator_core_access
friend

Definition at line 378 of file HyperRectDomain_Iterator.h.

Field Documentation

◆ mylower

◆ myPoint

◆ mySubDomain

◆ myupper

◆ pos


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