DGtal  0.6.devel
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Groups Pages
ConstRangeFromPointAdapter.h
1 
17 #pragma once
18 
34 #if defined(ConstRangeFromPointAdapter_RECURSES)
35 #error Recursive header files inclusion detected in ConstRangeFromPointAdapter.h
36 #else // defined(ConstRangeFromPointAdapter_RECURSES)
37 
38 #define ConstRangeFromPointAdapter_RECURSES
39 
40 #if !defined ConstRangeFromPointAdapter_h
41 
42 #define ConstRangeFromPointAdapter_h
43 
45 // Inclusions
46 #include "DGtal/base/BasicFunctors.h"
47 #include "DGtal/base/Circulator.h"
48 #include "DGtal/base/CConstBidirectionalRangeFromPoint.h"
49 #include "DGtal/base/ConstIteratorAdapter.h"
50 #include "boost/concept_check.hpp"
52 
53 namespace DGtal
54 {
55 
56 
58  // class ConstRangeFromPointAdapter
60 
84  template <typename TRange, typename TFunctor, typename TReturnType>
86  {
87 
89 
90  // ------------------------- inner types --------------------------------
91  public:
92 
93  typedef typename TRange::Point Point;
95  typedef std::reverse_iterator<ConstIterator> ConstReverseIterator;
96 
97  // ------------------------- standard services --------------------------------
98 
105  ConstRangeFromPointAdapter(const TRange& aRange,
106  const TFunctor& aFunctor )
107  : myRangePtr(&aRange), myFunctorPtr(&aFunctor) {}
108 
114  : myRangePtr(other.myRangePtr), myFunctorPtr(other.myFunctorPtr) {}
115 
122  {
123  if ( this != &other )
124  {
125  myRangePtr = other.myRangePtr;
126  myFunctorPtr = other.myFunctorPtr;
127  }
128  return *this;
129  }
130 
135 
140  bool isValid() const { return true; }
141 
142 
143  // ------------------------- private data --------------------------------
144  private:
148  const TRange* myRangePtr;
152  const TFunctor* myFunctorPtr;
153 
154  // ------------------------- iterator services --------------------------------
155  public:
156 
162  return ConstIterator( myRangePtr->begin(), *myFunctorPtr );
163  }
164 
169  ConstIterator begin(const Point& aPoint) const {
170  return ConstIterator( myRangePtr->begin(aPoint), *myFunctorPtr );
171  }
172 
177  ConstIterator end() const {
178  return ConstIterator( myRangePtr->end(), *myFunctorPtr );
179  }
180 
186  return ConstReverseIterator(this->end());
187  }
188 
193  ConstReverseIterator rbegin(const Point& aPoint) const {
194  ConstIterator it( myRangePtr->begin(aPoint), *myFunctorPtr );
195  if ( it != this->end() ) ++it;
196  return ConstReverseIterator( it );
197  }
198 
204  return ConstReverseIterator(this->begin());
205  }
206 
207 
208  }; //end class ConstRangeFromPointAdapter
209 
210 } // namespace DGtal
211 
213 
214 
215 #endif // !defined ConstRangeFromPointAdapter_h
216 
217 #undef ConstRangeFromPointAdapter_RECURSES
218 #endif // else defined(ConstRangeFromPointAdapter_RECURSES)