29 #if defined(ArrayImageAdapter_RECURSES)
30 #error Recursive header files inclusion detected in ArrayImageAdapter.h
31 #else // defined(ArrayImageAdapter_RECURSES)
33 #define ArrayImageAdapter_RECURSES
35 #if !defined ArrayImageAdapter_h
37 #define ArrayImageAdapter_h
41 #include <boost/concept/assert.hpp>
42 #include <boost/iterator/iterator_concepts.hpp>
44 #include <type_traits>
46 #include <DGtal/base/Common.h>
47 #include <DGtal/images/CConstImage.h>
48 #include <DGtal/images/ArrayImageIterator.h>
49 #include <DGtal/base/IteratorCompletion.h>
50 #include <DGtal/kernel/domains/Linearizer.h>
68 typename TArrayIterator,
71 class ArrayImageAdapter;
113 typename TArrayIterator,
117 :
public IteratorCompletion< ArrayImageAdapter< TArrayIterator, HyperRectDomain<TSpace> > >
125 using Self = ArrayImageAdapter<TArrayIterator, HyperRectDomain<TSpace> >;
127 using Value =
typename std::iterator_traits<ArrayIterator>::value_type;
128 using Reference =
typename std::iterator_traits<ArrayIterator>::reference;
139 BOOST_STATIC_CONSTANT(
Dimension, dimension = Domain::dimension );
153 : myArrayIterator{
nullptr}
165 : myArrayIterator(anArrayIterator)
166 , myFullDomain{ aFullDomain }
167 , myViewDomain{ aViewDomain }
170 aFullDomain.lowerBound().isLower( aViewDomain.lowerBound() )
171 && aFullDomain.upperBound().isUpper( aViewDomain.upperBound() ),
172 "The viewable domain must be included into the full domain."
184 : ArrayImageAdapter( anArrayIterator, aFullDomain, aFullDomain )
198 : ArrayImageAdapter( other.myArrayIterator, other.myFullDomain, aViewDomain )
228 myFullDomain.isInside(
aPoint),
229 "The point is outside the full domain."
232 return myArrayIterator[ Linearizer::getIndex(
aPoint, myFullDomain) ];
244 myFullDomain.isInside(
aPoint),
245 "The point is outside the full domain."
248 myArrayIterator[ Linearizer::getIndex(
aPoint, myFullDomain) ] = aValue;
268 return Iterator{
this, myFullDomain, myViewDomain };
295 return Iterator{
this, myFullDomain, myViewDomain,
true };
304 return ConstIterator{
this, myFullDomain, myViewDomain,
true };
313 return ConstIterator{
this, myFullDomain, myViewDomain,
true };
328 aFullIndex >= 0 &&
static_cast<typename
Domain::Size>(aFullIndex) < myFullDomain.size(),
329 "linearized index out of bounds !"
331 return myArrayIterator[aFullIndex];
343 aFullIndex >= 0 &&
static_cast<typename
Domain::Size>(aFullIndex) < myFullDomain.size(),
344 "linearized index out of bounds !"
346 return myArrayIterator[aFullIndex];
357 out <<
"[ArrayImageAdapter] with full domain " << myFullDomain <<
" and viewable domain " << myViewDomain;
384 typename TArrayIterator,
390 using Self = ArrayImageAdapter<TArrayIterator, TDomain>;
398 class DistanceFunctor
409 : myDomain( anImage->
domain() )
419 myDomain.isInside(
aPoint),
420 "The point is outside the domain !"
440 typename TArrayIterator,
444 operator<< ( std::ostream & out,
const ArrayImageAdapter<TArrayIterator, TDomain> &
object )
446 object.selfDisplay( out );
461 typename TArrayIterator,
464 ArrayImageAdapter< TArrayIterator, TDomain >
467 return { anArrayIterator, aFullDomain, aViewDomain };
479 typename TArrayIterator,
482 ArrayImageAdapter< TArrayIterator, TDomain >
485 return { anArrayIterator, aFullDomain, aFullDomain };
499 ArrayImageAdapter< decltype( ((TImage*)
nullptr)->begin() ), TDomain >
505 return { anImage.begin(), anImage.domain(), aViewDomain };
520 ArrayImageAdapter< decltype( ((TImage*)
nullptr)->begin() ), TDomain >
526 return { anImage.begin(), anImage.domain(), anImage.domain() };
535 #endif // !defined ArrayImageAdapter_h
537 #undef ArrayImageAdapter_RECURSES
538 #endif // else defined(ArrayImageAdapter_RECURSES)