DGtal 1.4.0
Loading...
Searching...
No Matches
ImageContainerBySTLVector.h
1
17#pragma once
18
36#if defined(ImageContainerBySTLVector_RECURSES)
37#error Recursive header files inclusion detected in ImageContainerBySTLVector.h
38#else // defined(ImageContainerBySTLVector_RECURSES)
40#define ImageContainerBySTLVector_RECURSES
41
42#if !defined ImageContainerBySTLVector_h
44#define ImageContainerBySTLVector_h
45
47// Inclusions
48#include <iostream>
49#include <vector>
50#include "DGtal/base/Common.h"
51#include "DGtal/base/SimpleRandomAccessConstRangeFromPoint.h"
52#include "DGtal/base/SimpleRandomAccessRangeFromPoint.h"
53#include "DGtal/base/CLabel.h"
54#include "DGtal/kernel/domains/CDomain.h"
55#include "DGtal/kernel/SpaceND.h"
56#include "DGtal/kernel/domains/HyperRectDomain.h"
57#include "DGtal/kernel/NumberTraits.h"
58
60
61namespace DGtal
62{
63
64
72 template<typename TImage>
74 {
75
76 public:
77
78 typedef typename TImage::Point Point;
79 typedef typename TImage::Difference Difference;
80
81 public:
82
83 DistanceFunctorFromPoint( const TImage *aImagePtr): myImagePtr(aImagePtr)
84 {};
85
87 {
88 return Difference ( myImagePtr->linearized ( aPoint ) );
89 }
90 private:
91 const TImage *myImagePtr;
92
93 };
94
96 // class ImageContainerBySTLVector
97
124 template <typename TDomain, typename TValue>
125
126 class ImageContainerBySTLVector: public std::vector<TValue>
127 {
128
129 public:
130
132 typedef std::vector<TValue> Parent;
134
137 typedef TDomain Domain;
138 typedef typename Domain::Point Point;
139 typedef typename Domain::Vector Vector;
140 typedef typename Domain::Integer Integer;
141 typedef typename Domain::Size Size;
142 typedef typename Domain::Dimension Dimension;
143 typedef Point Vertex;
144
145 BOOST_STATIC_CONSTANT( Dimension, dimension = Domain::Space::dimension );
146
148 BOOST_STATIC_ASSERT ( ( boost::is_same< Domain,
150
153 typedef TValue Value;
154
156
157 private:
158
161
164
166
167 public:
168
176
184
193
199
200
202
203
213 Value operator() ( const Point & aPoint ) const;
214
223 void setValue ( const Point &aPoint, const Value &aValue );
224
228 const Domain &domain() const;
229
230
234 const Vector &extent() const;
235
240 void translateDomain ( const Vector& aShift );
241
246 void selfDisplay ( std::ostream & out ) const;
247
248
252 bool isValid() const;
253
254 // ------------- realization CDrawableWithBoard2D --------------------
255
259 std::string className() const;
260
261
263 // built-in iterators
264 typedef typename std::vector<Value>::iterator Iterator;
265 typedef typename std::vector<Value>::const_iterator ConstIterator;
266 typedef typename std::vector<Value>::reverse_iterator ReverseIterator;
267 typedef typename std::vector<Value>::const_reverse_iterator ConstReverseIterator;
268 typedef typename std::vector<Value>::difference_type Difference;
269
270 typedef typename std::vector<Value>::iterator OutputIterator;
271 typedef typename std::vector<Value>::reverse_iterator ReverseOutputIterator;
272
276
282
288
293 const Container & container() const { return static_cast<Parent>(*this); };
298 Container & container() { return static_cast<Parent>(*this); };
299
300
302
308 {
309
311
312 public:
313
315 typedef std::bidirectional_iterator_tag iterator_category;
317 typedef ptrdiff_t difference_type;
318 typedef Value* pointer;
319 typedef Value& reference;
320
328 SpanIterator ( const Point & p ,
329 const Dimension aDim ,
331 {
332 myPos = aMap->linearized ( p );
333
334 //We compute the myShift quantity
335 myShift = 1;
336
337 for ( Dimension k = 0; k < myDimension ; k++ )
338 myShift *= aMap->myExtent[k];
339 }
340
341
347 inline
348 void setValue ( const Value aVal )
349 {
350 ( *myMap ) [ myPos ] = aVal;
351 }
352
358 inline
359 const Value & operator*()
360 {
361 return ( *myMap ) [ myPos ];
362 }
363
369 inline
370 bool operator== ( const SpanIterator &it ) const
371 {
372 return ( myPos == it.myPos );
373 }
374
380 inline
381 bool operator!= ( const SpanIterator &it ) const
382 {
383 return ( myPos != it.myPos );
384 }
385
390 inline
391 void next()
392 {
393 myPos += myShift;
394 }
395
400 inline
401 void prev()
402 {
403 ASSERT ( ( long int ) myPos - myShift > 0 );
404 myPos -= myShift;
405 }
406
411 inline
413 {
414 this->next();
415 return *this;
416 }
417
422 inline
424 {
425 SpanIterator tmp = *this;
426 ++*this;
427 return tmp;
428 }
429
434 inline
436 {
437 this->prev();
438 return *this;
439 }
440
445 inline
447 {
448 SpanIterator tmp = *this;
449 --*this;
450 return tmp;
451 }
452
453 private:
456
459
462
465
466 };
467
474 void setValue ( SpanIterator &it, const Value &aValue )
475 {
476 it.setValue ( aValue );
477 }
478
479
489 SpanIterator spanBegin ( const Point &aPoint, const Dimension aDimension )
490 {
491 return SpanIterator ( aPoint, aDimension, this );
492 }
493
504 SpanIterator spanEnd ( const Point &aPoint, const Dimension aDimension )
505 {
506 Point tmp = aPoint;
507 tmp[ aDimension ] = myDomain.upperBound() [ aDimension ] + 1;
508 return SpanIterator ( tmp, aDimension, this );
509 }
510
518 {
519 return ( *it );
520 };
521
522
523
524
530 Size linearized ( const Point &aPoint ) const;
531
532
533
534 };
535
542 template <typename Domain, typename V>
543 inline
544 std::ostream&
545 operator<< ( std::ostream & out, const ImageContainerBySTLVector<Domain, V> & object )
546 {
547 object.selfDisplay ( out );
548 return out;
549 }
550
551} // namespace DGtal
552
553
555// Includes inline functions
556#include "DGtal/images/ImageContainerBySTLVector.ih"
557
558// //
560
561#endif // !defined ImageContainerBySTLVector_h
562
563#undef ImageContainerBySTLVector_RECURSES
564#endif // else defined(ImageContainerBySTLVector_RECURSES)
DistanceFunctorFromPoint(const TImage *aImagePtr)
Difference operator()(const Point &aPoint) const
Aim: Parallelepidec region of a digital space, model of a 'CDomain'.
ImageContainerBySTLVector< Domain, Value > * myMap
Copy of the underlying images.
Dimension myDimension
Dimension on which the iterator must iterate.
SpanIterator(const Point &p, const Dimension aDim, ImageContainerBySTLVector< Domain, Value > *aMap)
ImageContainerBySTLVector(const Domain &aDomain)
std::vector< Value >::const_reverse_iterator ConstReverseIterator
Value operator()(const Point &aPoint) const
BOOST_STATIC_ASSERT((boost::is_same< Domain, HyperRectDomain< typename Domain::Space > >::value))
domain should be rectangular
std::vector< Value >::reverse_iterator ReverseOutputIterator
void setValue(const Point &aPoint, const Value &aValue)
const Vector & extent() const
std::vector< Value >::difference_type Difference
ImageContainerBySTLVector(const ImageContainerBySTLVector &other)
const Domain & domain() const
void selfDisplay(std::ostream &out) const
std::string className() const
BOOST_CONCEPT_ASSERT((concepts::CLabel< TValue >))
range of values
std::vector< Value >::iterator OutputIterator
ImageContainerBySTLVector< TDomain, TValue > Self
std::vector< Value >::const_iterator ConstIterator
std::vector< Value >::iterator Iterator
SpanIterator spanEnd(const Point &aPoint, const Dimension aDimension)
SimpleRandomAccessRangeFromPoint< ConstIterator, Iterator, DistanceFunctorFromPoint< Self > > Range
SimpleRandomAccessConstRangeFromPoint< ConstIterator, DistanceFunctorFromPoint< Self > > ConstRange
ImageContainerBySTLVector & operator=(const ImageContainerBySTLVector &other)
std::vector< Value >::reverse_iterator ReverseIterator
void translateDomain(const Vector &aShift)
void setValue(SpanIterator &it, const Value &aValue)
Vector myExtent
Domain extent (stored for linearization efficiency)
SpanIterator spanBegin(const Point &aPoint, const Dimension aDimension)
Size linearized(const Point &aPoint) const
BOOST_STATIC_CONSTANT(Dimension, dimension=Domain::Space::dimension)
BOOST_CONCEPT_ASSERT((concepts::CDomain< TDomain >))
domain
Aim: model of CConstBidirectionalRangeFromPoint that adapts any range of elements bounded by two iter...
Aim: model of CBidirectionalRangeFromPoint that adapts any range of elements bounded by two iterators...
DGtal is the top-level namespace which contains all DGtal functions and types.
std::ostream & operator<<(std::ostream &out, const ClosedIntegerHalfPlane< TSpace > &object)
Aim: This concept represents a digital domain, i.e. a non mutable subset of points of the given digit...
Definition CDomain.h:130
Aim: Define the concept of DGtal labels. Models of CLabel can be default-constructible,...
Definition CLabel.h:93
const Point aPoint(3, 4)