DGtal  0.6.devel
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Groups Pages
ImageContainerBySTLVector.ih
1 
35 
36 // IMPLEMENTATION of inline methods.
38 
40 #include <cstdlib>
41 #include "DGtal/images/ImageContainerBySTLVector.h"
43 
44 //------------------------------------------------------------------------------
45 template <typename Domain, typename T>
46 inline
47 ImageContainerBySTLVector<Domain, T>::
48 ImageContainerBySTLVector(const Domain &aDomain ) :
49  myDomain(aDomain), myExtent(aDomain.extent())
50 {
51  this->resize( myDomain.size() );
52 }
53 
54 //------------------------------------------------------------------------------
55 template <typename Domain, typename T>
56 inline
59  : vector<T>(other),
60  myDomain(other.myDomain), myExtent(other.myExtent)
61 {
62 }
63 //------------------------------------------------------------------------------
64 template <typename Domain, typename T>
65 inline
69 {
70  if (this != &other)
71  {
72  std::vector<T>::operator=(other);
73  myDomain = other.myDomain;
74  myExtent = other.myExtent;
75  }
76  return *this;
77 }
78 
79 
80 //------------------------------------------------------------------------------
81 template <typename Domain, typename T>
82 inline
84 {
85 }
86 
87 
88 //------------------------------------------------------------------------------
89 template <typename Domain, typename T>
90 inline
91 T
93 {
94  ASSERT(this->domain().isInside(aPoint));
95  return this->operator[](linearized( aPoint ) );
96 }
97 
98 //------------------------------------------------------------------------------
99 // template <typename Domain, typename T>
100 // inline
101 // typename ImageContainerBySTLVector<Domain, T>::ConstIterator
102 // ImageContainerBySTLVector<Domain, T>::begin(const Point &aPoint) const
103 // {
104 // ASSERT(this->domain().isInside(aPoint));
105 // return this->begin() + linearized( aPoint );
106 // }
107 
108 
109 //------------------------------------------------------------------------------
110 template <typename Domain, typename T>
111 inline
112 void
114 {
115  ASSERT(this->domain().isInside(aPoint));
116  this->operator[](linearized( aPoint )) = V;
117 }
118 
119 //------------------------------------------------------------------------------
120 template <typename Domain, typename T>
121 inline
124 {
125  return myDomain;
126 }
127 
128 //------------------------------------------------------------------------------
129 template <typename Domain, typename T>
130 inline
133 {
134  return ConstRange( this->begin(), this->end(), DistanceFunctorFromPoint<Self>(this));
135 }
136 
137 //------------------------------------------------------------------------------
138 template <typename Domain, typename T>
139 inline
142 {
143  return Range ( this->begin(), this->end(), DistanceFunctorFromPoint<Self>(this) );
144 }
145 //------------------------------------------------------------------------------
146 template <typename Domain, typename T>
147 inline
150 {
151  return myExtent;
152 }
153 
154 //------------------------------------------------------------------------------
155 template <typename Domain, typename T>
156 inline
157 void
159 {
160  myDomain = Domain(myDomain.lowerBound()+aShift, myDomain.upperBound()+aShift);
161 }
162 
163 //------------------------------------------------------------------------------
164 template <typename TDomain, typename V>
165 inline
166 void
168 {
169  out << "[Image - STLVector] size=" << this->size() << " valuetype="
170  << sizeof(V) << "bytes Domain=" << myDomain;
171 }
172 
173 //------------------------------------------------------------------------------
174 template <typename Domain, typename T>
175 inline
176 bool
178 {
179  return (this != NULL);
180 }
181 
182 
183 //------------------------------------------------------------------------------
184 template <typename D, typename V>
185 inline
186 std::string
188 {
189  return "ImageContainerBySTLVector";
190 }
191 
193 // Helper classes defined in the compilation unit (anonymous namespace)
194 
195 namespace
196 {
197 
206  template < typename Domain, int dimension>
207  struct linearizer
208  {
209 
210  typedef typename Domain::Point Point;
211  typedef typename Domain::Size Size;
212 
222  static Size apply( const Point & aPoint, const Point & lowerBound,
223  const Point & extent )
224  {
225  Size pos = aPoint[ 0 ] - lowerBound[ 0 ] ;
226  Size multiplier = 1;
227  for (typename Domain::Dimension k = 1 ; k < dimension ; ++k)
228  {
229  multiplier *= extent[ k-1 ];
230  pos += multiplier * ( aPoint[ k ] - lowerBound[ k ] );
231  }
232  return pos;
233  }
234  };
235 
240  template < typename Domain >
241  struct linearizer< Domain, 1 >
242  {
243  typedef typename Domain::Point Point;
244  typedef typename Domain::Size Size;
245 
246  static Size apply( const Point & aPoint,
247  const Point & lowerBound,
248  const Point & /*extent*/ )
249  {
250  return aPoint[ 0 ] - lowerBound[ 0 ];
251  }
252  };
253 
258  template < typename Domain >
259  struct linearizer< Domain, 2 >
260  {
261  typedef typename Domain::Point Point;
262  typedef typename Domain::Size Size;
263 
264  static Size apply( const Point & aPoint,
265  const Point & lowerBound,
266  const Point & extent )
267  {
268  return ( aPoint[ 0 ] - lowerBound[ 0 ] ) + extent[ 0 ] *
269  (aPoint[ 1 ] - lowerBound[ 1 ] );
270  }
271  };
272 
277  template < typename Domain >
278  struct linearizer< Domain, 3 >
279  {
280  typedef typename Domain::Point Point;
281  typedef typename Domain::Size Size;
282 
283  static Size apply( const Point & aPoint,
284  const Point & lowerBound,
285  const Point & extent )
286  {
287  Size res = aPoint[ 0 ] - lowerBound[ 0 ];
288  Size multiplier = extent[ 0 ];
289  res += multiplier * ( aPoint[ 1 ] - lowerBound[ 1 ] );
290  multiplier *= extent[ 1 ];
291  res += multiplier * ( aPoint[ 2 ] - lowerBound[ 2 ] );
292  return res;
293  }
294  };
295 }
296 
297 
298 
300 // Internals - private :
301 template<typename Domain, typename T>
302 inline
303 typename ImageContainerBySTLVector<Domain, T>::Size
305 {
306  return linearizer<Domain, Domain::dimension >::apply( aPoint,
307  myDomain.lowerBound(),
308  myExtent );
309 }
310 
311 
312