cisst-saw
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
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 
6  Author(s): Ofri Sadowsky, Anton Deguet
7  Created on: 2004-07-01
8 
9  (C) Copyright 2004-2013 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 _vctDynamicVectorLoopEngines_h
23 #define _vctDynamicVectorLoopEngines_h
24 
31 #include <cisstCommon/cmnThrow.h>
33 
67 
68  public:
69 
72  inline static void ThrowException(void) throw(std::runtime_error) {
73  cmnThrow(std::runtime_error("vctDynamicVectorLoopEngines: Sizes of vectors don't match"));
74  }
75 
76 
96  template<class _elementOperationType>
97  class VoViVi {
98  public:
104  template<class _outputVectorType, class _input1VectorType, class _input2VectorType>
105  static inline void Run(_outputVectorType & outputVector,
106  const _input1VectorType & input1Vector,
107  const _input2VectorType & input2Vector) {
108  // check sizes
109  typedef _outputVectorType OutputVectorType;
110  typedef typename OutputVectorType::OwnerType OutputOwnerType;
111  typedef typename OutputOwnerType::pointer OutputPointerType;
112  typedef typename OutputOwnerType::size_type size_type;
113  typedef typename OutputOwnerType::stride_type stride_type;
114 
115  typedef _input1VectorType Input1VectorType;
116  typedef typename Input1VectorType::OwnerType Input1OwnerType;
117  typedef typename Input1OwnerType::const_pointer Input1PointerType;
118 
119  typedef _input2VectorType Input2VectorType;
120  typedef typename Input2VectorType::OwnerType Input2OwnerType;
121  typedef typename Input2OwnerType::const_pointer Input2PointerType;
122 
123  // retrieve owners
124  const Input1OwnerType & input1Owner = input1Vector.Owner();
125  const Input2OwnerType & input2Owner = input2Vector.Owner();
126  OutputOwnerType & outputOwner = outputVector.Owner();
127 
128  const size_type size = outputOwner.size();
129  if ((size != input1Owner.size())
130  || (size != input2Owner.size())) {
131  ThrowException();
132  }
133 
134  // if all are compact
135  const stride_type outputStride = outputOwner.stride();
136  const stride_type input1Stride = input1Owner.stride();
137  const stride_type input2Stride = input2Owner.stride();
138 
139  if ((outputStride == 1) && (input1Stride == 1) && (input2Stride == 1)) {
140  vctDynamicCompactLoopEngines::CoCiCi<_elementOperationType>::Run(outputOwner, input1Owner, input2Owner);
141  } else {
142  // otherwise
143  OutputPointerType outputPointer = outputOwner.Pointer();
144  const OutputPointerType outputEnd = outputPointer + size * outputStride;
145 
146  Input1PointerType input1Pointer = input1Owner.Pointer();
147  Input2PointerType input2Pointer = input2Owner.Pointer();
148 
149  for (;
150  outputPointer != outputEnd;
151  outputPointer += outputStride,
152  input1Pointer += input1Stride,
153  input2Pointer += input2Stride) {
154  *outputPointer = _elementOperationType::Operate(*input1Pointer, *input2Pointer);
155  }
156  }
157  }
158  };
159 
160 
180  template<class _elementOperationType>
181  class VioVi {
182  public:
188  template<class _inputOutputVectorType, class _inputVectorType>
189  static void Run(_inputOutputVectorType & inputOutputVector,
190  const _inputVectorType & inputVector) {
191  // check size
192  typedef _inputOutputVectorType InputOutputVectorType;
193  typedef typename InputOutputVectorType::OwnerType InputOutputOwnerType;
194  typedef typename InputOutputOwnerType::pointer InputOutputPointerType;
197 
198  typedef _inputVectorType InputVectorType;
199  typedef typename InputVectorType::OwnerType InputOwnerType;
200  typedef typename InputOwnerType::const_pointer InputPointerType;
201 
202  // retrieve owners
203  const InputOwnerType & inputOwner = inputVector.Owner();
204  InputOutputOwnerType & inputOutputOwner = inputOutputVector.Owner();
205 
206  const size_type size = inputOutputOwner.size();
207  if (size != inputOwner.size()) {
208  ThrowException();
209  }
210 
211  const stride_type inputOutputStride = inputOutputOwner.stride();
212  const stride_type inputStride = inputOwner.stride();
213 
214  if ((inputOutputStride == 1) && (inputStride == 1)) {
216  } else {
217  // otherwise
218  InputOutputPointerType inputOutputPointer = inputOutputOwner.Pointer();
219  const InputOutputPointerType inputOutputEnd = inputOutputPointer + size * inputOutputStride;
220 
221  InputPointerType inputPointer = inputOwner.Pointer();
222 
223  for (;
224  inputOutputPointer != inputOutputEnd;
225  inputOutputPointer += inputOutputStride,
226  inputPointer += inputStride) {
227  *inputOutputPointer = _elementOperationType::Operate(*inputOutputPointer, *inputPointer);
228  }
229  }
230  }
231  };
232 
233 
254  template<class _elementOperationType>
255  class VioVio {
256  public:
262  template<class _inputOutput1VectorType, class _inputOutput2VectorType>
263  static void Run(_inputOutput1VectorType & inputOutput1Vector,
264  _inputOutput2VectorType & inputOutput2Vector) {
265  // check size
266  typedef _inputOutput1VectorType InputOutput1VectorType;
267  typedef typename InputOutput1VectorType::OwnerType InputOutput1OwnerType;
268  typedef typename InputOutput1OwnerType::pointer InputOutput1PointerType;
271 
272  typedef _inputOutput2VectorType InputOutput2VectorType;
273  typedef typename InputOutput2VectorType::OwnerType InputOutput2OwnerType;
274  typedef typename InputOutput2OwnerType::pointer InputOutput2PointerType;
275 
276  // retrieve owners
277  InputOutput1OwnerType & inputOutput1Owner = inputOutput1Vector.Owner();
278  InputOutput2OwnerType & inputOutput2Owner = inputOutput2Vector.Owner();
279 
280  const size_type size = inputOutput1Owner.size();
281  if (size != inputOutput2Owner.size()) {
282  ThrowException();
283  }
284 
285  const stride_type inputOutput1Stride = inputOutput1Owner.stride();
286  const stride_type inputOutput2Stride = inputOutput2Owner.stride();
287 
288  if ((inputOutput1Stride == 1) && (inputOutput2Stride == 1)) {
289  vctDynamicCompactLoopEngines::CioCio<_elementOperationType>::Run(inputOutput1Owner, inputOutput2Owner);
290  } else {
291  // otherwise
292  InputOutput1PointerType inputOutput1Pointer = inputOutput1Owner.Pointer();
293  const InputOutput1PointerType inputOutput1End = inputOutput1Pointer + size * inputOutput1Stride;
294 
295  InputOutput2PointerType inputOutput2Pointer = inputOutput2Owner.Pointer();
296 
297  for (;
298  inputOutput1Pointer != inputOutput1End;
299  inputOutput1Pointer += inputOutput1Stride,
300  inputOutput2Pointer += inputOutput2Stride) {
301  _elementOperationType::Operate(*inputOutput1Pointer, *inputOutput2Pointer);
302  }
303  }
304  }
305  };
306 
307 
327  template<class _elementOperationType>
328  class VoViSi {
329  public:
336  template<class _outputVectorType, class _inputVectorType, class _inputScalarType>
337  static inline void Run(_outputVectorType & outputVector,
338  const _inputVectorType & inputVector,
339  const _inputScalarType inputScalar) {
340  // check sizes
341  typedef _outputVectorType OutputVectorType;
342  typedef typename OutputVectorType::OwnerType OutputOwnerType;
343  typedef typename OutputOwnerType::pointer OutputPointerType;
344  typedef typename OutputOwnerType::size_type size_type;
345  typedef typename OutputOwnerType::stride_type stride_type;
346 
347  typedef _inputVectorType InputVectorType;
348  typedef typename InputVectorType::OwnerType InputOwnerType;
349  typedef typename InputOwnerType::const_pointer InputPointerType;
350 
351  // retrieve owners
352  const InputOwnerType & inputOwner = inputVector.Owner();
353  OutputOwnerType & outputOwner = outputVector.Owner();
354 
355  const size_type size = outputOwner.size();
356  if (size != inputOwner.size()) {
357  ThrowException();
358  }
359 
360  const stride_type outputStride = outputOwner.stride();
361  const stride_type inputStride = inputOwner.stride();
362 
363  if ((outputStride == 1) && (inputStride == 1)) {
364  vctDynamicCompactLoopEngines::CoCiSi<_elementOperationType>::Run(outputOwner, inputOwner, inputScalar);
365  } else {
366  // otherwise
367  OutputPointerType outputPointer = outputOwner.Pointer();
368  const OutputPointerType outputEnd = outputPointer + size * outputStride;
369 
370  InputPointerType inputPointer = inputOwner.Pointer();
371 
372  for (;
373  outputPointer != outputEnd;
374  outputPointer += outputStride,
375  inputPointer += inputStride) {
376  *outputPointer = _elementOperationType::Operate(*inputPointer, inputScalar);
377  }
378  }
379  }
380  };
381 
382 
402  template<class _elementOperationType>
403  class VoSiVi {
404  public:
411  template<class _outputVectorType, class _inputScalarType, class _inputVectorType>
412  static inline void Run(_outputVectorType & outputVector,
413  const _inputScalarType inputScalar,
414  const _inputVectorType & inputVector) {
415  // check sizes
416  typedef _outputVectorType OutputVectorType;
417  typedef typename OutputVectorType::OwnerType OutputOwnerType;
418  typedef typename OutputOwnerType::pointer OutputPointerType;
419  typedef typename OutputOwnerType::size_type size_type;
420  typedef typename OutputOwnerType::stride_type stride_type;
421 
422  typedef _inputVectorType InputVectorType;
423  typedef typename InputVectorType::OwnerType InputOwnerType;
424  typedef typename InputOwnerType::const_pointer InputPointerType;
425 
426  // retrieve owners
427  const InputOwnerType & inputOwner = inputVector.Owner();
428  OutputOwnerType & outputOwner = outputVector.Owner();
429 
430  const size_type size = outputOwner.size();
431  if (size != inputOwner.size()) {
432  ThrowException();
433  }
434 
435  const stride_type outputStride = outputOwner.stride();
436  const stride_type inputStride = inputOwner.stride();
437 
438  if ((outputStride == 1) && (inputStride == 1)) {
439  vctDynamicCompactLoopEngines::CoSiCi<_elementOperationType>::Run(outputOwner, inputScalar, inputOwner);
440  } else {
441  // otherwise
442  OutputPointerType outputPointer = outputOwner.Pointer();
443  const OutputPointerType outputEnd = outputPointer + size * outputStride;
444 
445  InputPointerType inputPointer = inputOwner.Pointer();
446 
447  for (;
448  outputPointer != outputEnd;
449  outputPointer += outputStride,
450  inputPointer += inputStride) {
451  *outputPointer = _elementOperationType::Operate(inputScalar, *inputPointer);
452  }
453  }
454  }
455  };
456 
457 
478  template<class _elementOperationType>
479  class VioSi {
480  public:
486  template<class _inputOutputVectorType, class _inputScalarType>
487  static void Run(_inputOutputVectorType & inputOutputVector,
488  const _inputScalarType inputScalar) {
489 
490  typedef _inputOutputVectorType InputOutputVectorType;
491  typedef typename InputOutputVectorType::OwnerType InputOutputOwnerType;
492  typedef typename InputOutputOwnerType::pointer InputOutputPointerType;
495 
496  InputOutputOwnerType & inputOutputOwner = inputOutputVector.Owner();
497  const size_type size = inputOutputOwner.size();
498  const stride_type inputOutputStride = inputOutputOwner.stride();
499 
500  if (inputOutputStride == 1) {
502  } else {
503  InputOutputPointerType inputOutputPointer = inputOutputOwner.Pointer();
504  const InputOutputPointerType inputOutputEnd = inputOutputPointer + size * inputOutputStride;
505 
506  for (;
507  inputOutputPointer != inputOutputEnd;
508  inputOutputPointer += inputOutputStride) {
509  _elementOperationType::Operate(*inputOutputPointer, inputScalar);
510  }
511  }
512  }
513  };
514 
515 
534  template<class _elementOperationType>
535  class VoVi {
536  public:
542  template<class _outputVectorType, class _inputVectorType>
543  static inline void Run(_outputVectorType & outputVector,
544  const _inputVectorType & inputVector) {
545  // check sizes
546  typedef _outputVectorType OutputVectorType;
547  typedef typename OutputVectorType::OwnerType OutputOwnerType;
548  typedef typename OutputOwnerType::pointer OutputPointerType;
549  typedef typename OutputOwnerType::size_type size_type;
550  typedef typename OutputOwnerType::stride_type stride_type;
551 
552  typedef _inputVectorType InputVectorType;
553  typedef typename InputVectorType::OwnerType InputOwnerType;
554  typedef typename InputOwnerType::const_pointer InputPointerType;
555 
556  // retrieve owners
557  const InputOwnerType & inputOwner = inputVector.Owner();
558  OutputOwnerType & outputOwner = outputVector.Owner();
559 
560  const size_type size = outputOwner.size();
561  if (size != inputOwner.size()) {
562  ThrowException();
563  }
564 
565  // if both are compact
566  const stride_type outputStride = outputOwner.stride();
567  const stride_type inputStride = inputOwner.stride();
568 
569  if ((outputStride == 1) && (inputStride == 1)) {
571  } else {
572  // otherwise
573  OutputPointerType outputPointer = outputOwner.Pointer();
574  const OutputPointerType outputEnd = outputPointer + size * outputStride;
575 
576  InputPointerType inputPointer = inputOwner.Pointer();
577 
578  for (;
579  outputPointer != outputEnd;
580  outputPointer += outputStride,
581  inputPointer += inputStride) {
582  *outputPointer = _elementOperationType::Operate(*inputPointer);
583  }
584  }
585  }
586  };
587 
588 
589 
608  template<class _elementOperationType>
609  class Vio {
610  public:
615  template<class _inputOutputVectorType>
616  static inline void Run(_inputOutputVectorType & inputOutputVector) {
617 
618  typedef _inputOutputVectorType InputOutputVectorType;
619  typedef typename InputOutputVectorType::OwnerType InputOutputOwnerType;
620  typedef typename InputOutputOwnerType::pointer InputOutputPointerType;
623 
624  InputOutputOwnerType & inputOutputOwner = inputOutputVector.Owner();
625  const size_type size = inputOutputOwner.size();
626  const stride_type inputOutputStride = inputOutputOwner.stride();
627 
628  if (inputOutputStride == 1) {
630  } else {
631  InputOutputPointerType inputOutputPointer = inputOutputOwner.Pointer();
632  const InputOutputPointerType inputOutputEnd = inputOutputPointer + size * inputOutputStride;
633 
634  for (;
635  inputOutputPointer != inputOutputEnd;
636  inputOutputPointer += inputOutputStride) {
637  _elementOperationType::Operate(*inputOutputPointer);
638  }
639  }
640  }
641  };
642 
643 
644 
666  template<class _incrementalOperationType, class _elementOperationType>
667  class SoVi {
668  public:
669  typedef typename _incrementalOperationType::OutputType OutputType;
674  template<class _inputVectorType>
675  static OutputType Run(const _inputVectorType & inputVector) {
676 
677  typedef _inputVectorType InputVectorType;
678  typedef typename InputVectorType::OwnerType InputOwnerType;
679  typedef typename InputOwnerType::const_pointer InputPointerType;
680  typedef typename InputOwnerType::size_type size_type;
681  typedef typename InputOwnerType::stride_type stride_type;
682 
683  const InputOwnerType & inputOwner = inputVector.Owner();
684  const size_type size = inputOwner.size();
685  const stride_type inputStride = inputOwner.stride();
686 
687  if (inputStride == 1) {
689  } else {
690  OutputType incrementalResult = _incrementalOperationType::NeutralElement();
691  InputPointerType inputPointer = inputOwner.Pointer();
692  const InputPointerType inputEnd = inputPointer + size * inputStride;
693 
694  for (;
695  inputPointer != inputEnd;
696  inputPointer += inputStride) {
697  incrementalResult = _incrementalOperationType::Operate(incrementalResult,
698  _elementOperationType::Operate(*inputPointer));
699  }
700  return incrementalResult;
701  }
702  }
703  };
704 
705 
731  template<class _incrementalOperationType, class _elementOperationType>
732  class SoViVi {
733  public:
734  typedef typename _incrementalOperationType::OutputType OutputType;
743  template<class _input1VectorType, class _input2VectorType>
744  static inline OutputType Run(const _input1VectorType & input1Vector,
745  const _input2VectorType & input2Vector) {
746  // check sizes
747  typedef _input1VectorType Input1VectorType;
748  typedef typename Input1VectorType::OwnerType Input1OwnerType;
749  typedef typename Input1OwnerType::const_pointer Input1PointerType;
750  typedef typename Input1OwnerType::size_type size_type;
751  typedef typename Input1OwnerType::stride_type stride_type;
752 
753  typedef _input2VectorType Input2VectorType;
754  typedef typename Input2VectorType::OwnerType Input2OwnerType;
755  typedef typename Input2OwnerType::const_pointer Input2PointerType;
756 
757  // retrieve owners
758  const Input1OwnerType & input1Owner = input1Vector.Owner();
759  const Input2OwnerType & input2Owner = input2Vector.Owner();
760 
761  const size_type size = input1Owner.size();
762  if (size != input2Owner.size()) {
763  ThrowException();
764  }
765 
766  const stride_type input1Stride = input1Owner.stride();
767  const stride_type input2Stride = input2Owner.stride();
768 
769  if ((input1Stride == 1) && (input2Stride == 1)) {
771  } else {
772  // otherwise
773  OutputType incrementalResult = _incrementalOperationType::NeutralElement();
774  Input1PointerType input1Pointer = input1Owner.Pointer();
775  const Input1PointerType input1End = input1Pointer + size * input1Stride;
776 
777  Input2PointerType input2Pointer = input2Owner.Pointer();
778 
779  for (;
780  input1Pointer != input1End;
781  input1Pointer += input1Stride,
782  input2Pointer += input2Stride) {
783  incrementalResult = _incrementalOperationType::Operate(incrementalResult,
784  _elementOperationType::Operate(*input1Pointer,
785  *input2Pointer));
786  }
787  return incrementalResult;
788  }
789  // last return added to avoid buggy warning with gcc 4.0,
790  // this should never be evaluated
791  return _incrementalOperationType::NeutralElement();
792  }
793  };
794 
795 
819  template<class _ioElementOperationType, class _scalarVectorElementOperationType>
820  class VioSiVi {
821  public:
822  template<class _ioVectorType, class _inputScalarType, class _inputVectorType>
823  static inline void Run(_ioVectorType & ioVector,
824  const _inputScalarType inputScalar, const _inputVectorType & inputVector)
825  {
826  // check sizes
827  typedef _ioVectorType IoVectorType;
828  typedef typename IoVectorType::OwnerType IoOwnerType;
829  typedef typename IoOwnerType::pointer IoPointerType;
830  typedef typename IoOwnerType::size_type size_type;
831  typedef typename IoOwnerType::stride_type stride_type;
832 
833  typedef _inputVectorType InputVectorType;
834  typedef typename InputVectorType::OwnerType InputOwnerType;
835  typedef typename InputOwnerType::const_pointer InputPointerType;
836 
837  // retrieve owners
838  IoOwnerType & ioOwner = ioVector.Owner();
839  const InputOwnerType & inputOwner = inputVector.Owner();
840 
841  const size_type size = ioOwner.size();
842  if (size != inputOwner.size()) {
843  ThrowException();
844  }
845 
846  const stride_type ioStride = ioOwner.stride();
847  const stride_type inputStride = inputOwner.stride();
848 
849  if ((ioStride == 1) && (inputStride == 1)) {
851  ::Run(ioOwner, inputScalar, inputOwner);
852  } else {
853  IoPointerType ioPointer = ioOwner.Pointer();
854  const IoPointerType ioEnd = ioPointer + size * ioStride;
855 
856  InputPointerType inputPointer = inputOwner.Pointer();
857 
858  for (;
859  ioPointer != ioEnd;
860  ioPointer += ioStride,
861  inputPointer += inputStride) {
862  _ioElementOperationType::Operate(*ioPointer,
863  _scalarVectorElementOperationType::Operate(inputScalar, *inputPointer)
864  );
865  }
866  }
867  }
868  };
869 
870 
894  template<class _ioElementOperationType, class _vectorElementOperationType>
895  class VioViVi {
896  public:
897  template<class _ioVectorType, class _input1VectorType, class _input2VectorType>
898  static inline void Run(_ioVectorType & ioVector,
899  const _input1VectorType & input1Vector, const _input2VectorType & input2Vector)
900  {
901  // check sizes
902  typedef _ioVectorType IoVectorType;
903  typedef typename IoVectorType::OwnerType IoOwnerType;
904  typedef typename IoOwnerType::pointer IoPointerType;
905  typedef typename IoOwnerType::size_type size_type;
906  typedef typename IoOwnerType::stride_type stride_type;
907 
908  typedef _input1VectorType Input1VectorType;
909  typedef typename Input1VectorType::OwnerType Input1OwnerType;
910  typedef typename Input1OwnerType::const_pointer Input1PointerType;
911 
912  typedef _input2VectorType Input2VectorType;
913  typedef typename Input2VectorType::OwnerType Input2OwnerType;
914  typedef typename Input2OwnerType::const_pointer Input2PointerType;
915 
916  // retrieve owners
917  IoOwnerType & ioOwner = ioVector.Owner();
918  const Input1OwnerType & input1Owner = input1Vector.Owner();
919  const Input2OwnerType & input2Owner = input2Vector.Owner();
920 
921  const size_type size = ioOwner.size();
922  if ((size != input1Owner.size())
923  || (size != input2Owner.size())) {
924  ThrowException();
925  }
926 
927  const stride_type ioStride = ioOwner.stride();
928  const stride_type input1Stride = input1Owner.stride();
929  const stride_type input2Stride = input2Owner.stride();
930 
931  if ((ioStride == 1) && (input1Stride == 1) && (input2Stride == 1)) {
933  ::Run(ioOwner, input1Owner, input2Owner);
934  } else {
935  IoPointerType ioPointer = ioOwner.Pointer();
936  const IoPointerType ioEnd = ioPointer + size * ioStride;
937 
938  Input1PointerType input1Pointer = input1Owner.Pointer();
939  Input2PointerType input2Pointer = input2Owner.Pointer();
940 
941  for (;
942  ioPointer != ioEnd;
943  ioPointer += ioStride,
944  input1Pointer += input1Stride,
945  input2Pointer += input2Stride) {
946  _ioElementOperationType::Operate(*ioPointer,
947  _vectorElementOperationType::Operate(*input1Pointer, *input2Pointer)
948  );
949  }
950  }
951  }
952  };
953 
954 
980  template<class _incrementalOperationType, class _elementOperationType>
981  class SoViSi {
982  public:
983  typedef typename _incrementalOperationType::OutputType OutputType;
992  template<class _inputVectorType, class _inputScalarType>
993  static inline OutputType Run(const _inputVectorType & inputVector,
994  const _inputScalarType & inputScalar) {
995 
996  typedef _inputVectorType InputVectorType;
997  typedef typename InputVectorType::OwnerType InputOwnerType;
998  typedef typename InputOwnerType::const_pointer InputPointerType;
999  typedef typename InputOwnerType::size_type size_type;
1000  typedef typename InputOwnerType::stride_type stride_type;
1001 
1002  const InputOwnerType & inputOwner = inputVector.Owner();
1003  const size_type size = inputOwner.size();
1004  OutputType incrementalResult = _incrementalOperationType::NeutralElement();
1005 
1006  const stride_type inputStride = inputOwner.stride();
1007 
1008  if (inputStride == 1) {
1010  ::Run(inputOwner, inputScalar);
1011  } else {
1012  InputPointerType inputPointer = inputOwner.Pointer();
1013  const InputPointerType inputEnd = inputPointer + size * inputStride;
1014 
1015  for (;
1016  inputPointer != inputEnd;
1017  inputPointer += inputStride) {
1018  incrementalResult = _incrementalOperationType::Operate(incrementalResult,
1019  _elementOperationType::Operate(*inputPointer, inputScalar));
1020  }
1021  return incrementalResult;
1022  }
1023  }
1024  };
1025 
1026  class MinAndMax {
1027  public:
1036  template<class _inputVectorType>
1037  static void Run(const _inputVectorType & inputVector, typename _inputVectorType::value_type & minValue,
1038  typename _inputVectorType::value_type & maxValue)
1039  {
1040  typedef _inputVectorType InputVectorType;
1041  typedef typename InputVectorType::OwnerType InputOwnerType;
1042  typedef typename InputOwnerType::const_pointer InputPointerType;
1043  typedef typename InputOwnerType::size_type size_type;
1044  typedef typename InputOwnerType::stride_type stride_type;
1045  typedef typename InputOwnerType::value_type value_type;
1046 
1047  const InputOwnerType & inputOwner = inputVector.Owner();
1048  InputPointerType inputPointer = inputOwner.Pointer();
1049 
1050  if (inputPointer == 0)
1051  return;
1052 
1053  const stride_type inputStride = inputOwner.stride();
1054  if (inputStride == 1) {
1055  vctDynamicCompactLoopEngines::MinAndMax::Run(inputOwner, minValue, maxValue);
1056  } else {
1057  const size_type size = inputOwner.size();
1058  const InputPointerType inputEnd = inputPointer + size * inputStride;
1059 
1060  value_type minElement, maxElement;
1061  maxElement = minElement = *inputPointer;
1062 
1063  for (;
1064  inputPointer != inputEnd;
1065  inputPointer += inputStride)
1066  {
1067  const value_type element = *inputPointer;
1068  if (element < minElement) {
1069  minElement = element;
1070  }
1071  else if (maxElement < element) {
1072  maxElement = element;
1073  }
1074  }
1075 
1076  minValue = minElement;
1077  maxValue = maxElement;
1078  }
1079  }
1080  };
1081 
1082 
1084  public:
1085  template <class _outputVectorType, class _inputVectorType, class _indexVectorType>
1086  static void Run(_outputVectorType & output,
1087  const _inputVectorType & input,
1088  const _indexVectorType & index)
1089  {
1090  // check sizes
1091  typedef _outputVectorType OutputVectorType;
1092  typedef typename OutputVectorType::pointer OutputPointerType;
1093  typedef typename OutputVectorType::size_type size_type;
1094  typedef typename OutputVectorType::stride_type stride_type;
1095 
1096  typedef _inputVectorType InputVectorType;
1097  typedef typename InputVectorType::const_pointer InputPointerType;
1098 
1099  typedef _indexVectorType IndexVectorType;
1100  typedef typename IndexVectorType::const_pointer IndexPointerType;
1101 
1102  const size_type size = output.size();
1103  if (size != index.size()) {
1104  ThrowException();
1105  }
1106 
1107  const stride_type outputStride = output.stride();
1108  const stride_type indexStride = index.stride();
1109 
1110  OutputPointerType outputPointer = output.Pointer();
1111  const OutputPointerType outputEnd = outputPointer + size * outputStride;
1112 
1113  IndexPointerType indexPointer = index.Pointer();
1114  InputPointerType inputPointer;
1115 
1116  for (;
1117  outputPointer != outputEnd;
1118  outputPointer += outputStride,
1119  indexPointer += indexStride) {
1120  inputPointer = input.Pointer(*indexPointer);
1121  *outputPointer = *inputPointer;
1122  }
1123  }
1124  };
1125 
1126 };
1127 
1128 
1129 
1130 #endif // _vctDynamicVectorLoopEngines_h
1131 
Implement operation of the form for dynamic vectors.
Definition: vctDynamicVectorLoopEngines.h:667
static OutputType Run(const _inputVectorType &inputVector, const _inputScalarType &inputScalar)
Definition: vctDynamicVectorLoopEngines.h:993
static OutputType Run(const _inputOwnerType &inputOwner)
Definition: vctDynamicCompactLoopEngines.h:406
static void Run(_inputOutputOwnerType &inputOutputOwner)
Definition: vctDynamicCompactLoopEngines.h:367
static void Run(_outputOwnerType &outputOwner, const _inputOwnerType &inputOwner)
Definition: vctDynamicCompactLoopEngines.h:325
Implement operation of the form for dynamic vectors.
Definition: vctDynamicVectorLoopEngines.h:328
Definition: vctDynamicVectorLoopEngines.h:1026
static void Run(_outputVectorType &outputVector, const _inputVectorType &inputVector, const _inputScalarType inputScalar)
Definition: vctDynamicVectorLoopEngines.h:337
static void Run(_outputVectorType &outputVector, const _input1VectorType &input1Vector, const _input2VectorType &input2Vector)
Definition: vctDynamicVectorLoopEngines.h:105
Portability across compilers and operating systems tools.
static void Run(_outputOwnerType &outputOwner, const _inputScalarType inputScalar, const _inputOwnerType &inputOwner)
Definition: vctDynamicCompactLoopEngines.h:246
Implement operation of the form for dynamic vectors.
Definition: vctDynamicVectorLoopEngines.h:479
static void Run(_inputOutputOwnerType &inputOutputOwner, const _inputScalarType inputScalar)
Definition: vctDynamicCompactLoopEngines.h:289
_incrementalOperationType::OutputType OutputType
Definition: vctDynamicVectorLoopEngines.h:983
_incrementalOperationType::OutputType OutputType
Definition: vctDynamicVectorLoopEngines.h:669
static OutputType Run(const _input1VectorType &input1Vector, const _input2VectorType &input2Vector)
Definition: vctDynamicVectorLoopEngines.h:744
static OutputType Run(const _input1OwnerType &input1Owner, const _input2OwnerType &input2Owner)
Definition: vctDynamicCompactLoopEngines.h:450
static void Run(_inputOutputOwnerType &inputOutputOwner, const _inputOwnerType &inputOwner)
Definition: vctDynamicCompactLoopEngines.h:121
Implement operation of the form for dynamic vectors.
Definition: vctDynamicVectorLoopEngines.h:609
Implement operation of the form for dynamic vectors.
Definition: vctDynamicVectorLoopEngines.h:535
static void Run(_ioVectorType &ioVector, const _input1VectorType &input1Vector, const _input2VectorType &input2Vector)
Definition: vctDynamicVectorLoopEngines.h:898
size_t size_type
Definition: vctContainerTraits.h:35
Declaration of vctDynamicCompactLoopEngines.
static void Run(_outputVectorType &outputVector, const _inputScalarType inputScalar, const _inputVectorType &inputVector)
Definition: vctDynamicVectorLoopEngines.h:412
static void Run(_inputOutput1OwnerType &inputOutput1Owner, _inputOutput2OwnerType &inputOutput2Owner)
Definition: vctDynamicCompactLoopEngines.h:163
static void Run(_inputOutputVectorType &inputOutputVector)
Definition: vctDynamicVectorLoopEngines.h:616
Implement operation of the form for dynamic vectors.
Definition: vctDynamicVectorLoopEngines.h:895
Implement operation of the form for dynamic vectors.
Definition: vctDynamicVectorLoopEngines.h:820
static void Run(_ioOwnerType &ioOwner, const _input1OwnerType &input1Owner, const _input2OwnerType &input2Owner)
Definition: vctDynamicCompactLoopEngines.h:549
static OutputType Run(const _inputVectorType &inputVector)
Definition: vctDynamicVectorLoopEngines.h:675
Implement operation of the form for dynamic vectors.
Definition: vctDynamicVectorLoopEngines.h:255
Implement operation of the form for dynamic vectors.
Definition: vctDynamicVectorLoopEngines.h:981
static void Run(_inputOutput1VectorType &inputOutput1Vector, _inputOutput2VectorType &inputOutput2Vector)
Definition: vctDynamicVectorLoopEngines.h:263
_incrementalOperationType::OutputType OutputType
Definition: vctDynamicVectorLoopEngines.h:734
#define cmnThrow(a)
Definition: MinimalCmn.h:4
static void Run(_outputOwnerType &outputOwner, const _input1OwnerType &input1Owner, const _input2OwnerType &input2Owner)
Definition: vctDynamicCompactLoopEngines.h:75
static void Run(_outputVectorType &output, const _inputVectorType &input, const _indexVectorType &index)
Definition: vctDynamicVectorLoopEngines.h:1086
Implement operation of the form for dynamic vectors.
Definition: vctDynamicVectorLoopEngines.h:97
Definition: vctDynamicVectorLoopEngines.h:1083
static void Run(_inputOutputVectorType &inputOutputVector, const _inputVectorType &inputVector)
Definition: vctDynamicVectorLoopEngines.h:189
ptrdiff_t stride_type
Definition: vctContainerTraits.h:37
Implement operation of the form for dynamic vectors.
Definition: vctDynamicVectorLoopEngines.h:403
static void Run(_outputOwnerType &outputOwner, const _inputOwnerType &inputOwner, const _inputScalarType inputScalar)
Definition: vctDynamicCompactLoopEngines.h:204
static void Run(_inputOutputVectorType &inputOutputVector, const _inputScalarType inputScalar)
Definition: vctDynamicVectorLoopEngines.h:487
static void ThrowException(void)
Definition: vctDynamicVectorLoopEngines.h:72
Declaration of the template function cmnThrow.
static OutputType Run(const _inputOwnerType &inputOwner, const _inputScalarType &inputScalar)
Definition: vctDynamicCompactLoopEngines.h:603
static void Run(_outputVectorType &outputVector, const _inputVectorType &inputVector)
Definition: vctDynamicVectorLoopEngines.h:543
Implement operation of the form for dynamic vectors.
Definition: vctDynamicVectorLoopEngines.h:181
static void Run(const _inputOwnerType &inputOwner, typename _inputOwnerType::value_type &minValue, typename _inputOwnerType::value_type &maxValue)
Definition: vctDynamicCompactLoopEngines.h:630
Container class for the vector loop based engines.
Definition: vctDynamicVectorLoopEngines.h:66
static void Run(_ioOwnerType &ioOwner, const _inputScalarType inputScalar, const _inputOwnerType &inputOwner)
Definition: vctDynamicCompactLoopEngines.h:500
Implement operation of the form for dynamic vectors.
Definition: vctDynamicVectorLoopEngines.h:732
static void Run(const _inputVectorType &inputVector, typename _inputVectorType::value_type &minValue, typename _inputVectorType::value_type &maxValue)
Definition: vctDynamicVectorLoopEngines.h:1037
static void Run(_ioVectorType &ioVector, const _inputScalarType inputScalar, const _inputVectorType &inputVector)
Definition: vctDynamicVectorLoopEngines.h:823