cisst-saw
Loading...
Searching...
No Matches
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 Author(s): Ofri Sadowsky, Anton Deguet
6 Created on: 2003-08-18
7
8 (C) Copyright 2003-2020 Johns Hopkins University (JHU), All Rights Reserved.
9
10--- begin cisst license - do not edit ---
11
12This software is provided "as is" under an open source license, with
13no warranty. The complete license can be found in license.txt and
14http://www.cisst.org/cisst/license.txt.
15
16--- end cisst license ---
17*/
18
19#pragma once
20#ifndef _vctFixedSizeVector_h
21#define _vctFixedSizeVector_h
22
27
29
49template <class _elementType, vct::size_type _size>
51 _size, 1, _elementType,
52 typename vctFixedSizeVectorTraits<_elementType, _size, 1>::array
53 >
54{
55 public:
56 /* define most types from vctContainerTraits */
58
63 /* no need to document, inherit doxygen documentation from
64 vctFixedSizeVectorBase */
67 typedef typename BaseType::CopyType CopyType;
71
72 enum {SIZEMINUSONE = _size - 1};
73
74 public:
77
79 inline vctFixedSizeVector(const ThisType & other) {
80 this->Assign(other);
81 }
82
86 explicit inline vctFixedSizeVector(const value_type & value) {
87 this->SetAll(value);
88 }
89
95 template <class __elementType, stride_type __stride, class __dataPtrType>
96 explicit inline
100
102
105 template <stride_type __stride>
106 inline
110
111 template <stride_type __stride>
112 inline
116
117
122 template <stride_type __stride, class __dataPtrType>
123 inline
125 // vctFixedSizeVector(const vctFixedSizeConstVectorBase<_size-1, __stride, _elementType, __dataPtrType> & vector, value_type lastElement) {
126 this->ConcatenationOf(vector, lastElement);
127 }
128
132 template<class __elementType>
133 explicit inline
134 vctFixedSizeVector(const __elementType * elements)
135 {
136 this->Assign(elements);
137 }
138
148 template <class __vectorOwnerType>
150 {
151 this->Assign(vector);
152 }
153
172
174
176 inline vctFixedSizeVector(const value_type & element0, const value_type & element1) {
177 CMN_ASSERT(_size == 2);
178 (*this)[0] = element0;
179 (*this)[1] = element1;
180 }
181
183 inline vctFixedSizeVector(const value_type & element0, const value_type & element1,
184 const value_type & element2) {
185 CMN_ASSERT(_size == 3);
186 (*this)[0] = element0;
187 (*this)[1] = element1;
188 (*this)[2] = element2;
189 }
190
192 inline vctFixedSizeVector(const value_type & element0, const value_type & element1,
193 const value_type & element2, const value_type & element3) {
194 CMN_ASSERT(_size == 4);
195 (*this)[0] = element0;
196 (*this)[1] = element1;
197 (*this)[2] = element2;
198 (*this)[3] = element3;
199 }
200
213 inline vctFixedSizeVector(const value_type element0, const value_type element1,
214 const value_type element2, const value_type element3, const value_type element4, ...)
215 {
216 CMN_ASSERT(_size > 4);
217 (*this)[0] = element0;
218 (*this)[1] = element1;
219 (*this)[2] = element2;
220 (*this)[3] = element3;
221 (*this)[4] = element4;
222 va_list nextArg;
223 va_start(nextArg, element4);
224 for (index_type i = 5; i < _size; ++i) {
225 (*this).at(i) = value_type( va_arg(nextArg, ElementVaArgPromotion) );
226 }
227 va_end(nextArg);
228 }
229
231
232
239 inline ThisType & operator = (const ThisType & other) {
240 return reinterpret_cast<ThisType &>(this->Assign(other));
241 }
242
243 template <stride_type __stride, class __elementType, class __dataPtrType>
245 return reinterpret_cast<ThisType &>(this->Assign(other));
246 }
247
248 template <stride_type __stride>
250 return reinterpret_cast<ThisType &>(this->Assign(other));
251 }
252
253 template <stride_type __stride, class __elementType>
255 this->Assign(other);
256 return *this;
257 }
258
259
261 inline ThisType & operator = (const value_type & value) {
262 this->SetAll(value);
263 return *this;
264 }
265
268 bool FromStreamRaw(std::istream & inputStream, const char delimiter = ' ')
269 {
270 _elementType temp[_size];
271 size_type index;
272 bool valid = true;
273 for (index = 0; index < _size; index++) {
274 inputStream >> temp[index]; // assumes that operator >> is defined for _elementType
275 if (inputStream.fail()) {
276 valid = false;
277 inputStream.clear();
278 break;
279 }
280 // Now, look for the delimiter
281 if (!isspace(delimiter)) {
282 if (index < _size-1) {
283 char c;
284 inputStream >> c;
285 if (c != delimiter) {
286 valid = false;
287 break;
288 }
289 }
290 }
291 }
292 if (valid) {
293 // Only update the object if the parsing was successful for all elements.
294 for (index = 0; index < _size; index++)
295 (*this)[index] = temp[index];
296 }
297 return valid;
298 }
299
301 void DeSerializeRaw(std::istream & inputStream)
302 {
303 size_type index;
304 const size_type mySize = this->size();
305 for (index = 0; index < mySize; ++index) {
306 cmnDeSerializeRaw(inputStream, this->Element(index));
307 }
308 }
309
310};
311
312
315
319template <vct::size_type _size, vct::stride_type _vector1Stride, class _vector1Data,
320 vct::stride_type _vector2Stride, class _vector2Data, class _elementType>
329
330/* documented above */
331template <vct::size_type _size, vct::stride_type _vector1Stride, class _vector1Data,
332 vct::stride_type _vector2Stride, class _vector2Data, class _elementType>
341
343
344
349template <vct::stride_type _vector1Stride, class _vector1Data,
350 vct::stride_type _vector2Stride, class _vector2Data, class _elementType>
359
360
365template <vct::stride_type _vector1Stride, class _vector1Data,
366 vct::stride_type _vector2Stride, class _vector2Data, class _elementType>
375
376
379
383template <vct::size_type _size, vct::stride_type _stride, class _elementType, class _dataPtrType>
386 const _elementType & scalar)
387{
389 result.SumOf(vector, scalar);
390 return result;
391}
392
393/* documented above */
394template <vct::size_type _size, vct::stride_type _stride, class _elementType, class _dataPtrType>
397 const _elementType & scalar)
398{
400 result.DifferenceOf(vector, scalar);
401 return result;
402}
403
404/* documented above */
405template <vct::size_type _size, vct::stride_type _stride, class _elementType, class _dataPtrType>
408 const _elementType & scalar)
409{
411 result.ProductOf(vector, scalar);
412 return result;
413}
414
415/* documented above */
416template <vct::size_type _size, vct::stride_type _stride, class _elementType, class _dataPtrType>
419 const _elementType & scalar)
420{
422 result.RatioOf(vector, scalar);
423 return result;
424}
425
426
427
430
434template <vct::size_type _size, vct::stride_type _stride, class _elementType, class _dataPtrType>
436operator + (const _elementType & scalar,
438
439{
441 result.SumOf(scalar, vector);
442 return result;
443}
444
445/* documented above */
446template <vct::size_type _size, vct::stride_type _stride, class _elementType, class _dataPtrType>
448operator - (const _elementType & scalar,
450{
452 result.DifferenceOf(scalar, vector);
453 return result;
454}
455
456/* documented above */
457template <vct::size_type _size, vct::stride_type _stride, class _elementType, class _dataPtrType>
459operator * (const _elementType & scalar,
461{
463 result.ProductOf(scalar, vector);
464 return result;
465}
466
467/* documented above */
468template <vct::size_type _size, vct::stride_type _stride, class _elementType, class _dataPtrType>
470operator / (const _elementType & scalar,
472{
474 result.RatioOf(scalar, vector);
475 return result;
476}
477
478
479
482
486template <vct::size_type _size, vct::stride_type _stride, class _elementType, class _dataPtrType>
494
495
496
500#ifndef SWIG // SWIG 1.3.22 doesn't like _size1 + _size2 for the template "instantiation" of vector
501template <vct::size_type _size1, vct::stride_type _stride1, class _elementType, class _dataPtr1,
502 vct::size_type _size2, vct::stride_type _stride2, class _dataPtr2>
506{
510 subvector1.Assign(vector1);
511 subvector2.Assign(vector2);
512
513 return result;
514}
515#endif
516
517
518/*
519 Methods declared previously and implemented here because they require vctFixedSizeVector
520*/
521
522#ifndef DOXYGEN
523
524/* documented in class vctFixedSizeConstVectorBase */
525template <vct::size_type _size, vct::stride_type _stride, class _elementType, class _dataPtrType>
529 vctFixedSizeVectorRecursiveEngines<_size>::template
531 Unfold(result, *this);
532 return result;
533}
534
535/* documented in class vctFixedSizeConstVectorBase */
536template <vct::size_type _size, vct::stride_type _stride, class _elementType, class _dataPtrType>
540 vctFixedSizeVectorRecursiveEngines<_size>::template
542 Unfold(result, *this);
543 return result;
544}
545
546/* documented in class vctFixedSizeConstVectorBase */
547template <vct::size_type _size, vct::stride_type _stride, class _elementType, class _dataPtrType>
551 vctFixedSizeVectorRecursiveEngines<_size>::template
553 Unfold(result, *this);
554 return result;
555}
556
557/* documented in class vctFixedSizeConstVectorBase */
558template <vct::size_type _size, vct::stride_type _stride, class _elementType, class _dataPtrType>
562 vctFixedSizeVectorRecursiveEngines<_size>::template
564 Unfold(result, *this);
565 return result;
566}
567
568/* documented in class vctFixedSizeConstVectorBase */
569template <vct::size_type _size, vct::stride_type _stride, class _elementType, class _dataPtrType>
573 result.NormalizedSelf();
574 return result;
575}
576
577/* documented in class vctFixedSizeConstVectorBase */
578template <vct::size_type _size,
579 vct::stride_type _stride, class _dataPtrType,
580 vct::stride_type __stride, class __dataPtrType,
581 class _elementType,
582 class _elementOperationType>
591
592/* documented in class vctFixedSizeConstVectorBase */
593template<vct::size_type _size,
594 vct::stride_type _stride, class _dataPtrType,
595 class _elementType,
596 class _elementOperationType>
599 const _elementType & scalar) {
601 vctFixedSizeVectorRecursiveEngines<_size>::template
602 VoViSi<_elementOperationType>::Unfold(result, vector, scalar);
603 return result;
604}
605
606#endif // DOXYGEN
607
608#endif // _vctFixedSizeVector_h
Implement operation of the form for fixed size vectors.
Definition vctFixedSizeVectorRecursiveEngines.h:455
static void Unfold(_outputVectorType &output, const _inputVectorType &inputVector, const _inputScalarType inputScalar)
Definition vctFixedSizeVectorRecursiveEngines.h:306
static void Unfold(_outputVectorType &output, const _inputVector1Type &input1, const _inputVector2Type &input2)
Definition vctFixedSizeVectorRecursiveEngines.h:143
A collection of useful information about the C++ basic types, represented in a generic programming wa...
Definition cmnTypeTraits.h:155
cmnVaArgPromotion< value_type >::Type VaArgPromotion
Definition cmnTypeTraits.h:167
_elementType value_type
Definition mtsGenericObjectProxy.h:329
Definition vctForwardDeclarations.h:119
A template for a fixed length vector with fixed spacing in memory.
Definition vctFixedSizeConstVectorBase.h:108
vctFixedSizeVector< _elementType, _size > VectorValueType
Definition vctFixedSizeConstVectorBase.h:152
VectorValueType Floor(void) const
Definition vctFixedSizeVector.h:549
VectorValueType Ceil(void) const
Definition vctFixedSizeVector.h:560
VectorValueType Abs(void) const
Definition vctFixedSizeVector.h:527
VectorValueType Negation(void) const
Definition vctFixedSizeVector.h:538
Definition vctForwardDeclarations.h:86
A template for a fixed length vector with fixed spacing in memory.
Definition vctFixedSizeVectorBase.h:77
ThisType & RatioOf(const vctFixedSizeConstVectorBase< _size, __stride, value_type, __dataPtrType > &vector, const value_type scalar)
Definition vctFixedSizeVectorBase.h:1013
BaseType::CopyType CopyType
Definition vctFixedSizeVectorBase.h:90
ThisType & SumOf(const vctFixedSizeConstVectorBase< _size, __stride1, value_type, __dataPtrType1 > &vector1, const vctFixedSizeConstVectorBase< _size, __stride2, value_type, __dataPtrType2 > &vector2)
Definition vctFixedSizeVectorBase.h:809
ThisType & Assign(const vctFixedSizeConstVectorBase< _size, __stride, __elementType, __dataPtrType > &other)
Definition vctFixedSizeVectorBase.h:274
ThisType & DifferenceOf(const vctFixedSizeConstVectorBase< _size, __stride1, value_type, __dataPtrType1 > &vector1, const vctFixedSizeConstVectorBase< _size, __stride2, value_type, __dataPtrType2 > &vector2)
Definition vctFixedSizeVectorBase.h:820
reference Element(size_type index)
Definition vctFixedSizeVectorBase.h:213
ThisType & ProductOf(const vctFixedSizeConstVectorBase< _size, __stride, value_type, __dataPtrType > &vector, const value_type scalar)
Definition vctFixedSizeVectorBase.h:1003
ThisType & ConcatenationOf(const vctFixedSizeConstVectorBase< SIZEMINUSONE, __stride, __elementTypeVector, __dataPtrType > &other, __elementType last)
Definition vctFixedSizeVectorBase.h:527
ThisType & NegationOf(const vctFixedSizeConstVectorBase< _size, __stride, value_type, __dataPtrType > &otherVector)
Definition vctFixedSizeVectorBase.h:1286
pointer Pointer(size_type index=0)
Definition vctFixedSizeVectorBase.h:226
void CrossProductOf(const vctFixedSizeConstVectorBase< 3, __stride1, _elementType, __dataPtr1Type > &inputVector1, const vctFixedSizeConstVectorBase< 3, __stride2, _elementType, __dataPtr2Type > &inputVector2)
Definition vctFixedSizeVectorBase.h:782
value_type SetAll(const value_type &value)
Definition vctFixedSizeVectorBase.h:241
Implementation of a fixed-size vector using template metaprogramming.
Definition vctFixedSizeVector.h:54
vctFixedSizeVectorBase< _size, 1, value_type, typename VectorTraits::array > BaseType
Definition vctFixedSizeVector.h:66
vctFixedSizeVector(const ThisType &other)
Definition vctFixedSizeVector.h:79
vctFixedSizeVector(const vctFixedSizeConstVectorBase< SIZEMINUSONE, __stride, _elementType, __dataPtrType > &vector, value_type lastElement)
Definition vctFixedSizeVector.h:124
TypeTraits::VaArgPromotion ElementVaArgPromotion
Definition vctFixedSizeVector.h:70
vctFixedSizeVector(const vctFixedSizeConstVectorBase< _size, __stride, __elementType, __dataPtrType > &vector)
Definition vctFixedSizeVector.h:97
class cmnTypeTraits< value_type > TypeTraits
Definition vctFixedSizeVector.h:69
vctFixedSizeVector(const __elementType *elements)
Definition vctFixedSizeVector.h:134
ThisType & operator=(const ThisType &other)
Definition vctFixedSizeVector.h:239
VCT_CONTAINER_TRAITS_TYPEDEFS(_elementType)
bool FromStreamRaw(std::istream &inputStream, const char delimiter=' ')
Definition vctFixedSizeVector.h:268
vctFixedSizeVector(const value_type &element0, const value_type &element1, const value_type &element2, const value_type &element3)
Definition vctFixedSizeVector.h:192
vctFixedSizeVector(const vctFixedSizeVectorRef< _elementType, _size, __stride > &vector)
Definition vctFixedSizeVector.h:113
vctFixedSizeVector()
Definition vctFixedSizeVector.h:76
vctFixedSizeVectorTraits< value_type, _size, 1 > VectorTraits
Definition vctFixedSizeVector.h:62
void DeSerializeRaw(std::istream &inputStream)
Definition vctFixedSizeVector.h:301
vctFixedSizeVector(const value_type &element0, const value_type &element1, const value_type &element2)
Definition vctFixedSizeVector.h:183
vctFixedSizeVector(const value_type &value)
Definition vctFixedSizeVector.h:86
vctFixedSizeVector(const vctFixedSizeConstVectorRef< _elementType, _size, __stride > &vector)
Definition vctFixedSizeVector.h:107
vctFixedSizeVector< value_type, _size > ThisType
Definition vctFixedSizeVector.h:65
vctFixedSizeVector(const value_type &element0, const value_type &element1)
Definition vctFixedSizeVector.h:176
vctFixedSizeVector(const vctDynamicConstVectorBase< __vectorOwnerType, value_type > &vector)
Definition vctFixedSizeVector.h:149
vctFixedSizeVector(const value_type element0, const value_type element1, const value_type element2, const value_type element3, const value_type element4,...)
Definition vctFixedSizeVector.h:213
@ SIZEMINUSONE
Definition vctFixedSizeVector.h:72
BaseType::CopyType CopyType
Definition vctFixedSizeVector.h:67
Definition vctForwardDeclarations.h:89
Define common container related types based on the properties of a fixed size container.
Definition vctFixedSizeVectorTraits.h:46
#define CMN_ASSERT(expr)
Definition cmnAssert.h:97
void cmnDeSerializeRaw(std::istream &inputStream, _elementType &data) CISST_THROW(std
Definition cmnDeSerializer.h:82
#define CISST_THROW(exceptionParameter)
Somewhat portable compilation warning message. This works with very recent versions of gcc (4....
Definition cmnPortability.h:559
size_t size_type
Definition vctContainerTraits.h:35
ptrdiff_t stride_type
Definition vctContainerTraits.h:37
size_type size(void) const
Definition vctDynamicConstMatrixBase.h:228
vctReturnDynamicVector< _elementType > vctCrossProduct(const vctDynamicConstVectorBase< _vectorOwnerType1, _elementType > &inputVector1, const vctDynamicConstVectorBase< _vectorOwnerType2, _elementType > &inputVector2)
Definition vctDynamicVector.h:486
vctFixedSizeVector< bool, _size > vctFixedSizeVectorElementwiseCompareVector(const vctFixedSizeConstVectorBase< _size, _stride, _elementType, _dataPtrType > &vector1, const vctFixedSizeConstVectorBase< _size, __stride, _elementType, __dataPtrType > &vector2)
Definition vctFixedSizeVector.h:584
vctFixedSizeVector< bool, _size > vctFixedSizeVectorElementwiseCompareScalar(const vctFixedSizeConstVectorBase< _size, _stride, _elementType, _dataPtrType > &vector, const _elementType &scalar)
Definition vctFixedSizeVector.h:598
vctFixedSizeVector< _elementType, _size > operator*(const vctFixedSizeConstVectorBase< _size, _stride, _elementType, _dataPtrType > &vector, const _elementType &scalar)
Definition vctFixedSizeVector.h:407
vctFixedSizeVector< _elementType, _size > operator-(const vctFixedSizeConstVectorBase< _size, _vector1Stride, _elementType, _vector1Data > &vector1, const vctFixedSizeConstVectorBase< _size, _vector2Stride, _elementType, _vector2Data > &vector2)
Definition vctFixedSizeVector.h:334
vctFixedSizeVector< _elementType, 3 > operator%(const vctFixedSizeConstVectorBase< 3, _vector1Stride, _elementType, _vector1Data > &vector1, const vctFixedSizeConstVectorBase< 3, _vector2Stride, _elementType, _vector2Data > &vector2)
Definition vctFixedSizeVector.h:368
vctFixedSizeVector< _elementType, _size > operator/(const vctFixedSizeConstVectorBase< _size, _stride, _elementType, _dataPtrType > &vector, const _elementType &scalar)
Definition vctFixedSizeVector.h:418
vctFixedSizeVector< _elementType, _size1+_size2 > operator&(const vctFixedSizeConstVectorBase< _size1, _stride1, _elementType, _dataPtr1 > &vector1, const vctFixedSizeConstVectorBase< _size2, _stride2, _elementType, _dataPtr2 > &vector2)
Definition vctFixedSizeVector.h:504
vctFixedSizeVector< _elementType, _size > operator+(const vctFixedSizeConstVectorBase< _size, _vector1Stride, _elementType, _vector1Data > &vector1, const vctFixedSizeConstVectorBase< _size, _vector2Stride, _elementType, _vector2Data > &vector2)
Definition vctFixedSizeVector.h:322
Declaration of vctFixedSizeVectorRef.