DGtal  0.6.devel
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Groups Pages
Signal.ih
1 
30 
31 #include <cstdlib>
32 #include <iomanip>
34 
35 
37 // class SignalData<TValue>
39 
43 template <typename TValue>
44 inline
46  : data( 0 )
47 {}
48 
57 template <typename TValue>
58 inline
59 void
61 ( unsigned int s, int z, bool p, const Value & def )
62 {
63  if ( data != 0 ) delete[] data;
64  size = s; zero = z; periodic = p;
65  data = new TValue[ size + 1 ];
66  data[ size ] = def;
67 }
68 
78 template <typename TValue>
79 inline
80 void
82 ( const Value* t, unsigned int s, int z, bool p, const Value& def )
83 {
84  if ( data != 0 ) delete[] data;
85  size = s; zero = z; periodic = p;
86  data = new TValue[ size + 1 ];
87  for ( unsigned int i = 0; i < size; ++i, ++t )
88  data[ i ] = *t;
89  data[ size ] = def;
90 }
91 
92 
101 template <typename TValue>
102 inline
104 ( unsigned int s, int z, bool p, const Value & def )
105  : size( s ), zero( z ), periodic( p )
106 {
107  data = new TValue[ size + 1 ];
108  data[ size ] = def;
109 }
110 
120 template <typename TValue>
121 inline
123 ( const TValue* t, unsigned int s, int z, bool p, const Value & def )
124  : size( s ), zero( z ), periodic( p )
125 {
126  data = new TValue[ size + 1 ];
127  for ( unsigned int i = 0; i < size; ++i )
128  data[ i ] = *t++;
129  data[ size ] = def;
130 }
131 
132 
136 template <typename TValue>
137 inline
139 {
140  if ( data != 0 ) delete[] data;
141 }
142 
147 template <typename TValue>
148 inline
150 ( const SignalData & other )
151  : size( other.size ), zero( other.zero ), periodic( other.periodic )
152 {
153  if ( other.data != 0 )
154  {
155  data = new TValue[ size + 1 ];
156  for ( unsigned int i = 0; i <= size; ++i )
157  data[ i ] = other.data[ i ];
158  }
159  else
160  data = 0;
161 }
162 
168 template <typename TValue>
169 inline
172 ( const SignalData & other )
173 {
174  if ( this != &other )
175  {
176  if ( other.data == 0 )
177  {
178  if ( data != 0 )
179  delete[] data;
180  data = 0;
181  }
182  else
183  {
184  if ( size < other.size )
185  {
186  delete[] data;
187  data = new TValue[ other.size + 1 ];
188  }
189  size = other.size;
190  zero = other.zero;
191  periodic = other.periodic;
192  for ( unsigned int i = 0; i <= size; ++i )
193  data[ i ] = other.data[ i ];
194  }
195  }
196  return *this;
197 }
198 
199 
204 template <typename TValue>
205 inline
206 const TValue &
208 {
209  ASSERT( data != 0 );
210  return data[ size ];
211 }
212 
213 
214 
216 // IMPLEMENTATION of inline methods.
218 
220 // ----------------------- Standard services ------------------------------
221 
222 
224 // class Signal
226 
229 template <typename TValue>
230 inline
232  : m_data( 0 )
233 {
234 }
235 
243 template <typename TValue>
244 inline
246 ( unsigned int asize, int z, bool periodic, const TValue & def )
247  : m_data( new SignalData<TValue>() )
248 {
249  m_data->init( asize, z, periodic, def );
250 }
251 
252 
261 template <typename TValue>
262 inline
264 ( const TValue* t, unsigned int asize, int z, bool periodic,
265  const TValue & def )
266  : m_data( new SignalData<TValue>() )
267 {
268  m_data->init( t, asize, z, periodic, def );
269 }
270 
271 
272 
276 template <typename TValue>
277 inline
279 {
280 }
281 
287 template <typename TValue>
288 inline
290  : m_data( other.m_data )
291 {
292 }
293 
300 template <typename TValue>
301 inline
304 {
305  if ( this != & other )
306  m_data = other.m_data;
307  return *this;
308 
309 }
310 
311 
319 template <typename TValue>
320 inline
321 void
323 ( unsigned int aSize, int z, bool periodic, const TValue & def )
324 {
326  m_data->init( aSize, z, periodic, def );
327 }
328 
329 
338 template <typename TValue>
339 inline
340 void
342 ( const TValue* t, unsigned int aSize, int z, bool periodic,
343  const TValue & def )
344 {
346  m_data->init( t, aSize, z, periodic, def );
347 }
348 
349 
350 
354 template <typename TValue>
355 unsigned int
357 {
358  return m_data->size;
359 }
360 
361 
363 // ----------------------- Signal services ----------------------------
364 
365 
374 template <typename TValue>
375 TValue &
377 {
378  SignalData<TValue> & sd = *m_data;
379  int idx = i + sd.zero;
380  if ( ( idx >= 0 ) && ( idx < (int) sd.size ) )
381  return sd.data[ idx ];
382  else if ( sd.periodic )
383  {
384  idx = idx - ( idx / (int) sd.size ) * sd.size;
385  return sd.data[ ( idx + sd.size ) % sd.size ];
386  }
387  else
388  return sd.data[ sd.size ];
389 }
390 
399 template <typename TValue>
400 const TValue &
402 {
403  const SignalData<TValue> & sd = *m_data;
404  int idx = i + sd.zero;
405  if ( ( idx >= 0 ) && ( idx < (int) sd.size ) )
406  return sd.data[ idx ];
407  else if ( sd.periodic )
408  {
409  idx = idx - ( idx / (int) sd.size ) * sd.size;
410  return sd.data[ ( idx + sd.size ) % sd.size ];
411  }
412  else
413  return sd.data[ sd.size ];
414 }
415 
416 
422 template <typename TValue>
423 void
424 DGtal::Signal<TValue>::setAll( const TValue & val )
425 {
426  SignalData<TValue> & sd = *m_data;
427  for ( unsigned int i = 0; i <= sd.size; ++i )
428  sd.data[ i ] = val;
429 }
430 
431 
439 template <typename TValue>
440 void
442 {
443  SignalData<TValue> & sd = *m_data;
444  for ( unsigned int i = 0; i <= sd.size; ++i )
445  sd.data[ i ] *= l;
446 }
447 
448 
457 template <typename TValue>
460 {
461  const SignalData<TValue>& Fd = *m_data;
462  const SignalData<TValue>& Gd = *G.m_data;
463 
464 
465  unsigned int aSize = Fd.periodic ? Fd.size : Fd.size + Gd.size - 1;
466  int zero = Fd.periodic ? Fd.zero : Fd.zero + Gd.zero;
467  Signal<TValue> FG( aSize, zero, Fd.periodic, Fd.defaut() );
468  SignalData<TValue>& FGd = *FG.m_data;
469 
470  if ( Fd.periodic )
471  {
472  for ( int a = 0; a < (int) FGd.size; ++a )
473  {
474  TValue sum = TValue( 0 );
475  for ( unsigned int i = 0; i < Gd.size; ++i )
476  {
477  sum += this->operator[]( a - ( i - Gd.zero ) )
478  * Gd.data[ i ];
479  }
480  FG[ a ] = sum;
481  }
482  }
483  else
484  {
485  for ( unsigned int a = 0; a < FGd.size; ++a )
486  {
487  TValue sum = TValue( 0 );
488  for ( unsigned int i = 0; i < Gd.size; ++i )
489  {
490  sum += this->operator[]( a - ( Fd.zero + Gd.zero )
491  - ( i - Gd.zero ) )
492  * Gd.data[ i ];
493  }
494  FGd.data[ a ] = sum;
495  }
496  }
497  return FG;
498 }
499 
500 
501 
502 template <typename TValue>
505 {
506  Signal<TValue> G = H2();
507  G.multiply( 0.25 );
508  return G;
509 }
510 
514 template <typename TValue>
517 {
518  Signal<TValue> H( 3, 1, false, TValue( 0 ) );
519  H[ -1 ] = 1;
520  H[ 0 ] = 2;
521  H[ 1 ] = 1;
522  return H;
523 }
524 
528 template <typename TValue>
531 {
532  Signal<TValue> D( 2, 0, false, TValue( 0 ) );
533  D[ 0 ] = -1;
534  D[ 1 ] = 1;
535  return D;
536 }
537 
538 template <typename TValue>
540 DGtal::Signal<TValue>::G2n( unsigned int n )
541 {
542  if ( n <= 1 ) return G2();
543  else return G2n( n - 1 ) * G2();
544 }
545 
549 template <typename TValue>
551 DGtal::Signal<TValue>::H2n( unsigned int n )
552 {
553  if ( n <= 1 ) return H2();
554  else return H2n( n - 1 ) * H2();
555 }
556 
560 template <typename TValue>
562 DGtal::Signal<TValue>::D2n( unsigned int n )
563 {
564  return H2n( n ) * Delta();
565 }
566 
567 
569 // Interface - public :
570 
575 template <typename TValue>
576 inline
577 void
578 DGtal::Signal<TValue>::selfDisplay ( std::ostream & out ) const
579 {
580  out << "[Signal" << std::fixed << std::setprecision( 5 );
581  for ( unsigned int i = 0; i < size(); ++i )
582  out << " " << ( ( i == (unsigned int) m_data->zero ) ? "*" : "" )
583  << m_data->data[ i ];
584  out << " ]";
585 }
586 
591 template <typename TValue>
592 inline
593 bool
595 {
596  return true;
597 }
598 
599 
600 
602 // Implementation of inline functions //
603 
604 template <typename TValue>
605 inline
606 std::ostream&
607 DGtal::operator<< ( std::ostream & out,
608  const Signal<TValue> & object )
609 {
610  object.selfDisplay( out );
611  return out;
612 }
613 
614 // //
616 
617