cisst-saw
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
vctFixedSizeVector.h
Go to the documentation of this file.
1 /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2 /* ex: set filetype=cpp softtabstop=4 shiftwidth=4 tabstop=4 cindent expandtab: */
3 
4 /*
5 
6  Author(s): Ofri Sadowsky, Anton Deguet
7  Created on: 2003-08-18
8 
9  (C) Copyright 2003-2007 Johns Hopkins University (JHU), All Rights
10  Reserved.
11 
12 --- begin cisst license - do not edit ---
13 
14 This software is provided "as is" under an open source license, with
15 no warranty. The complete license can be found in license.txt and
16 http://www.cisst.org/cisst/license.txt.
17 
18 --- end cisst license ---
19 */
20 
21 #pragma once
22 #ifndef _vctFixedSizeVector_h
23 #define _vctFixedSizeVector_h
24 
31 
51 template <class _elementType, vct::size_type _size>
53  _size, 1, _elementType,
54  typename vctFixedSizeVectorTraits<_elementType, _size, 1>::array
55  >
56 {
57  public:
58  /* define most types from vctContainerTraits */
59  VCT_CONTAINER_TRAITS_TYPEDEFS(_elementType);
60 
65  /* no need to document, inherit doxygen documentation from
66  vctFixedSizeVectorBase */
69  typedef typename BaseType::CopyType CopyType;
71  typedef class cmnTypeTraits<value_type> TypeTraits;
73 
74  enum {SIZEMINUSONE = _size - 1};
75 
76  public:
79  {}
80 
84  explicit inline vctFixedSizeVector(const value_type & value) {
85  this->SetAll(value);
86  }
87 
93  template <class __elementType, stride_type __stride, class __dataPtrType>
94  explicit inline
96  this->Assign(vector);
97  }
98 
100 
103  template <stride_type __stride>
104  inline
106  this->Assign(vector);
107  }
108 
109  template <stride_type __stride>
110  inline
112  this->Assign(vector);
113  }
115 
120  template <stride_type __stride, class __dataPtrType>
121  inline
123  // vctFixedSizeVector(const vctFixedSizeConstVectorBase<_size-1, __stride, _elementType, __dataPtrType> & vector, value_type lastElement) {
124  this->ConcatenationOf(vector, lastElement);
125  }
126 
130  template<class __elementType>
131  explicit inline
132  vctFixedSizeVector(const __elementType * elements)
133  {
134  this->Assign(elements);
135  }
136 
146  template <class __vectorOwnerType>
148  {
149  this->Assign(vector);
150  }
151 
172 
174  inline vctFixedSizeVector(const value_type & element0, const value_type & element1) {
175  CMN_ASSERT(_size == 2);
176  (*this)[0] = element0;
177  (*this)[1] = element1;
178  }
179 
181  inline vctFixedSizeVector(const value_type & element0, const value_type & element1,
182  const value_type & element2) {
183  CMN_ASSERT(_size == 3);
184  (*this)[0] = element0;
185  (*this)[1] = element1;
186  (*this)[2] = element2;
187  }
188 
190  inline vctFixedSizeVector(const value_type & element0, const value_type & element1,
191  const value_type & element2, const value_type & element3) {
192  CMN_ASSERT(_size == 4);
193  (*this)[0] = element0;
194  (*this)[1] = element1;
195  (*this)[2] = element2;
196  (*this)[3] = element3;
197  }
198 
211  inline vctFixedSizeVector(const value_type element0, const value_type element1,
212  const value_type element2, const value_type element3, const value_type element4, ...)
213  {
214  CMN_ASSERT(_size > 4);
215  (*this)[0] = element0;
216  (*this)[1] = element1;
217  (*this)[2] = element2;
218  (*this)[3] = element3;
219  (*this)[4] = element4;
220  va_list nextArg;
221  va_start(nextArg, element4);
222  for (index_type i = 5; i < _size; ++i) {
223  (*this).at(i) = value_type( va_arg(nextArg, ElementVaArgPromotion) );
224  }
225  va_end(nextArg);
226  }
227 
229 
230 
237  inline ThisType & operator = (const ThisType & other) {
238  return reinterpret_cast<ThisType &>(this->Assign(other));
239  }
240 
241  template <stride_type __stride, class __elementType, class __dataPtrType>
243  return reinterpret_cast<ThisType &>(this->Assign(other));
244  }
245 
246  template <stride_type __stride>
248  return reinterpret_cast<ThisType &>(this->Assign(other));
249  }
250 
251  template <stride_type __stride, class __elementType>
253  this->Assign(other);
254  return *this;
255  }
257 
259  inline ThisType & operator = (const value_type & value) {
260  this->SetAll(value);
261  return *this;
262  }
263 
266  bool FromStreamRaw(std::istream & inputStream, const char delimiter = ' ')
267  {
268  _elementType temp[_size];
269  size_type index;
270  bool valid = true;
271  for (index = 0; index < _size; index++) {
272  inputStream >> temp[index]; // assumes that operator >> is defined for _elementType
273  if (inputStream.fail()) {
274  valid = false;
275  inputStream.clear();
276  break;
277  }
278  // Now, look for the delimiter
279  if (!isspace(delimiter)) {
280  if (index < _size-1) {
281  char c;
282  inputStream >> c;
283  if (c != delimiter) {
284  valid = false;
285  break;
286  }
287  }
288  }
289  }
290  if (valid) {
291  // Only update the object if the parsing was successful for all elements.
292  for (index = 0; index < _size; index++)
293  (*this)[index] = temp[index];
294  }
295  return valid;
296  }
297 
299  void DeSerializeRaw(std::istream & inputStream)
300  {
301  size_type index;
302  const size_type mySize = this->size();
303  for (index = 0; index < mySize; ++index) {
304  cmnDeSerializeRaw(inputStream, this->Element(index));
305  }
306  }
307 
308 };
309 
310 
317 template <vct::size_type _size, vct::stride_type _vector1Stride, class _vector1Data,
318  vct::stride_type _vector2Stride, class _vector2Data, class _elementType>
322 {
324  result.SumOf(vector1, vector2);
325  return result;
326 }
327 
328 /* documented above */
329 template <vct::size_type _size, vct::stride_type _vector1Stride, class _vector1Data,
330  vct::stride_type _vector2Stride, class _vector2Data, class _elementType>
334 {
336  result.DifferenceOf(vector1, vector2);
337  return result;
338 }
339 
341 
342 
347 template <vct::stride_type _vector1Stride, class _vector1Data,
348  vct::stride_type _vector2Stride, class _vector2Data, class _elementType>
352 {
354  result.CrossProductOf(vector1, vector2);
355  return result;
356 }
357 
358 
363 template <vct::stride_type _vector1Stride, class _vector1Data,
364  vct::stride_type _vector2Stride, class _vector2Data, class _elementType>
368 {
370  result.CrossProductOf(vector1, vector2);
371  return result;
372 }
373 
374 
381 template <vct::size_type _size, vct::stride_type _stride, class _elementType, class _dataPtrType>
384  const _elementType & scalar)
385 {
387  result.SumOf(vector, scalar);
388  return result;
389 }
390 
391 /* documented above */
392 template <vct::size_type _size, vct::stride_type _stride, class _elementType, class _dataPtrType>
395  const _elementType & scalar)
396 {
398  result.DifferenceOf(vector, scalar);
399  return result;
400 }
401 
402 /* documented above */
403 template <vct::size_type _size, vct::stride_type _stride, class _elementType, class _dataPtrType>
406  const _elementType & scalar)
407 {
409  result.ProductOf(vector, scalar);
410  return result;
411 }
412 
413 /* documented above */
414 template <vct::size_type _size, vct::stride_type _stride, class _elementType, class _dataPtrType>
417  const _elementType & scalar)
418 {
420  result.RatioOf(vector, scalar);
421  return result;
422 }
424 
425 
432 template <vct::size_type _size, vct::stride_type _stride, class _elementType, class _dataPtrType>
434 operator + (const _elementType & scalar,
436 
437 {
439  result.SumOf(scalar, vector);
440  return result;
441 }
442 
443 /* documented above */
444 template <vct::size_type _size, vct::stride_type _stride, class _elementType, class _dataPtrType>
446 operator - (const _elementType & scalar,
448 {
450  result.DifferenceOf(scalar, vector);
451  return result;
452 }
453 
454 /* documented above */
455 template <vct::size_type _size, vct::stride_type _stride, class _elementType, class _dataPtrType>
457 operator * (const _elementType & scalar,
459 {
461  result.ProductOf(scalar, vector);
462  return result;
463 }
464 
465 /* documented above */
466 template <vct::size_type _size, vct::stride_type _stride, class _elementType, class _dataPtrType>
468 operator / (const _elementType & scalar,
470 {
472  result.RatioOf(scalar, vector);
473  return result;
474 }
476 
477 
484 template <vct::size_type _size, vct::stride_type _stride, class _elementType, class _dataPtrType>
487 {
489  result.NegationOf(vector);
490  return result;
491 }
493 
494 
498 #ifndef SWIG // SWIG 1.3.22 doesn't like _size1 + _size2 for the template "instantiation" of vector
499 template <vct::size_type _size1, vct::stride_type _stride1, class _elementType, class _dataPtr1,
500  vct::size_type _size2, vct::stride_type _stride2, class _dataPtr2>
504 {
507  vctFixedSizeVectorRef<_elementType, _size2, 1> subvector2(result.Pointer(_size1));
508  subvector1.Assign(vector1);
509  subvector2.Assign(vector2);
510 
511  return result;
512 }
513 #endif
514 
515 
516 /*
517  Methods declared previously and implemented here because they require vctFixedSizeVector
518 */
519 
520 #ifndef DOXYGEN
521 
522 /* documented in class vctFixedSizeConstVectorBase */
523 template <vct::size_type _size, vct::stride_type _stride, class _elementType, class _dataPtrType>
528  VoVi<typename vctUnaryOperations<_elementType>::AbsValue>::
529  Unfold(result, *this);
530  return result;
531 }
532 
533 /* documented in class vctFixedSizeConstVectorBase */
534 template <vct::size_type _size, vct::stride_type _stride, class _elementType, class _dataPtrType>
539  VoVi<typename vctUnaryOperations<_elementType>::Negation>::
540  Unfold(result, *this);
541  return result;
542 }
543 
544 /* documented in class vctFixedSizeConstVectorBase */
545 template <vct::size_type _size, vct::stride_type _stride, class _elementType, class _dataPtrType>
550  VoVi<typename vctUnaryOperations<_elementType>::Floor>::
551  Unfold(result, *this);
552  return result;
553 }
554 
555 /* documented in class vctFixedSizeConstVectorBase */
556 template <vct::size_type _size, vct::stride_type _stride, class _elementType, class _dataPtrType>
561  VoVi<typename vctUnaryOperations<_elementType>::Ceil>::
562  Unfold(result, *this);
563  return result;
564 }
565 
566 /* documented in class vctFixedSizeConstVectorBase */
567 template <vct::size_type _size, vct::stride_type _stride, class _elementType, class _dataPtrType>
571  result.NormalizedSelf();
572  return result;
573 }
574 
575 /* documented in class vctFixedSizeConstVectorBase */
576 template <vct::size_type _size,
577  vct::stride_type _stride, class _dataPtrType,
578  vct::stride_type __stride, class __dataPtrType,
579  class _elementType,
580  class _elementOperationType>
586  VoViVi<_elementOperationType>::Unfold(result, vector1, vector2);
587  return result;
588 }
589 
590 /* documented in class vctFixedSizeConstVectorBase */
591 template<vct::size_type _size,
592  vct::stride_type _stride, class _dataPtrType,
593  class _elementType,
594  class _elementOperationType>
597  const _elementType & scalar) {
600  VoViSi<_elementOperationType>::Unfold(result, vector, scalar);
601  return result;
602 }
603 
604 #endif // DOXYGEN
605 
606 #endif // _vctFixedSizeVector_h
607 
size_t index_type
Definition: vctContainerTraits.h:36
vctFixedSizeVectorBase< _size, 1, _elementType, typename VectorTraits::array > BaseType
Definition: vctFixedSizeVector.h:68
vctFixedSizeVectorTraits< _elementType, _size, 1 > VectorTraits
Definition: vctFixedSizeVector.h:64
vctFixedSizeVector(const vctFixedSizeConstVectorRef< _elementType, _size, __stride > &vector)
Definition: vctFixedSizeVector.h:105
Definition: vctFixedSizeVector.h:74
#define CMN_ASSERT(expr)
Definition: cmnAssert.h:90
vctFixedSizeVector(const __elementType *elements)
Definition: vctFixedSizeVector.h:132
VectorValueType Floor(void) const
Definition: vctFixedSizeVector.h:547
An implementation of the ``abstract'' vctFixedSizeVectorBase.
Definition: vctFixedSizeVectorRef.h:46
vctFixedSizeVector< _elementType, _size > operator-(const vctFixedSizeConstVectorBase< _size, _vector1Stride, _elementType, _vector1Data > &vector1, const vctFixedSizeConstVectorBase< _size, _vector2Stride, _elementType, _vector2Data > &vector2)
Definition: vctFixedSizeVector.h:332
VectorValueType Ceil(void) const
Definition: vctFixedSizeVector.h:558
vctFixedSizeVector< _elementType, _size > operator+(const vctFixedSizeConstVectorBase< _size, _vector1Stride, _elementType, _vector1Data > &vector1, const vctFixedSizeConstVectorBase< _size, _vector2Stride, _elementType, _vector2Data > &vector2)
Definition: vctFixedSizeVector.h:320
vctFixedSizeVector< _elementType, _size1+_size2 > operator&(const vctFixedSizeConstVectorBase< _size1, _stride1, _elementType, _dataPtr1 > &vector1, const vctFixedSizeConstVectorBase< _size2, _stride2, _elementType, _dataPtr2 > &vector2)
Definition: vctFixedSizeVector.h:502
cmnVaArgPromotion< _elementType >::Type VaArgPromotion
Definition: cmnTypeTraits.h:167
An implementation of the ``abstract'' vctFixedSizeConstVectorBase.
Definition: vctFixedSizeConstVectorRef.h:50
size_t size_type
Definition: vctContainerTraits.h:35
vctFixedSizeVector(const vctFixedSizeConstVectorBase< SIZEMINUSONE, __stride, _elementType, __dataPtrType > &vector, value_type lastElement)
Definition: vctFixedSizeVector.h:122
vctFixedSizeVector< _elementType, _size > operator*(const vctFixedSizeConstVectorBase< _size, _stride, _elementType, _dataPtrType > &vector, const _elementType &scalar)
Definition: vctFixedSizeVector.h:405
vctFixedSizeVector(const value_type &element0, const value_type &element1)
Definition: vctFixedSizeVector.h:174
vctFixedSizeVector< _elementType, 3 > vctCrossProduct(const vctFixedSizeConstVectorBase< 3, _vector1Stride, _elementType, _vector1Data > &vector1, const vctFixedSizeConstVectorBase< 3, _vector2Stride, _elementType, _vector2Data > &vector2)
Definition: vctFixedSizeVector.h:350
VCT_CONTAINER_TRAITS_TYPEDEFS(_elementType)
ThisType & Assign(const vctFixedSizeConstVectorBase< _size, __stride, __elementType, __dataPtrType > &other)
Definition: vctFixedSizeVectorBase.h:274
Implementation of a fixed-size vector using template metaprogramming.
Definition: vctFixedSizeVector.h:52
vctFixedSizeVector(const vctFixedSizeVectorRef< _elementType, _size, __stride > &vector)
Definition: vctFixedSizeVector.h:111
VectorValueType Abs(void) const
Definition: vctFixedSizeVector.h:525
ThisType & NegationOf(const vctFixedSizeConstVectorBase< _size, __stride, value_type, __dataPtrType > &otherVector)
Definition: vctFixedSizeVectorBase.h:1286
vctFixedSizeVector< bool, _size > vctFixedSizeVectorElementwiseCompareScalar(const vctFixedSizeConstVectorBase< _size, _stride, _elementType, _dataPtrType > &vector, const _elementType &scalar)
Definition: vctFixedSizeVector.h:596
void cmnDeSerializeRaw(std::istream &inputStream, _elementType &data)
Definition: cmnDeSerializer.h:82
Define common container related types based on the properties of a fixed size container.
Definition: vctFixedSizeVectorTraits.h:45
TypeTraits::VaArgPromotion ElementVaArgPromotion
Definition: vctFixedSizeVector.h:72
size_type size(void) const
Definition: vctFixedSizeConstVectorBase.h:205
bool FromStreamRaw(std::istream &inputStream, const char delimiter= ' ')
Definition: vctFixedSizeVector.h:266
void DeSerializeRaw(std::istream &inputStream)
Definition: vctFixedSizeVector.h:299
vctFixedSizeVector< value_type, _size > ThisType
Definition: vctFixedSizeVector.h:67
vctFixedSizeVector< bool, _size > vctFixedSizeVectorElementwiseCompareVector(const vctFixedSizeConstVectorBase< _size, _stride, _elementType, _dataPtrType > &vector1, const vctFixedSizeConstVectorBase< _size, __stride, _elementType, __dataPtrType > &vector2)
Definition: vctFixedSizeVector.h:582
Declaration of vctFixedSizeVectorRef.
value_type SetAll(const value_type &value)
Definition: vctFixedSizeVectorBase.h:241
vctFixedSizeVector(const value_type &element0, const value_type &element1, const value_type &element2, const value_type &element3)
Definition: vctFixedSizeVector.h:190
VectorValueType Normalized(void) const
Definition: vctFixedSizeVector.h:569
A template for a fixed length vector with fixed spacing in memory.
Definition: vctFixedSizeVectorBase.h:76
vctFixedSizeVector< _elementType, _size > operator/(const vctFixedSizeConstVectorBase< _size, _stride, _elementType, _dataPtrType > &vector, const _elementType &scalar)
Definition: vctFixedSizeVector.h:416
void CrossProductOf(const vctFixedSizeConstVectorBase< 3, __stride1, _elementType, __dataPtr1Type > &inputVector1, const vctFixedSizeConstVectorBase< 3, __stride2, _elementType, __dataPtr2Type > &inputVector2)
Definition: vctFixedSizeVectorBase.h:782
ThisType & RatioOf(const vctFixedSizeConstVectorBase< _size, __stride, value_type, __dataPtrType > &vector, const value_type scalar)
Definition: vctFixedSizeVectorBase.h:1013
BaseType::CopyType CopyType
Definition: vctFixedSizeVector.h:69
ptrdiff_t stride_type
Definition: vctContainerTraits.h:37
VectorValueType Negation(void) const
Definition: vctFixedSizeVector.h:536
ThisType & SumOf(const vctFixedSizeConstVectorBase< _size, __stride1, value_type, __dataPtrType1 > &vector1, const vctFixedSizeConstVectorBase< _size, __stride2, value_type, __dataPtrType2 > &vector2)
Definition: vctFixedSizeVectorBase.h:809
vctFixedSizeVector()
Definition: vctFixedSizeVector.h:78
Definition: vctDynamicConstVectorBase.h:77
A template for a fixed length vector with fixed spacing in memory.
Definition: vctFixedSizeConstVectorBase.h:107
vctFixedSizeVector(const value_type element0, const value_type element1, const value_type element2, const value_type element3, const value_type element4,...)
Definition: vctFixedSizeVector.h:211
ThisType & ConcatenationOf(const vctFixedSizeConstVectorBase< SIZEMINUSONE, __stride, __elementTypeVector, __dataPtrType > &other, __elementType last)
Definition: vctFixedSizeVectorBase.h:527
vctFixedSizeVector< _elementType, 3 > operator%(const vctFixedSizeConstVectorBase< 3, _vector1Stride, _elementType, _vector1Data > &vector1, const vctFixedSizeConstVectorBase< 3, _vector2Stride, _elementType, _vector2Data > &vector2)
Definition: vctFixedSizeVector.h:366
A collection of useful information about the C++ basic types, represented in a generic programming wa...
Definition: cmnTypeTraits.h:155
ThisType & DifferenceOf(const vctFixedSizeConstVectorBase< _size, __stride1, value_type, __dataPtrType1 > &vector1, const vctFixedSizeConstVectorBase< _size, __stride2, value_type, __dataPtrType2 > &vector2)
Definition: vctFixedSizeVectorBase.h:820
vctFixedSizeVector(const vctFixedSizeConstVectorBase< _size, __stride, __elementType, __dataPtrType > &vector)
Definition: vctFixedSizeVector.h:95
Container class for the recursive engines.
Definition: vctFixedSizeVectorRecursiveEngines.h:76
vctFixedSizeVector(const value_type &value)
Definition: vctFixedSizeVector.h:84
ThisType & operator=(const ThisType &other)
Definition: vctFixedSizeVector.h:237
ThisType & ProductOf(const vctFixedSizeConstVectorBase< _size, __stride, value_type, __dataPtrType > &vector, const value_type scalar)
Definition: vctFixedSizeVectorBase.h:1003
vctFixedSizeVector(const value_type &element0, const value_type &element1, const value_type &element2)
Definition: vctFixedSizeVector.h:181
vctFixedSizeVector(const vctDynamicConstVectorBase< __vectorOwnerType, value_type > &vector)
Definition: vctFixedSizeVector.h:147