cisst-saw
Loading...
Searching...
No Matches
vctDynamicVectorLoopEngines.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: 2004-07-01
7
8 (C) Copyright 2004-2022 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 _vctDynamicVectorLoopEngines_h
21#define _vctDynamicVectorLoopEngines_h
22
27
31
65
66 public:
67
70 inline static void ThrowException(const size_t expected, const size_t received) CISST_THROW(std::runtime_error) {
71 std::stringstream message;
72 message << "vctDynamicVectorLoopEngines: Sizes of vectors don't match, expected: " << expected
73 << ", received: " << received;
74 cmnThrow(std::runtime_error(message.str()));
75 }
76
77
97 template<class _elementOperationType>
98 class VoViVi {
99 public:
105 template<class _outputVectorType, class _input1VectorType, class _input2VectorType>
106 static inline void Run(_outputVectorType & outputVector,
107 const _input1VectorType & input1Vector,
108 const _input2VectorType & input2Vector) {
109 // check sizes
110 typedef _outputVectorType OutputVectorType;
111 typedef typename OutputVectorType::OwnerType OutputOwnerType;
112 typedef typename OutputOwnerType::pointer OutputPointerType;
113 typedef typename OutputOwnerType::size_type size_type;
114 typedef typename OutputOwnerType::stride_type stride_type;
115
116 typedef _input1VectorType Input1VectorType;
117 typedef typename Input1VectorType::OwnerType Input1OwnerType;
118 typedef typename Input1OwnerType::const_pointer Input1PointerType;
119
120 typedef _input2VectorType Input2VectorType;
121 typedef typename Input2VectorType::OwnerType Input2OwnerType;
122 typedef typename Input2OwnerType::const_pointer Input2PointerType;
123
124 // retrieve owners
125 const Input1OwnerType & input1Owner = input1Vector.Owner();
126 const Input2OwnerType & input2Owner = input2Vector.Owner();
127 OutputOwnerType & outputOwner = outputVector.Owner();
128
129 const size_type size = outputOwner.size();
130 if (size != input1Owner.size()) {
131 ThrowException(size, input1Owner.size());
132 } else if (size != input2Owner.size()) {
133 ThrowException(size, input2Owner.size());
134 }
135
136 // if all are compact
137 const stride_type outputStride = outputOwner.stride();
138 const stride_type input1Stride = input1Owner.stride();
139 const stride_type input2Stride = input2Owner.stride();
140
141 if ((outputStride == 1) && (input1Stride == 1) && (input2Stride == 1)) {
142 vctDynamicCompactLoopEngines::CoCiCi<_elementOperationType>::Run(outputOwner, input1Owner, input2Owner);
143 } else {
144 // otherwise
145 OutputPointerType outputPointer = outputOwner.Pointer();
146 const OutputPointerType outputEnd = outputPointer + size * outputStride;
147
148 Input1PointerType input1Pointer = input1Owner.Pointer();
149 Input2PointerType input2Pointer = input2Owner.Pointer();
150
151 for (;
152 outputPointer != outputEnd;
153 outputPointer += outputStride,
154 input1Pointer += input1Stride,
155 input2Pointer += input2Stride) {
156 *outputPointer = _elementOperationType::Operate(*input1Pointer, *input2Pointer);
157 }
158 }
159 }
160 };
161
162
182 template<class _elementOperationType>
183 class VioVi {
184 public:
190 template<class _inputOutputVectorType, class _inputVectorType>
191 static void Run(_inputOutputVectorType & inputOutputVector,
192 const _inputVectorType & inputVector) {
193 // check size
194 typedef _inputOutputVectorType InputOutputVectorType;
195 typedef typename InputOutputVectorType::OwnerType InputOutputOwnerType;
196 typedef typename InputOutputOwnerType::pointer InputOutputPointerType;
197 typedef typename InputOutputOwnerType::size_type size_type;
198 typedef typename InputOutputOwnerType::stride_type stride_type;
199
200 typedef _inputVectorType InputVectorType;
201 typedef typename InputVectorType::OwnerType InputOwnerType;
202 typedef typename InputOwnerType::const_pointer InputPointerType;
203
204 // retrieve owners
205 const InputOwnerType & inputOwner = inputVector.Owner();
206 InputOutputOwnerType & inputOutputOwner = inputOutputVector.Owner();
207
208 const size_type size = inputOutputOwner.size();
209 if (size != inputOwner.size()) {
210 ThrowException(size, inputOwner.size());
211 }
212
213 const stride_type inputOutputStride = inputOutputOwner.stride();
214 const stride_type inputStride = inputOwner.stride();
215
216 if ((inputOutputStride == 1) && (inputStride == 1)) {
218 } else {
219 // otherwise
220 InputOutputPointerType inputOutputPointer = inputOutputOwner.Pointer();
221 const InputOutputPointerType inputOutputEnd = inputOutputPointer + size * inputOutputStride;
222
223 InputPointerType inputPointer = inputOwner.Pointer();
224
225 for (;
226 inputOutputPointer != inputOutputEnd;
227 inputOutputPointer += inputOutputStride,
228 inputPointer += inputStride) {
229 *inputOutputPointer = _elementOperationType::Operate(*inputOutputPointer, *inputPointer);
230 }
231 }
232 }
233 };
234
235
256 template<class _elementOperationType>
257 class VioVio {
258 public:
264 template<class _inputOutput1VectorType, class _inputOutput2VectorType>
265 static void Run(_inputOutput1VectorType & inputOutput1Vector,
266 _inputOutput2VectorType & inputOutput2Vector) {
267 // check size
268 typedef _inputOutput1VectorType InputOutput1VectorType;
269 typedef typename InputOutput1VectorType::OwnerType InputOutput1OwnerType;
270 typedef typename InputOutput1OwnerType::pointer InputOutput1PointerType;
271 typedef typename InputOutput1OwnerType::size_type size_type;
272 typedef typename InputOutput1OwnerType::stride_type stride_type;
273
274 typedef _inputOutput2VectorType InputOutput2VectorType;
275 typedef typename InputOutput2VectorType::OwnerType InputOutput2OwnerType;
276 typedef typename InputOutput2OwnerType::pointer InputOutput2PointerType;
277
278 // retrieve owners
279 InputOutput1OwnerType & inputOutput1Owner = inputOutput1Vector.Owner();
280 InputOutput2OwnerType & inputOutput2Owner = inputOutput2Vector.Owner();
281
282 const size_type size = inputOutput1Owner.size();
283 if (size != inputOutput2Owner.size()) {
284 ThrowException(size, inputOutput2Owner.size());
285 }
286
287 const stride_type inputOutput1Stride = inputOutput1Owner.stride();
288 const stride_type inputOutput2Stride = inputOutput2Owner.stride();
289
290 if ((inputOutput1Stride == 1) && (inputOutput2Stride == 1)) {
291 vctDynamicCompactLoopEngines::CioCio<_elementOperationType>::Run(inputOutput1Owner, inputOutput2Owner);
292 } else {
293 // otherwise
294 InputOutput1PointerType inputOutput1Pointer = inputOutput1Owner.Pointer();
295 const InputOutput1PointerType inputOutput1End = inputOutput1Pointer + size * inputOutput1Stride;
296
297 InputOutput2PointerType inputOutput2Pointer = inputOutput2Owner.Pointer();
298
299 for (;
300 inputOutput1Pointer != inputOutput1End;
301 inputOutput1Pointer += inputOutput1Stride,
302 inputOutput2Pointer += inputOutput2Stride) {
303 _elementOperationType::Operate(*inputOutput1Pointer, *inputOutput2Pointer);
304 }
305 }
306 }
307 };
308
309
329 template<class _elementOperationType>
330 class VoViSi {
331 public:
338 template<class _outputVectorType, class _inputVectorType, class _inputScalarType>
339 static inline void Run(_outputVectorType & outputVector,
340 const _inputVectorType & inputVector,
341 const _inputScalarType inputScalar) {
342 // check sizes
343 typedef _outputVectorType OutputVectorType;
344 typedef typename OutputVectorType::OwnerType OutputOwnerType;
345 typedef typename OutputOwnerType::pointer OutputPointerType;
346 typedef typename OutputOwnerType::size_type size_type;
347 typedef typename OutputOwnerType::stride_type stride_type;
348
349 typedef _inputVectorType InputVectorType;
350 typedef typename InputVectorType::OwnerType InputOwnerType;
351 typedef typename InputOwnerType::const_pointer InputPointerType;
352
353 // retrieve owners
354 const InputOwnerType & inputOwner = inputVector.Owner();
355 OutputOwnerType & outputOwner = outputVector.Owner();
356
357 const size_type size = outputOwner.size();
358 if (size != inputOwner.size()) {
359 ThrowException(size, inputOwner.size());
360 }
361
362 const stride_type outputStride = outputOwner.stride();
363 const stride_type inputStride = inputOwner.stride();
364
365 if ((outputStride == 1) && (inputStride == 1)) {
366 vctDynamicCompactLoopEngines::CoCiSi<_elementOperationType>::Run(outputOwner, inputOwner, inputScalar);
367 } else {
368 // otherwise
369 OutputPointerType outputPointer = outputOwner.Pointer();
370 const OutputPointerType outputEnd = outputPointer + size * outputStride;
371
372 InputPointerType inputPointer = inputOwner.Pointer();
373
374 for (;
375 outputPointer != outputEnd;
376 outputPointer += outputStride,
377 inputPointer += inputStride) {
378 *outputPointer = _elementOperationType::Operate(*inputPointer, inputScalar);
379 }
380 }
381 }
382 };
383
384
404 template<class _elementOperationType>
405 class VoSiVi {
406 public:
413 template<class _outputVectorType, class _inputScalarType, class _inputVectorType>
414 static inline void Run(_outputVectorType & outputVector,
415 const _inputScalarType inputScalar,
416 const _inputVectorType & inputVector) {
417 // check sizes
418 typedef _outputVectorType OutputVectorType;
419 typedef typename OutputVectorType::OwnerType OutputOwnerType;
420 typedef typename OutputOwnerType::pointer OutputPointerType;
421 typedef typename OutputOwnerType::size_type size_type;
422 typedef typename OutputOwnerType::stride_type stride_type;
423
424 typedef _inputVectorType InputVectorType;
425 typedef typename InputVectorType::OwnerType InputOwnerType;
426 typedef typename InputOwnerType::const_pointer InputPointerType;
427
428 // retrieve owners
429 const InputOwnerType & inputOwner = inputVector.Owner();
430 OutputOwnerType & outputOwner = outputVector.Owner();
431
432 const size_type size = outputOwner.size();
433 if (size != inputOwner.size()) {
434 ThrowException(size, inputOwner.size());
435 }
436
437 const stride_type outputStride = outputOwner.stride();
438 const stride_type inputStride = inputOwner.stride();
439
440 if ((outputStride == 1) && (inputStride == 1)) {
441 vctDynamicCompactLoopEngines::CoSiCi<_elementOperationType>::Run(outputOwner, inputScalar, inputOwner);
442 } else {
443 // otherwise
444 OutputPointerType outputPointer = outputOwner.Pointer();
445 const OutputPointerType outputEnd = outputPointer + size * outputStride;
446
447 InputPointerType inputPointer = inputOwner.Pointer();
448
449 for (;
450 outputPointer != outputEnd;
451 outputPointer += outputStride,
452 inputPointer += inputStride) {
453 *outputPointer = _elementOperationType::Operate(inputScalar, *inputPointer);
454 }
455 }
456 }
457 };
458
459
480 template<class _elementOperationType>
481 class VioSi {
482 public:
488 template<class _inputOutputVectorType, class _inputScalarType>
489 static void Run(_inputOutputVectorType & inputOutputVector,
490 const _inputScalarType inputScalar) {
491
492 typedef _inputOutputVectorType InputOutputVectorType;
493 typedef typename InputOutputVectorType::OwnerType InputOutputOwnerType;
494 typedef typename InputOutputOwnerType::pointer InputOutputPointerType;
495 typedef typename InputOutputOwnerType::size_type size_type;
496 typedef typename InputOutputOwnerType::stride_type stride_type;
497
498 InputOutputOwnerType & inputOutputOwner = inputOutputVector.Owner();
499 const size_type size = inputOutputOwner.size();
500 const stride_type inputOutputStride = inputOutputOwner.stride();
501
502 if (inputOutputStride == 1) {
504 } else {
505 InputOutputPointerType inputOutputPointer = inputOutputOwner.Pointer();
506 const InputOutputPointerType inputOutputEnd = inputOutputPointer + size * inputOutputStride;
507
508 for (;
509 inputOutputPointer != inputOutputEnd;
510 inputOutputPointer += inputOutputStride) {
511 _elementOperationType::Operate(*inputOutputPointer, inputScalar);
512 }
513 }
514 }
515 };
516
517
536 template<class _elementOperationType>
537 class VoVi {
538 public:
544 template<class _outputVectorType, class _inputVectorType>
545 static inline void Run(_outputVectorType & outputVector,
546 const _inputVectorType & inputVector) {
547 // check sizes
548 typedef _outputVectorType OutputVectorType;
549 typedef typename OutputVectorType::OwnerType OutputOwnerType;
550 typedef typename OutputOwnerType::pointer OutputPointerType;
551 typedef typename OutputOwnerType::size_type size_type;
552 typedef typename OutputOwnerType::stride_type stride_type;
553
554 typedef _inputVectorType InputVectorType;
555 typedef typename InputVectorType::OwnerType InputOwnerType;
556 typedef typename InputOwnerType::const_pointer InputPointerType;
557
558 // retrieve owners
559 const InputOwnerType & inputOwner = inputVector.Owner();
560 OutputOwnerType & outputOwner = outputVector.Owner();
561
562 const size_type size = outputOwner.size();
563 if (size != inputOwner.size()) {
564 ThrowException(size, inputOwner.size());
565 }
566
567 // if both are compact
568 const stride_type outputStride = outputOwner.stride();
569 const stride_type inputStride = inputOwner.stride();
570
571 if ((outputStride == 1) && (inputStride == 1)) {
573 } else {
574 // otherwise
575 OutputPointerType outputPointer = outputOwner.Pointer();
576 const OutputPointerType outputEnd = outputPointer + size * outputStride;
577
578 InputPointerType inputPointer = inputOwner.Pointer();
579
580 for (;
581 outputPointer != outputEnd;
582 outputPointer += outputStride,
583 inputPointer += inputStride) {
584 *outputPointer = _elementOperationType::Operate(*inputPointer);
585 }
586 }
587 }
588 };
589
590
591
610 template<class _elementOperationType>
611 class Vio {
612 public:
617 template<class _inputOutputVectorType>
618 static inline void Run(_inputOutputVectorType & inputOutputVector) {
619
620 typedef _inputOutputVectorType InputOutputVectorType;
621 typedef typename InputOutputVectorType::OwnerType InputOutputOwnerType;
622 typedef typename InputOutputOwnerType::pointer InputOutputPointerType;
623 typedef typename InputOutputOwnerType::size_type size_type;
624 typedef typename InputOutputOwnerType::stride_type stride_type;
625
626 InputOutputOwnerType & inputOutputOwner = inputOutputVector.Owner();
627 const size_type size = inputOutputOwner.size();
628 const stride_type inputOutputStride = inputOutputOwner.stride();
629
630 if (inputOutputStride == 1) {
632 } else {
633 InputOutputPointerType inputOutputPointer = inputOutputOwner.Pointer();
634 const InputOutputPointerType inputOutputEnd = inputOutputPointer + size * inputOutputStride;
635
636 for (;
637 inputOutputPointer != inputOutputEnd;
638 inputOutputPointer += inputOutputStride) {
639 _elementOperationType::Operate(*inputOutputPointer);
640 }
641 }
642 }
643 };
644
645
646
668 template<class _incrementalOperationType, class _elementOperationType>
669 class SoVi {
670 public:
671 typedef typename _incrementalOperationType::OutputType OutputType;
676 template<class _inputVectorType>
677 static OutputType Run(const _inputVectorType & inputVector) {
678
679 typedef _inputVectorType InputVectorType;
680 typedef typename InputVectorType::OwnerType InputOwnerType;
681 typedef typename InputOwnerType::const_pointer InputPointerType;
682 typedef typename InputOwnerType::size_type size_type;
683 typedef typename InputOwnerType::stride_type stride_type;
684
685 const InputOwnerType & inputOwner = inputVector.Owner();
686 const size_type size = inputOwner.size();
687 const stride_type inputStride = inputOwner.stride();
688
689 if (inputStride == 1) {
691 } else {
692 OutputType incrementalResult = _incrementalOperationType::NeutralElement();
693 InputPointerType inputPointer = inputOwner.Pointer();
694 const InputPointerType inputEnd = inputPointer + size * inputStride;
695
696 for (;
697 inputPointer != inputEnd;
698 inputPointer += inputStride) {
699 incrementalResult = _incrementalOperationType::Operate(incrementalResult,
700 _elementOperationType::Operate(*inputPointer));
701 }
702 return incrementalResult;
703 }
704 }
705 };
706
707
733 template<class _incrementalOperationType, class _elementOperationType>
734 class SoViVi {
735 public:
736 typedef typename _incrementalOperationType::OutputType OutputType;
745 template<class _input1VectorType, class _input2VectorType>
746 static inline OutputType Run(const _input1VectorType & input1Vector,
747 const _input2VectorType & input2Vector) {
748 // check sizes
749 typedef _input1VectorType Input1VectorType;
750 typedef typename Input1VectorType::OwnerType Input1OwnerType;
751 typedef typename Input1OwnerType::const_pointer Input1PointerType;
752 typedef typename Input1OwnerType::size_type size_type;
753 typedef typename Input1OwnerType::stride_type stride_type;
754
755 typedef _input2VectorType Input2VectorType;
756 typedef typename Input2VectorType::OwnerType Input2OwnerType;
757 typedef typename Input2OwnerType::const_pointer Input2PointerType;
758
759 // retrieve owners
760 const Input1OwnerType & input1Owner = input1Vector.Owner();
761 const Input2OwnerType & input2Owner = input2Vector.Owner();
762
763 const size_type size = input1Owner.size();
764 if (size != input2Owner.size()) {
765 ThrowException(size, input2Owner.size());
766 }
767
768 const stride_type input1Stride = input1Owner.stride();
769 const stride_type input2Stride = input2Owner.stride();
770
771 if ((input1Stride == 1) && (input2Stride == 1)) {
773 } else {
774 // otherwise
775 OutputType incrementalResult = _incrementalOperationType::NeutralElement();
776 Input1PointerType input1Pointer = input1Owner.Pointer();
777 const Input1PointerType input1End = input1Pointer + size * input1Stride;
778
779 Input2PointerType input2Pointer = input2Owner.Pointer();
780
781 for (;
782 input1Pointer != input1End;
783 input1Pointer += input1Stride,
784 input2Pointer += input2Stride) {
785 incrementalResult = _incrementalOperationType::Operate(incrementalResult,
786 _elementOperationType::Operate(*input1Pointer,
787 *input2Pointer));
788 }
789 return incrementalResult;
790 }
791 // last return added to avoid buggy warning with gcc 4.0,
792 // this should never be evaluated
793#if (CISST_OS != CISST_WINDOWS)
794 // Some versions of Windows compilers treat unreachable code as an error
795 return _incrementalOperationType::NeutralElement();
796#endif
797 }
798 };
799
800
824 template<class _ioElementOperationType, class _scalarVectorElementOperationType>
825 class VioSiVi {
826 public:
827 template<class _ioVectorType, class _inputScalarType, class _inputVectorType>
828 static inline void Run(_ioVectorType & ioVector,
829 const _inputScalarType inputScalar, const _inputVectorType & inputVector)
830 {
831 // check sizes
832 typedef _ioVectorType IoVectorType;
833 typedef typename IoVectorType::OwnerType IoOwnerType;
834 typedef typename IoOwnerType::pointer IoPointerType;
835 typedef typename IoOwnerType::size_type size_type;
836 typedef typename IoOwnerType::stride_type stride_type;
837
838 typedef _inputVectorType InputVectorType;
839 typedef typename InputVectorType::OwnerType InputOwnerType;
840 typedef typename InputOwnerType::const_pointer InputPointerType;
841
842 // retrieve owners
843 IoOwnerType & ioOwner = ioVector.Owner();
844 const InputOwnerType & inputOwner = inputVector.Owner();
845
846 const size_type size = ioOwner.size();
847 if (size != inputOwner.size()) {
848 ThrowException(size, inputOwner.size());
849 }
850
851 const stride_type ioStride = ioOwner.stride();
852 const stride_type inputStride = inputOwner.stride();
853
854 if ((ioStride == 1) && (inputStride == 1)) {
856 ::Run(ioOwner, inputScalar, inputOwner);
857 } else {
858 IoPointerType ioPointer = ioOwner.Pointer();
859 const IoPointerType ioEnd = ioPointer + size * ioStride;
860
861 InputPointerType inputPointer = inputOwner.Pointer();
862
863 for (;
864 ioPointer != ioEnd;
865 ioPointer += ioStride,
866 inputPointer += inputStride) {
867 _ioElementOperationType::Operate(*ioPointer,
868 _scalarVectorElementOperationType::Operate(inputScalar, *inputPointer)
869 );
870 }
871 }
872 }
873 };
874
875
899 template<class _ioElementOperationType, class _vectorElementOperationType>
900 class VioViVi {
901 public:
902 template<class _ioVectorType, class _input1VectorType, class _input2VectorType>
903 static inline void Run(_ioVectorType & ioVector,
904 const _input1VectorType & input1Vector, const _input2VectorType & input2Vector)
905 {
906 // check sizes
907 typedef _ioVectorType IoVectorType;
908 typedef typename IoVectorType::OwnerType IoOwnerType;
909 typedef typename IoOwnerType::pointer IoPointerType;
910 typedef typename IoOwnerType::size_type size_type;
911 typedef typename IoOwnerType::stride_type stride_type;
912
913 typedef _input1VectorType Input1VectorType;
914 typedef typename Input1VectorType::OwnerType Input1OwnerType;
915 typedef typename Input1OwnerType::const_pointer Input1PointerType;
916
917 typedef _input2VectorType Input2VectorType;
918 typedef typename Input2VectorType::OwnerType Input2OwnerType;
919 typedef typename Input2OwnerType::const_pointer Input2PointerType;
920
921 // retrieve owners
922 IoOwnerType & ioOwner = ioVector.Owner();
923 const Input1OwnerType & input1Owner = input1Vector.Owner();
924 const Input2OwnerType & input2Owner = input2Vector.Owner();
925
926 const size_type size = ioOwner.size();
927 if (size != input1Owner.size()) {
928 ThrowException(size, input1Owner.size());
929 } else if (size != input2Owner.size()) {
930 ThrowException(size, input2Owner.size());
931 }
932
933 const stride_type ioStride = ioOwner.stride();
934 const stride_type input1Stride = input1Owner.stride();
935 const stride_type input2Stride = input2Owner.stride();
936
937 if ((ioStride == 1) && (input1Stride == 1) && (input2Stride == 1)) {
939 ::Run(ioOwner, input1Owner, input2Owner);
940 } else {
941 IoPointerType ioPointer = ioOwner.Pointer();
942 const IoPointerType ioEnd = ioPointer + size * ioStride;
943
944 Input1PointerType input1Pointer = input1Owner.Pointer();
945 Input2PointerType input2Pointer = input2Owner.Pointer();
946
947 for (;
948 ioPointer != ioEnd;
949 ioPointer += ioStride,
950 input1Pointer += input1Stride,
951 input2Pointer += input2Stride) {
952 _ioElementOperationType::Operate(*ioPointer,
953 _vectorElementOperationType::Operate(*input1Pointer, *input2Pointer)
954 );
955 }
956 }
957 }
958 };
959
960
986 template<class _incrementalOperationType, class _elementOperationType>
987 class SoViSi {
988 public:
989 typedef typename _incrementalOperationType::OutputType OutputType;
998 template<class _inputVectorType, class _inputScalarType>
999 static inline OutputType Run(const _inputVectorType & inputVector,
1000 const _inputScalarType & inputScalar) {
1001
1002 typedef _inputVectorType InputVectorType;
1003 typedef typename InputVectorType::OwnerType InputOwnerType;
1004 typedef typename InputOwnerType::const_pointer InputPointerType;
1005 typedef typename InputOwnerType::size_type size_type;
1006 typedef typename InputOwnerType::stride_type stride_type;
1007
1008 const InputOwnerType & inputOwner = inputVector.Owner();
1009 const size_type size = inputOwner.size();
1010 OutputType incrementalResult = _incrementalOperationType::NeutralElement();
1011
1012 const stride_type inputStride = inputOwner.stride();
1013
1014 if (inputStride == 1) {
1016 ::Run(inputOwner, inputScalar);
1017 } else {
1018 InputPointerType inputPointer = inputOwner.Pointer();
1019 const InputPointerType inputEnd = inputPointer + size * inputStride;
1020
1021 for (;
1022 inputPointer != inputEnd;
1023 inputPointer += inputStride) {
1024 incrementalResult = _incrementalOperationType::Operate(incrementalResult,
1025 _elementOperationType::Operate(*inputPointer, inputScalar));
1026 }
1027 return incrementalResult;
1028 }
1029 }
1030 };
1031
1033 public:
1042 template<class _inputVectorType>
1043 static void Run(const _inputVectorType & inputVector, typename _inputVectorType::value_type & minValue,
1044 typename _inputVectorType::value_type & maxValue)
1045 {
1046 typedef _inputVectorType InputVectorType;
1047 typedef typename InputVectorType::OwnerType InputOwnerType;
1048 typedef typename InputOwnerType::const_pointer InputPointerType;
1049 typedef typename InputOwnerType::size_type size_type;
1050 typedef typename InputOwnerType::stride_type stride_type;
1051 typedef typename InputOwnerType::value_type value_type;
1052
1053 const InputOwnerType & inputOwner = inputVector.Owner();
1054 InputPointerType inputPointer = inputOwner.Pointer();
1055
1056 if (inputPointer == 0)
1057 return;
1058
1059 const stride_type inputStride = inputOwner.stride();
1060 if (inputStride == 1) {
1061 vctDynamicCompactLoopEngines::MinAndMax::Run(inputOwner, minValue, maxValue);
1062 } else {
1063 const size_type size = inputOwner.size();
1064 const InputPointerType inputEnd = inputPointer + size * inputStride;
1065
1066 value_type minElement, maxElement;
1067 maxElement = minElement = *inputPointer;
1068
1069 for (;
1070 inputPointer != inputEnd;
1071 inputPointer += inputStride)
1072 {
1073 const value_type element = *inputPointer;
1074 if (element < minElement) {
1075 minElement = element;
1076 }
1077 else if (maxElement < element) {
1078 maxElement = element;
1079 }
1080 }
1081
1082 minValue = minElement;
1083 maxValue = maxElement;
1084 }
1085 }
1086 };
1087
1088
1090 public:
1091 template <class _outputVectorType, class _inputVectorType, class _indexVectorType>
1092 static void Run(_outputVectorType & output,
1093 const _inputVectorType & input,
1094 const _indexVectorType & index)
1095 {
1096 // check sizes
1097 typedef _outputVectorType OutputVectorType;
1098 typedef typename OutputVectorType::pointer OutputPointerType;
1099 typedef typename OutputVectorType::size_type size_type;
1100 typedef typename OutputVectorType::stride_type stride_type;
1101
1102 typedef _inputVectorType InputVectorType;
1103 typedef typename InputVectorType::const_pointer InputPointerType;
1104
1105 typedef _indexVectorType IndexVectorType;
1106 typedef typename IndexVectorType::const_pointer IndexPointerType;
1107
1108 const size_type size = output.size();
1109 if (size != index.size()) {
1110 ThrowException(size, index.size());
1111 }
1112
1113 const stride_type outputStride = output.stride();
1114 const stride_type indexStride = index.stride();
1115
1116 OutputPointerType outputPointer = output.Pointer();
1117 const OutputPointerType outputEnd = outputPointer + size * outputStride;
1118
1119 IndexPointerType indexPointer = index.Pointer();
1120 InputPointerType inputPointer;
1121
1122 for (;
1123 outputPointer != outputEnd;
1124 outputPointer += outputStride,
1125 indexPointer += indexStride) {
1126 inputPointer = input.Pointer(*indexPointer);
1127 *outputPointer = *inputPointer;
1128 }
1129 }
1130 };
1131
1132};
1133
1134
1135
1136#endif // _vctDynamicVectorLoopEngines_h
Implement operation of the form for compact containers.
Definition vctDynamicCompactLoopEngines.h:546
static void Run(_inputOutputOwnerType &inputOutputOwner, const _inputOwnerType &inputOwner)
Definition vctDynamicCompactLoopEngines.h:121
static void Run(_inputOutput1OwnerType &inputOutput1Owner, _inputOutput2OwnerType &inputOutput2Owner)
Definition vctDynamicCompactLoopEngines.h:163
static void Run(_inputOutputOwnerType &inputOutputOwner)
Definition vctDynamicCompactLoopEngines.h:367
Implement operation of the form for compact containers.
Definition vctDynamicCompactLoopEngines.h:497
static void Run(_inputOutputOwnerType &inputOutputOwner, const _inputScalarType inputScalar)
Definition vctDynamicCompactLoopEngines.h:289
static void Run(_outputOwnerType &outputOwner, const _input1OwnerType &input1Owner, const _input2OwnerType &input2Owner)
Definition vctDynamicCompactLoopEngines.h:75
static void Run(_outputOwnerType &outputOwner, const _inputOwnerType &inputOwner)
Definition vctDynamicCompactLoopEngines.h:325
static void Run(_outputOwnerType &outputOwner, const _inputOwnerType &inputOwner, const _inputScalarType inputScalar)
Definition vctDynamicCompactLoopEngines.h:204
static void Run(_outputOwnerType &outputOwner, const _inputScalarType inputScalar, const _inputOwnerType &inputOwner)
Definition vctDynamicCompactLoopEngines.h:246
static void Run(const _inputOwnerType &inputOwner, typename _inputOwnerType::value_type &minValue, typename _inputOwnerType::value_type &maxValue)
Definition vctDynamicCompactLoopEngines.h:630
static OutputType Run(const _input1OwnerType &input1Owner, const _input2OwnerType &input2Owner)
Definition vctDynamicCompactLoopEngines.h:450
static OutputType Run(const _inputOwnerType &inputOwner)
Definition vctDynamicCompactLoopEngines.h:406
Implement operation of the form for compact containers.
Definition vctDynamicCompactLoopEngines.h:598
Definition vctDynamicVectorLoopEngines.h:1032
static void Run(const _inputVectorType &inputVector, typename _inputVectorType::value_type &minValue, typename _inputVectorType::value_type &maxValue)
Definition vctDynamicVectorLoopEngines.h:1043
Definition vctDynamicVectorLoopEngines.h:1089
static void Run(_outputVectorType &output, const _inputVectorType &input, const _indexVectorType &index)
Definition vctDynamicVectorLoopEngines.h:1092
Implement operation of the form for dynamic vectors.
Definition vctDynamicVectorLoopEngines.h:669
_incrementalOperationType::OutputType OutputType
Definition vctDynamicVectorLoopEngines.h:671
static OutputType Run(const _inputVectorType &inputVector)
Definition vctDynamicVectorLoopEngines.h:677
Implement operation of the form for dynamic vectors.
Definition vctDynamicVectorLoopEngines.h:987
_incrementalOperationType::OutputType OutputType
Definition vctDynamicVectorLoopEngines.h:989
static OutputType Run(const _inputVectorType &inputVector, const _inputScalarType &inputScalar)
Definition vctDynamicVectorLoopEngines.h:999
Implement operation of the form for dynamic vectors.
Definition vctDynamicVectorLoopEngines.h:734
static OutputType Run(const _input1VectorType &input1Vector, const _input2VectorType &input2Vector)
Definition vctDynamicVectorLoopEngines.h:746
_incrementalOperationType::OutputType OutputType
Definition vctDynamicVectorLoopEngines.h:736
Implement operation of the form for dynamic vectors.
Definition vctDynamicVectorLoopEngines.h:611
static void Run(_inputOutputVectorType &inputOutputVector)
Definition vctDynamicVectorLoopEngines.h:618
Implement operation of the form for dynamic vectors.
Definition vctDynamicVectorLoopEngines.h:481
static void Run(_inputOutputVectorType &inputOutputVector, const _inputScalarType inputScalar)
Definition vctDynamicVectorLoopEngines.h:489
Implement operation of the form for dynamic vectors.
Definition vctDynamicVectorLoopEngines.h:825
static void Run(_ioVectorType &ioVector, const _inputScalarType inputScalar, const _inputVectorType &inputVector)
Definition vctDynamicVectorLoopEngines.h:828
Implement operation of the form for dynamic vectors.
Definition vctDynamicVectorLoopEngines.h:183
static void Run(_inputOutputVectorType &inputOutputVector, const _inputVectorType &inputVector)
Definition vctDynamicVectorLoopEngines.h:191
Implement operation of the form for dynamic vectors.
Definition vctDynamicVectorLoopEngines.h:900
static void Run(_ioVectorType &ioVector, const _input1VectorType &input1Vector, const _input2VectorType &input2Vector)
Definition vctDynamicVectorLoopEngines.h:903
Implement operation of the form for dynamic vectors.
Definition vctDynamicVectorLoopEngines.h:257
static void Run(_inputOutput1VectorType &inputOutput1Vector, _inputOutput2VectorType &inputOutput2Vector)
Definition vctDynamicVectorLoopEngines.h:265
Implement operation of the form for dynamic vectors.
Definition vctDynamicVectorLoopEngines.h:405
static void Run(_outputVectorType &outputVector, const _inputScalarType inputScalar, const _inputVectorType &inputVector)
Definition vctDynamicVectorLoopEngines.h:414
Implement operation of the form for dynamic vectors.
Definition vctDynamicVectorLoopEngines.h:537
static void Run(_outputVectorType &outputVector, const _inputVectorType &inputVector)
Definition vctDynamicVectorLoopEngines.h:545
Implement operation of the form for dynamic vectors.
Definition vctDynamicVectorLoopEngines.h:330
static void Run(_outputVectorType &outputVector, const _inputVectorType &inputVector, const _inputScalarType inputScalar)
Definition vctDynamicVectorLoopEngines.h:339
Implement operation of the form for dynamic vectors.
Definition vctDynamicVectorLoopEngines.h:98
static void Run(_outputVectorType &outputVector, const _input1VectorType &input1Vector, const _input2VectorType &input2Vector)
Definition vctDynamicVectorLoopEngines.h:106
Container class for the vector loop based engines.
Definition vctDynamicVectorLoopEngines.h:64
static void ThrowException(const size_t expected, const size_t received) CISST_THROW(std
Definition vctDynamicVectorLoopEngines.h:70
Portability across compilers and operating systems tools.
#define CISST_THROW(exceptionParameter)
Somewhat portable compilation warning message. This works with very recent versions of gcc (4....
Definition cmnPortability.h:559
Declaration of the template function cmnThrow.
void cmnThrow(const _exceptionType &except, cmnLogLevel lod=CMN_LOG_LEVEL_INIT_ERROR)
Definition cmnThrow.h:76
Declaration of vctDynamicCompactLoopEngines.
size_type size(void) const
Definition vctDynamicConstMatrixBase.h:228