22 #ifndef _vctDynamicNArrayLoopEngines_h
23 #define _vctDynamicNArrayLoopEngines_h
42 template <vct::
size_type _dimension>
58 cmnThrow(std::runtime_error(
"vctDynamicNArrayLoopEngines: Sizes of nArrays don't match"));
64 const nsize_type & sizes,
65 const nstride_type & strides)
68 typename nsize_type::const_iterator sizesIter = sizes.begin();
69 typename nstride_type::const_iterator stridesIter = strides.begin();
70 typename nstride_type::iterator stndIter = stnd.begin();
71 const typename nstride_type::const_iterator stndIterEnd = stnd.end();
80 stndIter != stndIterEnd;
81 ++sizesIter, ++stridesIter, ++stndIter)
83 skippedStrides =
static_cast<stride_type>(*sizesIter) * (*stridesIter);
84 *stndIter = *(stridesIter-1) - skippedStrides;
91 const nstride_type & strides,
92 const nstride_type & stnd)
96 typename nstride_type::const_reverse_iterator stndIter = stnd.rbegin();
97 typename nstride_type::reverse_iterator otndIter = otnd.rbegin();
98 const typename nstride_type::const_reverse_iterator otnd_rend = otnd.rend();
100 *otndIter = previousOTND;
104 otndIter != otnd_rend;
105 ++otndIter, ++stndIter)
107 *otndIter = *stndIter + previousOTND;
108 previousOTND = *otndIter;
114 template <
class _elementType>
116 const nsize_type & sizes,
117 const nstride_type & strides,
118 const _elementType * basePtr)
120 typedef _elementType value_type;
123 typename nsize_type::const_iterator sizesIter = sizes.begin();
124 typename nstride_type::const_iterator stridesIter = strides.begin();
130 targetsIter != targetsIterEnd;
131 ++targetsIter, ++sizesIter, ++stridesIter)
133 offset =
static_cast<stride_type>(*sizesIter) * (*stridesIter);
134 *targetsIter = basePtr + offset;
141 template <
class _elementType>
143 const nstride_type & otnd,
146 const typename nstride_type::const_reverse_iterator otndBegin = otnd.rbegin();
147 currentPointer += otndBegin[numberOfWrappedDimensions];
153 template <
class _elementType,
class _po
interType>
155 _pointerType & currentPointer,
156 const nstride_type & strides,
157 const nstride_type & stnd)
159 typedef _elementType value_type;
165 typename nstride_type::const_reverse_iterator stridesIter = strides.rbegin();
167 typename nstride_type::const_reverse_iterator stndIter = stnd.rbegin();
169 dimension_type numberOfWrappedDimensions = 0;
199 currentPointer += *stridesIter;
200 while (currentPointer == *targetsIter) {
201 currentPointer += *stndIter;
204 ++numberOfWrappedDimensions;
205 if (numberOfWrappedDimensions == _dimension)
206 return numberOfWrappedDimensions;
209 if (numberOfWrappedDimensions == 0)
210 return numberOfWrappedDimensions;
212 stridesIter += numberOfWrappedDimensions;
217 targetOffset = *stridesIter - *stndIter;
218 *targetsIter = currentPointer + targetOffset;
220 }
while (targetsIter != targets_rbeg);
221 return numberOfWrappedDimensions;
225 template <
class _incrementalOperationType,
class _elementOperationType>
229 typedef typename _incrementalOperationType::OutputType
OutputType;
231 template <
class _inputNArrayType>
234 typedef _inputNArrayType InputNArrayType;
235 typedef typename InputNArrayType::OwnerType InputOwnerType;
236 typedef typename InputOwnerType::const_pointer InputPointerType;
239 const InputOwnerType & inputOwner = inputNArray.Owner();
242 if (inputOwner.IsCompact()) {
246 const nsize_type & inputSizes = inputOwner.sizes();
247 const nstride_type & inputStrides = inputOwner.strides();
248 nstride_type inputSTND;
250 InputPointerType inputPointer = inputOwner.
Pointer();
252 dimension_type numberOfWrappedDimensions = 0;
253 const dimension_type maxWrappedDimensions = inputOwner.dimension();
258 OutputType incrementalResult = _incrementalOperationType::NeutralElement();
260 while (numberOfWrappedDimensions != maxWrappedDimensions) {
262 _incrementalOperationType::Operate(incrementalResult,
263 _elementOperationType::Operate(*inputPointer) );
265 numberOfWrappedDimensions =
268 return incrementalResult;
274 template <
class _incrementalOperationType,
class _elementOperationType>
278 typedef typename _incrementalOperationType::OutputType
OutputType;
280 template <
class _input1NArrayType,
class _input2NArrayType>
282 const _input2NArrayType & input2NArray)
284 typedef _input1NArrayType Input1NArrayType;
285 typedef typename Input1NArrayType::OwnerType Input1OwnerType;
286 typedef typename Input1OwnerType::const_pointer Input1PointerType;
288 typedef _input2NArrayType Input2NArrayType;
289 typedef typename Input2NArrayType::OwnerType Input2OwnerType;
290 typedef typename Input2OwnerType::const_pointer Input2PointerType;
293 const Input1OwnerType & input1Owner = input1NArray.Owner();
294 const Input2OwnerType & input2Owner = input2NArray.Owner();
297 const nsize_type & input1Sizes = input1Owner.sizes();
298 const nsize_type & input2Sizes = input2Owner.sizes();
299 if (input1Sizes.NotEqual(input2Sizes)) {
304 const nstride_type & input1Strides = input1Owner.strides();
305 const nstride_type & input2Strides = input2Owner.strides();
307 if (input1Owner.IsCompact() && input2Owner.IsCompact()
308 && (input1Owner.strides() == input2Owner.strides())) {
313 nstride_type input1STND;
315 Input1PointerType input1Pointer = input1Owner.
Pointer();
318 nstride_type input2STND;
319 nstride_type input2OTND;
320 Input2PointerType input2Pointer = input2Owner.Pointer();
322 dimension_type numberOfWrappedDimensions = 0;
323 const dimension_type maxWrappedDimensions = input1Owner.dimension();
330 OutputType incrementalResult = _incrementalOperationType::NeutralElement();
332 while (numberOfWrappedDimensions != maxWrappedDimensions) {
334 _incrementalOperationType::Operate(incrementalResult,
335 _elementOperationType::Operate(*input1Pointer, *input2Pointer) );
337 numberOfWrappedDimensions =
342 return incrementalResult;
348 template <
class _incrementalOperationType,
class _elementOperationType>
352 typedef typename _incrementalOperationType::OutputType
OutputType;
354 template <
class _inputNArrayType,
class _inputScalarType>
356 const _inputScalarType inputScalar)
358 typedef _inputNArrayType InputNArrayType;
359 typedef typename InputNArrayType::OwnerType InputOwnerType;
360 typedef typename InputOwnerType::const_pointer InputPointerType;
363 const InputOwnerType & inputOwner = inputNArray.Owner();
366 if (inputOwner.IsCompact()) {
370 const nsize_type & inputSizes = inputOwner.sizes();
371 const nstride_type & inputStrides = inputOwner.strides();
372 nstride_type inputSTND;
374 InputPointerType inputPointer = inputOwner.
Pointer();
376 dimension_type numberOfWrappedDimensions = 0;
377 const dimension_type maxWrappedDimensions = inputOwner.dimension();
382 OutputType incrementalResult = _incrementalOperationType::NeutralElement();
384 while (numberOfWrappedDimensions != maxWrappedDimensions) {
386 _incrementalOperationType::Operate(incrementalResult,
387 _elementOperationType::Operate(*inputPointer, inputScalar) );
389 numberOfWrappedDimensions =
392 return incrementalResult;
398 template <
class _elementOperationType>
402 template <
class _outputNArrayType,
class _input1NArrayType,
class _input2NArrayType>
403 static void Run(_outputNArrayType & outputNArray,
404 const _input1NArrayType & input1NArray,
405 const _input2NArrayType & input2NArray)
407 typedef _outputNArrayType OutputNArrayType;
408 typedef typename OutputNArrayType::OwnerType OutputOwnerType;
409 typedef typename OutputOwnerType::pointer OutputPointerType;
410 typedef typename OutputOwnerType::const_pointer OutputConstPointerType;
412 typedef _input1NArrayType Input1NArrayType;
413 typedef typename Input1NArrayType::OwnerType Input1OwnerType;
414 typedef typename Input1OwnerType::const_pointer Input1PointerType;
416 typedef _input2NArrayType Input2NArrayType;
417 typedef typename Input2NArrayType::OwnerType Input2OwnerType;
418 typedef typename Input2OwnerType::const_pointer Input2PointerType;
421 OutputOwnerType & outputOwner = outputNArray.Owner();
422 const Input1OwnerType & input1Owner = input1NArray.Owner();
423 const Input2OwnerType & input2Owner = input2NArray.Owner();
426 const nsize_type & outputSizes = outputOwner.sizes();
427 const nsize_type & input1Sizes = input1Owner.sizes();
428 const nsize_type & input2Sizes = input2Owner.sizes();
429 if (outputSizes.NotEqual(input1Sizes) || outputSizes.NotEqual(input2Sizes)) {
434 const nstride_type & outputStrides = outputOwner.strides();
435 const nstride_type & input1Strides = input1Owner.strides();
436 const nstride_type & input2Strides = input2Owner.strides();
438 if (outputOwner.IsCompact() && input1Owner.IsCompact() && input2Owner.IsCompact()
439 && (outputOwner.strides() == input1Owner.strides())
440 && (outputOwner.strides() == input2Owner.strides())) {
445 nstride_type outputSTND;
447 OutputPointerType outputPointer = outputOwner.
Pointer();
450 nstride_type input1STND;
451 nstride_type input1OTND;
452 Input1PointerType input1Pointer = input1Owner.Pointer();
455 const nsize_type & input2Sizes = input2Owner.sizes();
456 nstride_type input2STND;
457 nstride_type input2OTND;
458 Input2PointerType input2Pointer = input2Owner.Pointer();
460 dimension_type numberOfWrappedDimensions = 0;
461 const dimension_type maxWrappedDimensions = outputOwner.dimension();
470 while (numberOfWrappedDimensions != maxWrappedDimensions) {
471 *outputPointer = _elementOperationType::Operate(*input1Pointer, *input2Pointer);
473 numberOfWrappedDimensions =
484 template <
class _elementOperationType>
488 template <
class _outputNArrayType,
class _inputNArrayType,
class _inputScalarType>
489 static void Run(_outputNArrayType & outputNArray,
490 const _inputNArrayType & inputNArray,
491 const _inputScalarType inputScalar)
493 typedef _outputNArrayType OutputNArrayType;
494 typedef typename OutputNArrayType::OwnerType OutputOwnerType;
495 typedef typename OutputOwnerType::pointer OutputPointerType;
496 typedef typename OutputOwnerType::const_pointer OutputConstPointerType;
498 typedef _inputNArrayType InputNArrayType;
499 typedef typename InputNArrayType::OwnerType InputOwnerType;
500 typedef typename InputOwnerType::const_pointer InputPointerType;
503 OutputOwnerType & outputOwner = outputNArray.Owner();
504 const InputOwnerType & inputOwner = inputNArray.Owner();
507 const nsize_type & outputSizes = outputOwner.sizes();
508 const nsize_type & inputSizes = inputOwner.sizes();
509 if (outputSizes.NotEqual(inputSizes)) {
514 const nstride_type & outputStrides = outputOwner.strides();
515 const nstride_type & inputStrides = inputOwner.strides();
517 if (outputOwner.IsCompact() && inputOwner.IsCompact()
518 && (outputOwner.strides() == inputOwner.strides())) {
523 nstride_type outputSTND;
525 OutputPointerType outputPointer = outputOwner.
Pointer();
528 nstride_type inputSTND;
529 nstride_type inputOTND;
530 InputPointerType inputPointer = inputOwner.Pointer();
532 dimension_type numberOfWrappedDimensions = 0;
533 const dimension_type maxWrappedDimensions = outputOwner.dimension();
540 while (numberOfWrappedDimensions != maxWrappedDimensions) {
541 *outputPointer = _elementOperationType::Operate(*inputPointer, inputScalar);
543 numberOfWrappedDimensions =
553 template <
class _elementOperationType>
557 template <
class _outputNArrayType,
class _inputScalarType,
class _inputNArrayType>
558 static void Run(_outputNArrayType & outputNArray,
559 const _inputScalarType inputScalar,
560 const _inputNArrayType & inputNArray)
562 typedef _outputNArrayType OutputNArrayType;
563 typedef typename OutputNArrayType::OwnerType OutputOwnerType;
564 typedef typename OutputOwnerType::pointer OutputPointerType;
565 typedef typename OutputOwnerType::const_pointer OutputConstPointerType;
567 typedef _inputNArrayType InputNArrayType;
568 typedef typename InputNArrayType::OwnerType InputOwnerType;
569 typedef typename InputOwnerType::const_pointer InputPointerType;
572 OutputOwnerType & outputOwner = outputNArray.Owner();
573 const InputOwnerType & inputOwner = inputNArray.Owner();
576 const nsize_type & outputSizes = outputOwner.sizes();
577 const nsize_type & inputSizes = inputOwner.sizes();
578 if (outputSizes.NotEqual(inputSizes)) {
583 const nstride_type & outputStrides = outputOwner.strides();
584 const nstride_type & inputStrides = inputOwner.strides();
586 if (outputOwner.IsCompact() && inputOwner.IsCompact()
587 && (outputOwner.strides() == inputOwner.strides())) {
592 nstride_type outputSTND;
594 OutputPointerType outputPointer = outputNArray.
Pointer();
597 nstride_type inputSTND;
598 nstride_type inputOTND;
599 InputPointerType inputPointer = inputNArray.Pointer();
601 dimension_type numberOfWrappedDimensions = 0;
602 const dimension_type maxWrappedDimensions = outputNArray.dimension();
609 while (numberOfWrappedDimensions != maxWrappedDimensions) {
610 *outputPointer = _elementOperationType::Operate(inputScalar, *inputPointer);
612 numberOfWrappedDimensions =
622 template <
class _elementOperationType>
626 template <
class _inputOutputNArrayType,
class _inputScalarType>
627 static void Run(_inputOutputNArrayType & inputOutputNArray,
628 const _inputScalarType inputScalar)
630 typedef _inputOutputNArrayType InputOutputNArrayType;
631 typedef typename InputOutputNArrayType::OwnerType InputOutputOwnerType;
632 typedef typename InputOutputOwnerType::const_pointer InputOutputConstPointerType;
633 typedef typename InputOutputOwnerType::pointer InputOutputPointerType;
636 InputOutputOwnerType & inputOutputOwner = inputOutputNArray.Owner();
639 if (inputOutputOwner.IsCompact()) {
643 const nsize_type & inputOutputSizes = inputOutputOwner.sizes();
644 const nstride_type & inputOutputStrides = inputOutputOwner.strides();
645 nstride_type inputOutputSTND;
647 InputOutputPointerType inputOutputPointer = inputOutputOwner.
Pointer();
649 dimension_type numberOfWrappedDimensions = 0;
650 const dimension_type maxWrappedDimensions = inputOutputOwner.dimension();
652 CalculateSTND(inputOutputSTND, inputOutputSizes, inputOutputStrides);
653 InitializeTargets(inputOutputTargets, inputOutputSizes, inputOutputStrides, inputOutputPointer);
655 while (numberOfWrappedDimensions != maxWrappedDimensions) {
656 _elementOperationType::Operate(*inputOutputPointer, inputScalar);
658 numberOfWrappedDimensions =
659 IncrementPointers(inputOutputTargets, inputOutputPointer, inputOutputStrides, inputOutputSTND);
666 template <
class _elementOperationType>
670 template <
class _inputOutputNArrayType,
class _inputNArrayType>
671 static void Run(_inputOutputNArrayType & inputOutputNArray,
672 const _inputNArrayType & inputNArray)
674 typedef _inputOutputNArrayType InputOutputNArrayType;
675 typedef typename InputOutputNArrayType::OwnerType InputOutputOwnerType;
676 typedef typename InputOutputOwnerType::const_pointer InputOutputConstPointerType;
677 typedef typename InputOutputOwnerType::pointer InputOutputPointerType;
679 typedef _inputNArrayType InputNArrayType;
680 typedef typename InputNArrayType::OwnerType InputOwnerType;
681 typedef typename InputOwnerType::const_pointer InputPointerType;
684 InputOutputOwnerType & inputOutputOwner = inputOutputNArray.Owner();
685 const InputOwnerType & inputOwner = inputNArray.Owner();
688 const nsize_type & inputOutputSizes = inputOutputOwner.sizes();
689 const nsize_type & inputSizes = inputOwner.sizes();
690 if (inputOutputSizes.NotEqual(inputSizes)) {
695 const nstride_type & inputOutputStrides = inputOutputOwner.strides();
696 const nstride_type & inputStrides = inputOwner.strides();
698 if (inputOutputOwner.IsCompact() && inputOwner.IsCompact()
699 && (inputOutputOwner.strides() == inputOwner.strides())) {
704 nstride_type inputOutputSTND;
706 InputOutputPointerType inputOutputPointer = inputOutputOwner.
Pointer();
709 nstride_type inputSTND;
710 nstride_type inputOTND;
711 InputPointerType inputPointer = inputOwner.Pointer();
713 dimension_type numberOfWrappedDimensions = 0;
714 const dimension_type maxWrappedDimensions = inputOutputOwner.dimension();
716 CalculateSTND(inputOutputSTND, inputOutputSizes, inputOutputStrides);
719 InitializeTargets(inputOutputTargets, inputOutputSizes, inputOutputStrides, inputOutputPointer);
721 while (numberOfWrappedDimensions != maxWrappedDimensions) {
722 _elementOperationType::Operate(*inputOutputPointer, *inputPointer);
724 numberOfWrappedDimensions =
725 IncrementPointers(inputOutputTargets, inputOutputPointer, inputOutputStrides, inputOutputSTND);
734 template <
class _elementOperationType>
738 template <
class _outputNArrayType,
class _inputNArrayType>
739 static inline void Run(_outputNArrayType & outputNArray,
740 const _inputNArrayType & inputNArray)
742 typedef _outputNArrayType OutputNArrayType;
743 typedef typename OutputNArrayType::OwnerType OutputOwnerType;
744 typedef typename OutputOwnerType::const_pointer OutputConstPointerType;
745 typedef typename OutputOwnerType::pointer OutputPointerType;
747 typedef _inputNArrayType InputNArrayType;
748 typedef typename InputNArrayType::OwnerType InputOwnerType;
749 typedef typename InputOwnerType::const_pointer InputPointerType;
752 OutputOwnerType & outputOwner = outputNArray.Owner();
753 const InputOwnerType & inputOwner = inputNArray.Owner();
756 const nsize_type & outputSizes = outputOwner.sizes();
757 const nsize_type & inputSizes = inputOwner.sizes();
758 if (inputSizes.NotEqual(outputSizes)) {
763 const nstride_type & outputStrides = outputOwner.strides();
764 const nstride_type & inputStrides = inputOwner.strides();
766 if (outputOwner.IsCompact() && inputOwner.IsCompact()
767 && (outputOwner.strides() == inputOwner.strides())) {
772 nstride_type outputSTND;
774 OutputPointerType outputPointer = outputOwner.
Pointer();
777 nstride_type inputSTND;
778 nstride_type inputOTND;
779 InputPointerType inputPointer = inputOwner.Pointer();
781 dimension_type numberOfWrappedDimensions = 0;
782 const dimension_type maxWrappedDimensions = outputOwner.dimension();
789 while (numberOfWrappedDimensions != maxWrappedDimensions) {
790 *outputPointer = _elementOperationType::Operate(*inputPointer);
792 numberOfWrappedDimensions =
802 template <
class _elementOperationType>
806 template <
class _inputOutputNArrayType>
807 static void Run(_inputOutputNArrayType & inputOutputNArray)
809 typedef _inputOutputNArrayType InputOutputNArrayType;
810 typedef typename InputOutputNArrayType::OwnerType InputOutputOwnerType;
811 typedef typename InputOutputOwnerType::const_pointer InputOutputConstPointerType;
812 typedef typename InputOutputOwnerType::pointer InputOutputPointerType;
815 InputOutputOwnerType & inputOutputOwner = inputOutputNArray.Owner();
818 const nstride_type & inputOutputStrides = inputOutputOwner.strides();
820 if (inputOutputOwner.IsCompact()) {
824 const nsize_type & inputOutputSizes = inputOutputOwner.sizes();
825 nstride_type inputOutputSTND;
827 InputOutputPointerType inputOutputPointer = inputOutputOwner.
Pointer();
829 dimension_type numberOfWrappedDimensions = 0;
830 const dimension_type maxWrappedDimensions = inputOutputOwner.dimension();
832 CalculateSTND(inputOutputSTND, inputOutputSizes, inputOutputStrides);
833 InitializeTargets(inputOutputTargets, inputOutputSizes, inputOutputStrides, inputOutputPointer);
835 while (numberOfWrappedDimensions != maxWrappedDimensions) {
836 _elementOperationType::Operate(*inputOutputPointer);
838 numberOfWrappedDimensions =
839 IncrementPointers(inputOutputTargets, inputOutputPointer, inputOutputStrides, inputOutputSTND);
846 template <
class _inputOutputElementOperationType,
class _scalarNArrayElementOperationType>
850 template <
class _inputOutputNArrayType,
class _inputScalarType,
class _inputNArrayType>
851 static void Run(_inputOutputNArrayType & inputOutputNArray,
852 const _inputScalarType inputScalar,
853 const _inputNArrayType & inputNArray)
855 typedef _inputOutputNArrayType InputOutputNArrayType;
856 typedef typename InputOutputNArrayType::OwnerType InputOutputOwnerType;
857 typedef typename InputOutputOwnerType::const_pointer InputOutputConstPointerType;
858 typedef typename InputOutputOwnerType::pointer InputOutputPointerType;
860 typedef _inputNArrayType InputNArrayType;
861 typedef typename InputNArrayType::OwnerType InputOwnerType;
862 typedef typename InputOwnerType::const_pointer InputPointerType;
865 InputOutputOwnerType & inputOutputOwner = inputOutputNArray.Owner();
866 const InputOwnerType & inputOwner = inputNArray.Owner();
869 const nsize_type & inputOutputSizes = inputOutputOwner.sizes();
870 const nsize_type & inputSizes = inputOwner.sizes();
871 if (inputOutputSizes.NotEqual(inputSizes)) {
876 const nstride_type & inputOutputStrides = inputOutputOwner.strides();
877 const nstride_type & inputStrides = inputOwner.strides();
879 if (inputOutputOwner.IsCompact() && inputOwner.IsCompact()
880 && (inputOutputOwner.strides() == inputOwner.strides())) {
885 nstride_type inputOutputSTND;
887 InputOutputPointerType inputOutputPointer = inputOutputNArray.
Pointer();
890 nstride_type inputSTND;
891 nstride_type inputOTND;
892 InputPointerType inputPointer = inputNArray.Pointer();
894 dimension_type numberOfWrappedDimensions = 0;
895 const dimension_type maxWrappedDimensions = inputOutputNArray.dimension();
897 CalculateSTND(inputOutputSTND, inputOutputSizes, inputOutputStrides);
900 InitializeTargets(inputOutputTargets, inputOutputSizes, inputOutputStrides, inputOutputPointer);
902 while (numberOfWrappedDimensions != maxWrappedDimensions) {
903 _inputOutputElementOperationType::Operate(*inputOutputPointer,
904 _scalarNArrayElementOperationType::Operate(inputScalar, *inputPointer) );
906 numberOfWrappedDimensions =
907 IncrementPointers(inputOutputTargets, inputOutputPointer, inputOutputStrides, inputOutputSTND);
917 template <
class _inputOutputElementOperationType,
class _nArrayElementOperationType>
921 template <
class _inputOutputNArrayType,
class _input1NArrayType,
class _input2NArrayType>
922 static void Run(_inputOutputNArrayType & inputOutputNArray,
923 const _input1NArrayType & input1NArray,
924 const _input2NArrayType & input2NArray)
926 typedef _inputOutputNArrayType InputOutputNArrayType;
927 typedef typename InputOutputNArrayType::OwnerType InputOutputOwnerType;
928 typedef typename InputOutputOwnerType::const_pointer InputOutputConstPointerType;
929 typedef typename InputOutputOwnerType::pointer InputOutputPointerType;
931 typedef _input1NArrayType Input1NArrayType;
932 typedef typename Input1NArrayType::OwnerType Input1OwnerType;
933 typedef typename Input1OwnerType::const_pointer Input1PointerType;
935 typedef _input2NArrayType Input2NArrayType;
936 typedef typename Input2NArrayType::OwnerType Input2OwnerType;
937 typedef typename Input2OwnerType::const_pointer Input2PointerType;
940 InputOutputOwnerType & inputOutputOwner = inputOutputNArray.Owner();
941 const Input1OwnerType & input1Owner = input1NArray.Owner();
942 const Input2OwnerType & input2Owner = input2NArray.Owner();
945 const nsize_type & inputOutputSizes = inputOutputOwner.sizes();
946 const nsize_type & input1Sizes = input1Owner.sizes();
947 const nsize_type & input2Sizes = input2Owner.sizes();
948 if (inputOutputSizes.NotEqual(input1Sizes) || inputOutputSizes.NotEqual(input2Sizes)) {
953 const nstride_type & inputOutputStrides = inputOutputOwner.strides();
954 const nstride_type & input1Strides = input1Owner.strides();
955 const nstride_type & input2Strides = input2Owner.strides();
957 if (inputOutputOwner.IsCompact() && input1Owner.IsCompact() && input2Owner.IsCompact()
958 && (inputOutputOwner.strides() == input1Owner.strides())
959 && (inputOutputOwner.strides() == input2Owner.strides())) {
964 nstride_type inputOutputSTND;
966 InputOutputPointerType inputOutputPointer = inputOutputNArray.
Pointer();
969 nstride_type input1STND;
970 nstride_type input1OTND;
971 Input1PointerType input1Pointer = input1NArray.Pointer();
974 nstride_type input2STND;
975 nstride_type input2OTND;
976 Input2PointerType input2Pointer = input2NArray.Pointer();
978 dimension_type numberOfWrappedDimensions = 0;
979 const dimension_type maxWrappedDimensions = inputOutputNArray.dimension();
981 CalculateSTND(inputOutputSTND, inputOutputSizes, inputOutputStrides);
986 InitializeTargets(inputOutputTargets, inputOutputSizes, inputOutputStrides, inputOutputPointer);
988 while (numberOfWrappedDimensions != maxWrappedDimensions) {
989 _inputOutputElementOperationType::Operate(*inputOutputPointer,
990 _nArrayElementOperationType::Operate(*input1Pointer, *input2Pointer) );
992 numberOfWrappedDimensions =
993 IncrementPointers(inputOutputTargets, inputOutputPointer, inputOutputStrides, inputOutputSTND);
1006 template <
class _inputNArrayType>
1007 static void Run(
const _inputNArrayType & inputNArray,
1008 typename _inputNArrayType::value_type & minValue,
1009 typename _inputNArrayType::value_type & maxValue)
1011 typedef _inputNArrayType InputNArrayType;
1012 typedef typename InputNArrayType::OwnerType InputOwnerType;
1013 typedef typename InputOwnerType::value_type value_type;
1014 typedef typename InputOwnerType::const_pointer InputPointerType;
1017 const InputOwnerType & inputOwner = inputNArray.Owner();
1018 InputPointerType inputPointer = inputOwner.Pointer();
1020 if (inputPointer == 0)
1024 if (inputOwner.IsCompact()) {
1028 const nsize_type & inputSizes = inputOwner.sizes();
1029 const nstride_type & inputStrides = inputOwner.strides();
1030 nstride_type inputSTND;
1033 dimension_type numberOfWrappedDimensions = 0;
1034 const dimension_type maxWrappedDimensions = inputOwner.dimension();
1039 value_type minElement, maxElement, inputElement;
1040 minElement = maxElement = *inputPointer;
1042 while (numberOfWrappedDimensions != maxWrappedDimensions) {
1043 inputElement = *inputPointer;
1045 if (inputElement < minElement) {
1046 minElement = inputElement;
1047 }
else if (inputElement > maxElement) {
1048 maxElement = inputElement;
1051 numberOfWrappedDimensions =
1054 minValue = minElement;
1055 maxValue = maxElement;
1064 #endif // _vctDynamicNArrayLoopEngines_h
_incrementalOperationType::OutputType OutputType
Definition: vctDynamicNArrayLoopEngines.h:278
size_t index_type
Definition: vctContainerTraits.h:36
Definition: vctFixedStrideVectorIterator.h:224
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
_incrementalOperationType::OutputType OutputType
Definition: vctDynamicNArrayLoopEngines.h:352
Definition: vctDynamicNArrayLoopEngines.h:1003
static void SyncCurrentPointer(const _elementType *¤tPointer, const nstride_type &otnd, difference_type numberOfWrappedDimensions)
Definition: vctDynamicNArrayLoopEngines.h:142
static void Run(_inputOutputNArrayType &inputOutputNArray, const _input1NArrayType &input1NArray, const _input2NArrayType &input2NArray)
Definition: vctDynamicNArrayLoopEngines.h:922
vct::stride_type stride_type
Definition: vctDynamicNArrayLoopEngines.h:48
VCT_NARRAY_TRAITS_TYPEDEFS(_dimension)
Portability across compilers and operating systems tools.
static void Run(_outputOwnerType &outputOwner, const _inputScalarType inputScalar, const _inputOwnerType &inputOwner)
Definition: vctDynamicCompactLoopEngines.h:246
static void Run(_inputOutputOwnerType &inputOutputOwner, const _inputScalarType inputScalar)
Definition: vctDynamicCompactLoopEngines.h:289
vct::index_type index_type
Definition: vctDynamicNArrayLoopEngines.h:50
Container class for the dynamic nArray engines.
Definition: vctDynamicNArrayLoopEngines.h:43
static OutputType Run(const _input1NArrayType &input1NArray, const _input2NArrayType &input2NArray)
Definition: vctDynamicNArrayLoopEngines.h:281
static void Run(_inputOutputOwnerType &inputOutputOwner, const _inputOwnerType &inputOwner)
Definition: vctDynamicCompactLoopEngines.h:121
static OutputType Run(const _input1OwnerType &input1Owner, const _input2OwnerType &input2Owner)
Definition: vctDynamicCompactLoopEngines.h:450
Definition: vctDynamicNArrayLoopEngines.h:554
Definition: vctDynamicNArrayLoopEngines.h:803
static void Run(_outputNArrayType &outputNArray, const _input1NArrayType &input1NArray, const _input2NArrayType &input2NArray)
Definition: vctDynamicNArrayLoopEngines.h:403
size_t size_type
Definition: vctContainerTraits.h:35
Declaration of vctDynamicCompactLoopEngines.
iterator begin(void)
Definition: vctFixedSizeVectorBase.h:117
static void Run(_inputOutputNArrayType &inputOutputNArray, const _inputScalarType inputScalar)
Definition: vctDynamicNArrayLoopEngines.h:627
static void CalculateSTND(nstride_type &stnd, const nsize_type &sizes, const nstride_type &strides)
Definition: vctDynamicNArrayLoopEngines.h:63
static void Run(_inputOutputNArrayType &inputOutputNArray, const _inputNArrayType &inputNArray)
Definition: vctDynamicNArrayLoopEngines.h:671
static void Run(_inputOutputNArrayType &inputOutputNArray)
Definition: vctDynamicNArrayLoopEngines.h:807
static void Run(_outputNArrayType &outputNArray, const _inputScalarType inputScalar, const _inputNArrayType &inputNArray)
Definition: vctDynamicNArrayLoopEngines.h:558
Implementation of a fixed-size vector using template metaprogramming.
Definition: vctFixedSizeVector.h:52
static void Run(_outputNArrayType &outputNArray, const _inputNArrayType &inputNArray)
Definition: vctDynamicNArrayLoopEngines.h:739
static void ThrowSizeMismatchException(void)
Definition: vctDynamicNArrayLoopEngines.h:56
reverse_iterator rbegin(void)
Definition: vctFixedSizeVectorBase.h:143
Definition: vctFixedStrideVectorIterator.h:62
_incrementalOperationType::OutputType OutputType
Definition: vctDynamicNArrayLoopEngines.h:229
ptrdiff_t difference_type
Definition: vctContainerTraits.h:38
Definition: vctDynamicNArrayLoopEngines.h:918
iterator end(void)
Definition: vctFixedSizeVectorBase.h:130
static void Run(_ioOwnerType &ioOwner, const _input1OwnerType &input1Owner, const _input2OwnerType &input2Owner)
Definition: vctDynamicCompactLoopEngines.h:549
static void CalculateOTND(nstride_type &otnd, const nstride_type &strides, const nstride_type &stnd)
Definition: vctDynamicNArrayLoopEngines.h:90
Declaration of vctFixedSizeVector.
Basic traits for the cisstVector containers.
vct::difference_type difference_type
Definition: vctDynamicNArrayLoopEngines.h:49
static dimension_type IncrementPointers(vctFixedSizeVector< const _elementType *, _dimension > &targets, _pointerType ¤tPointer, const nstride_type &strides, const nstride_type &stnd)
Definition: vctDynamicNArrayLoopEngines.h:154
#define cmnThrow(a)
Definition: MinimalCmn.h:4
Definition: vctDynamicNArrayLoopEngines.h:735
static OutputType Run(const _inputNArrayType &inputNArray)
Definition: vctDynamicNArrayLoopEngines.h:232
static void Run(_outputOwnerType &outputOwner, const _input1OwnerType &input1Owner, const _input2OwnerType &input2Owner)
Definition: vctDynamicCompactLoopEngines.h:75
static void Run(const _inputNArrayType &inputNArray, typename _inputNArrayType::value_type &minValue, typename _inputNArrayType::value_type &maxValue)
Definition: vctDynamicNArrayLoopEngines.h:1007
vct::size_type size_type
Definition: vctDynamicNArrayLoopEngines.h:47
ptrdiff_t stride_type
Definition: vctContainerTraits.h:37
Definition: vctDynamicNArrayLoopEngines.h:485
Definition: vctDynamicNArrayLoopEngines.h:623
static OutputType Run(const _inputNArrayType &inputNArray, const _inputScalarType inputScalar)
Definition: vctDynamicNArrayLoopEngines.h:355
static void Run(_outputOwnerType &outputOwner, const _inputOwnerType &inputOwner, const _inputScalarType inputScalar)
Definition: vctDynamicCompactLoopEngines.h:204
static void Run(_inputOutputNArrayType &inputOutputNArray, const _inputScalarType inputScalar, const _inputNArrayType &inputNArray)
Definition: vctDynamicNArrayLoopEngines.h:851
pointer Pointer(size_type index=0)
Definition: vctFixedSizeVectorBase.h:226
static void InitializeTargets(vctFixedSizeVector< const _elementType *, _dimension > &targets, const nsize_type &sizes, const nstride_type &strides, const _elementType *basePtr)
Definition: vctDynamicNArrayLoopEngines.h:115
static void Run(_outputNArrayType &outputNArray, const _inputNArrayType &inputNArray, const _inputScalarType inputScalar)
Definition: vctDynamicNArrayLoopEngines.h:489
Declaration of the template function cmnThrow.
Definition: vctDynamicNArrayLoopEngines.h:275
static OutputType Run(const _inputOwnerType &inputOwner, const _inputScalarType &inputScalar)
Definition: vctDynamicCompactLoopEngines.h:603
Definition: vctDynamicNArrayLoopEngines.h:399
Definition: vctDynamicNArrayLoopEngines.h:226
Definition: vctDynamicNArrayLoopEngines.h:667
static void Run(const _inputOwnerType &inputOwner, typename _inputOwnerType::value_type &minValue, typename _inputOwnerType::value_type &maxValue)
Definition: vctDynamicCompactLoopEngines.h:630
static void Run(_ioOwnerType &ioOwner, const _inputScalarType inputScalar, const _inputOwnerType &inputOwner)
Definition: vctDynamicCompactLoopEngines.h:500
Definition: vctDynamicNArrayLoopEngines.h:349
Definition: vctDynamicNArrayLoopEngines.h:847