20#ifndef _vctDynamicNArrayLoopEngines_h
21#define _vctDynamicNArrayLoopEngines_h
40template <vct::
size_type _dimension>
56 cmnThrow(std::runtime_error(
"vctDynamicNArrayLoopEngines: Sizes of nArrays don't match"));
62 const nsize_type &
sizes,
66 typename nsize_type::const_iterator sizesIter =
sizes.begin();
67 typename nstride_type::const_iterator stridesIter =
strides.begin();
68 typename nstride_type::iterator stndIter = stnd.begin();
69 const typename nstride_type::const_iterator stndIterEnd = stnd.end();
78 stndIter != stndIterEnd;
79 ++sizesIter, ++stridesIter, ++stndIter)
81 skippedStrides =
static_cast<stride_type>(*sizesIter) * (*stridesIter);
82 *stndIter = *(stridesIter-1) - skippedStrides;
90 const nstride_type & stnd)
94 typename nstride_type::const_reverse_iterator stndIter = stnd.rbegin();
95 typename nstride_type::reverse_iterator otndIter = otnd.rbegin();
96 const typename nstride_type::const_reverse_iterator otnd_rend = otnd.rend();
98 *otndIter = previousOTND;
102 otndIter != otnd_rend;
103 ++otndIter, ++stndIter)
105 *otndIter = *stndIter + previousOTND;
106 previousOTND = *otndIter;
112 template <
class _elementType>
114 const nsize_type &
sizes,
116 const _elementType * basePtr)
121 typename nsize_type::const_iterator sizesIter =
sizes.begin();
122 typename nstride_type::const_iterator stridesIter =
strides.begin();
128 targetsIter != targetsIterEnd;
129 ++targetsIter, ++sizesIter, ++stridesIter)
131 offset =
static_cast<stride_type>(*sizesIter) * (*stridesIter);
132 *targetsIter = basePtr + offset;
139 template <
class _elementType>
141 const nstride_type & otnd,
144 const typename nstride_type::const_reverse_iterator otndBegin = otnd.rbegin();
145 currentPointer += otndBegin[numberOfWrappedDimensions];
151 template <
class _elementType,
class _po
interType>
153 _pointerType & currentPointer,
155 const nstride_type & stnd)
163 typename nstride_type::const_reverse_iterator stridesIter =
strides.rbegin();
165 typename nstride_type::const_reverse_iterator stndIter = stnd.rbegin();
167 dimension_type numberOfWrappedDimensions = 0;
197 currentPointer += *stridesIter;
198 while (currentPointer == *targetsIter) {
199 currentPointer += *stndIter;
202 ++numberOfWrappedDimensions;
203 if (numberOfWrappedDimensions == _dimension)
204 return numberOfWrappedDimensions;
207 if (numberOfWrappedDimensions == 0)
208 return numberOfWrappedDimensions;
210 stridesIter += numberOfWrappedDimensions;
215 targetOffset = *stridesIter - *stndIter;
216 *targetsIter = currentPointer + targetOffset;
218 }
while (targetsIter != targets_rbeg);
219 return numberOfWrappedDimensions;
223 template <
class _incrementalOperationType,
class _elementOperationType>
227 typedef typename _incrementalOperationType::OutputType
OutputType;
229 template <
class _inputNArrayType>
232 typedef _inputNArrayType InputNArrayType;
233 typedef typename InputNArrayType::OwnerType InputOwnerType;
234 typedef typename InputOwnerType::const_pointer InputPointerType;
237 const InputOwnerType & inputOwner = inputNArray.Owner();
240 if (inputOwner.IsCompact()) {
244 const nsize_type & inputSizes = inputOwner.sizes();
245 const nstride_type & inputStrides = inputOwner.strides();
246 nstride_type inputSTND;
248 InputPointerType inputPointer = inputOwner.
Pointer();
250 dimension_type numberOfWrappedDimensions = 0;
251 const dimension_type maxWrappedDimensions = inputOwner.dimension();
256 OutputType incrementalResult = _incrementalOperationType::NeutralElement();
258 while (numberOfWrappedDimensions != maxWrappedDimensions) {
260 _incrementalOperationType::Operate(incrementalResult,
261 _elementOperationType::Operate(*inputPointer) );
263 numberOfWrappedDimensions =
266 return incrementalResult;
272 template <
class _incrementalOperationType,
class _elementOperationType>
276 typedef typename _incrementalOperationType::OutputType
OutputType;
278 template <
class _input1NArrayType,
class _input2NArrayType>
280 const _input2NArrayType & input2NArray)
282 typedef _input1NArrayType Input1NArrayType;
283 typedef typename Input1NArrayType::OwnerType Input1OwnerType;
284 typedef typename Input1OwnerType::const_pointer Input1PointerType;
286 typedef _input2NArrayType Input2NArrayType;
287 typedef typename Input2NArrayType::OwnerType Input2OwnerType;
288 typedef typename Input2OwnerType::const_pointer Input2PointerType;
291 const Input1OwnerType & input1Owner = input1NArray.Owner();
292 const Input2OwnerType & input2Owner = input2NArray.Owner();
295 const nsize_type & input1Sizes = input1Owner.sizes();
296 const nsize_type & input2Sizes = input2Owner.sizes();
297 if (input1Sizes.NotEqual(input2Sizes)) {
302 const nstride_type & input1Strides = input1Owner.strides();
303 const nstride_type & input2Strides = input2Owner.strides();
305 if (input1Owner.IsCompact() && input2Owner.IsCompact()
306 && (input1Owner.strides() == input2Owner.strides())) {
311 nstride_type input1STND;
313 Input1PointerType input1Pointer = input1Owner.
Pointer();
316 nstride_type input2STND;
317 nstride_type input2OTND;
318 Input2PointerType input2Pointer = input2Owner.Pointer();
320 dimension_type numberOfWrappedDimensions = 0;
321 const dimension_type maxWrappedDimensions = input1Owner.dimension();
328 OutputType incrementalResult = _incrementalOperationType::NeutralElement();
330 while (numberOfWrappedDimensions != maxWrappedDimensions) {
332 _incrementalOperationType::Operate(incrementalResult,
333 _elementOperationType::Operate(*input1Pointer, *input2Pointer) );
335 numberOfWrappedDimensions =
340 return incrementalResult;
346 template <
class _incrementalOperationType,
class _elementOperationType>
350 typedef typename _incrementalOperationType::OutputType
OutputType;
352 template <
class _inputNArrayType,
class _inputScalarType>
354 const _inputScalarType inputScalar)
356 typedef _inputNArrayType InputNArrayType;
357 typedef typename InputNArrayType::OwnerType InputOwnerType;
358 typedef typename InputOwnerType::const_pointer InputPointerType;
361 const InputOwnerType & inputOwner = inputNArray.Owner();
364 if (inputOwner.IsCompact()) {
368 const nsize_type & inputSizes = inputOwner.sizes();
369 const nstride_type & inputStrides = inputOwner.strides();
370 nstride_type inputSTND;
372 InputPointerType inputPointer = inputOwner.
Pointer();
374 dimension_type numberOfWrappedDimensions = 0;
375 const dimension_type maxWrappedDimensions = inputOwner.dimension();
380 OutputType incrementalResult = _incrementalOperationType::NeutralElement();
382 while (numberOfWrappedDimensions != maxWrappedDimensions) {
384 _incrementalOperationType::Operate(incrementalResult,
385 _elementOperationType::Operate(*inputPointer, inputScalar) );
387 numberOfWrappedDimensions =
390 return incrementalResult;
396 template <
class _elementOperationType>
400 template <
class _outputNArrayType,
class _input1NArrayType,
class _input2NArrayType>
401 static void Run(_outputNArrayType & outputNArray,
402 const _input1NArrayType & input1NArray,
403 const _input2NArrayType & input2NArray)
405 typedef _outputNArrayType OutputNArrayType;
406 typedef typename OutputNArrayType::OwnerType OutputOwnerType;
407 typedef typename OutputOwnerType::pointer OutputPointerType;
408 typedef typename OutputOwnerType::const_pointer OutputConstPointerType;
410 typedef _input1NArrayType Input1NArrayType;
411 typedef typename Input1NArrayType::OwnerType Input1OwnerType;
412 typedef typename Input1OwnerType::const_pointer Input1PointerType;
414 typedef _input2NArrayType Input2NArrayType;
415 typedef typename Input2NArrayType::OwnerType Input2OwnerType;
416 typedef typename Input2OwnerType::const_pointer Input2PointerType;
419 OutputOwnerType & outputOwner = outputNArray.Owner();
420 const Input1OwnerType & input1Owner = input1NArray.Owner();
421 const Input2OwnerType & input2Owner = input2NArray.Owner();
424 const nsize_type & outputSizes = outputOwner.sizes();
425 const nsize_type & input1Sizes = input1Owner.sizes();
426 const nsize_type & input2Sizes = input2Owner.sizes();
427 if (outputSizes.NotEqual(input1Sizes) || outputSizes.NotEqual(input2Sizes)) {
432 const nstride_type & outputStrides = outputOwner.strides();
433 const nstride_type & input1Strides = input1Owner.strides();
434 const nstride_type & input2Strides = input2Owner.strides();
436 if (outputOwner.IsCompact() && input1Owner.IsCompact() && input2Owner.IsCompact()
437 && (outputOwner.strides() == input1Owner.strides())
438 && (outputOwner.strides() == input2Owner.strides())) {
443 nstride_type outputSTND;
445 OutputPointerType outputPointer = outputOwner.
Pointer();
448 nstride_type input1STND;
449 nstride_type input1OTND;
450 Input1PointerType input1Pointer = input1Owner.Pointer();
453 const nsize_type & input2Sizes = input2Owner.sizes();
454 nstride_type input2STND;
455 nstride_type input2OTND;
456 Input2PointerType input2Pointer = input2Owner.Pointer();
458 dimension_type numberOfWrappedDimensions = 0;
459 const dimension_type maxWrappedDimensions = outputOwner.dimension();
468 while (numberOfWrappedDimensions != maxWrappedDimensions) {
469 *outputPointer = _elementOperationType::Operate(*input1Pointer, *input2Pointer);
471 numberOfWrappedDimensions =
482 template <
class _elementOperationType>
486 template <
class _outputNArrayType,
class _inputNArrayType,
class _inputScalarType>
487 static void Run(_outputNArrayType & outputNArray,
488 const _inputNArrayType & inputNArray,
489 const _inputScalarType inputScalar)
491 typedef _outputNArrayType OutputNArrayType;
492 typedef typename OutputNArrayType::OwnerType OutputOwnerType;
493 typedef typename OutputOwnerType::pointer OutputPointerType;
494 typedef typename OutputOwnerType::const_pointer OutputConstPointerType;
496 typedef _inputNArrayType InputNArrayType;
497 typedef typename InputNArrayType::OwnerType InputOwnerType;
498 typedef typename InputOwnerType::const_pointer InputPointerType;
501 OutputOwnerType & outputOwner = outputNArray.Owner();
502 const InputOwnerType & inputOwner = inputNArray.Owner();
505 const nsize_type & outputSizes = outputOwner.sizes();
506 const nsize_type & inputSizes = inputOwner.sizes();
507 if (outputSizes.NotEqual(inputSizes)) {
512 const nstride_type & outputStrides = outputOwner.strides();
513 const nstride_type & inputStrides = inputOwner.strides();
515 if (outputOwner.IsCompact() && inputOwner.IsCompact()
516 && (outputOwner.strides() == inputOwner.strides())) {
521 nstride_type outputSTND;
523 OutputPointerType outputPointer = outputOwner.
Pointer();
526 nstride_type inputSTND;
527 nstride_type inputOTND;
528 InputPointerType inputPointer = inputOwner.Pointer();
530 dimension_type numberOfWrappedDimensions = 0;
531 const dimension_type maxWrappedDimensions = outputOwner.dimension();
538 while (numberOfWrappedDimensions != maxWrappedDimensions) {
539 *outputPointer = _elementOperationType::Operate(*inputPointer, inputScalar);
541 numberOfWrappedDimensions =
551 template <
class _elementOperationType>
555 template <
class _outputNArrayType,
class _inputScalarType,
class _inputNArrayType>
556 static void Run(_outputNArrayType & outputNArray,
557 const _inputScalarType inputScalar,
558 const _inputNArrayType & inputNArray)
560 typedef _outputNArrayType OutputNArrayType;
561 typedef typename OutputNArrayType::OwnerType OutputOwnerType;
562 typedef typename OutputOwnerType::pointer OutputPointerType;
563 typedef typename OutputOwnerType::const_pointer OutputConstPointerType;
565 typedef _inputNArrayType InputNArrayType;
566 typedef typename InputNArrayType::OwnerType InputOwnerType;
567 typedef typename InputOwnerType::const_pointer InputPointerType;
570 OutputOwnerType & outputOwner = outputNArray.Owner();
571 const InputOwnerType & inputOwner = inputNArray.Owner();
574 const nsize_type & outputSizes = outputOwner.sizes();
575 const nsize_type & inputSizes = inputOwner.sizes();
576 if (outputSizes.NotEqual(inputSizes)) {
581 const nstride_type & outputStrides = outputOwner.strides();
582 const nstride_type & inputStrides = inputOwner.strides();
584 if (outputOwner.IsCompact() && inputOwner.IsCompact()
585 && (outputOwner.strides() == inputOwner.strides())) {
590 nstride_type outputSTND;
592 OutputPointerType outputPointer = outputNArray.
Pointer();
595 nstride_type inputSTND;
596 nstride_type inputOTND;
597 InputPointerType inputPointer = inputNArray.Pointer();
599 dimension_type numberOfWrappedDimensions = 0;
600 const dimension_type maxWrappedDimensions = outputNArray.dimension();
607 while (numberOfWrappedDimensions != maxWrappedDimensions) {
608 *outputPointer = _elementOperationType::Operate(inputScalar, *inputPointer);
610 numberOfWrappedDimensions =
620 template <
class _elementOperationType>
624 template <
class _inputOutputNArrayType,
class _inputScalarType>
625 static void Run(_inputOutputNArrayType & inputOutputNArray,
626 const _inputScalarType inputScalar)
628 typedef _inputOutputNArrayType InputOutputNArrayType;
629 typedef typename InputOutputNArrayType::OwnerType InputOutputOwnerType;
630 typedef typename InputOutputOwnerType::const_pointer InputOutputConstPointerType;
631 typedef typename InputOutputOwnerType::pointer InputOutputPointerType;
634 InputOutputOwnerType & inputOutputOwner = inputOutputNArray.Owner();
637 if (inputOutputOwner.IsCompact()) {
641 const nsize_type & inputOutputSizes = inputOutputOwner.sizes();
642 const nstride_type & inputOutputStrides = inputOutputOwner.strides();
643 nstride_type inputOutputSTND;
645 InputOutputPointerType inputOutputPointer = inputOutputOwner.
Pointer();
647 dimension_type numberOfWrappedDimensions = 0;
648 const dimension_type maxWrappedDimensions = inputOutputOwner.dimension();
650 CalculateSTND(inputOutputSTND, inputOutputSizes, inputOutputStrides);
651 InitializeTargets(inputOutputTargets, inputOutputSizes, inputOutputStrides, inputOutputPointer);
653 while (numberOfWrappedDimensions != maxWrappedDimensions) {
654 _elementOperationType::Operate(*inputOutputPointer, inputScalar);
656 numberOfWrappedDimensions =
657 IncrementPointers(inputOutputTargets, inputOutputPointer, inputOutputStrides, inputOutputSTND);
664 template <
class _elementOperationType>
668 template <
class _inputOutputNArrayType,
class _inputNArrayType>
669 static void Run(_inputOutputNArrayType & inputOutputNArray,
670 const _inputNArrayType & inputNArray)
672 typedef _inputOutputNArrayType InputOutputNArrayType;
673 typedef typename InputOutputNArrayType::OwnerType InputOutputOwnerType;
674 typedef typename InputOutputOwnerType::const_pointer InputOutputConstPointerType;
675 typedef typename InputOutputOwnerType::pointer InputOutputPointerType;
677 typedef _inputNArrayType InputNArrayType;
678 typedef typename InputNArrayType::OwnerType InputOwnerType;
679 typedef typename InputOwnerType::const_pointer InputPointerType;
682 InputOutputOwnerType & inputOutputOwner = inputOutputNArray.Owner();
683 const InputOwnerType & inputOwner = inputNArray.Owner();
686 const nsize_type & inputOutputSizes = inputOutputOwner.sizes();
687 const nsize_type & inputSizes = inputOwner.sizes();
688 if (inputOutputSizes.NotEqual(inputSizes)) {
693 const nstride_type & inputOutputStrides = inputOutputOwner.strides();
694 const nstride_type & inputStrides = inputOwner.strides();
696 if (inputOutputOwner.IsCompact() && inputOwner.IsCompact()
697 && (inputOutputOwner.strides() == inputOwner.strides())) {
702 nstride_type inputOutputSTND;
704 InputOutputPointerType inputOutputPointer = inputOutputOwner.
Pointer();
707 nstride_type inputSTND;
708 nstride_type inputOTND;
709 InputPointerType inputPointer = inputOwner.Pointer();
711 dimension_type numberOfWrappedDimensions = 0;
712 const dimension_type maxWrappedDimensions = inputOutputOwner.dimension();
714 CalculateSTND(inputOutputSTND, inputOutputSizes, inputOutputStrides);
717 InitializeTargets(inputOutputTargets, inputOutputSizes, inputOutputStrides, inputOutputPointer);
719 while (numberOfWrappedDimensions != maxWrappedDimensions) {
720 _elementOperationType::Operate(*inputOutputPointer, *inputPointer);
722 numberOfWrappedDimensions =
723 IncrementPointers(inputOutputTargets, inputOutputPointer, inputOutputStrides, inputOutputSTND);
732 template <
class _elementOperationType>
736 template <
class _outputNArrayType,
class _inputNArrayType>
737 static inline void Run(_outputNArrayType & outputNArray,
738 const _inputNArrayType & inputNArray)
740 typedef _outputNArrayType OutputNArrayType;
741 typedef typename OutputNArrayType::OwnerType OutputOwnerType;
742 typedef typename OutputOwnerType::const_pointer OutputConstPointerType;
743 typedef typename OutputOwnerType::pointer OutputPointerType;
745 typedef _inputNArrayType InputNArrayType;
746 typedef typename InputNArrayType::OwnerType InputOwnerType;
747 typedef typename InputOwnerType::const_pointer InputPointerType;
750 OutputOwnerType & outputOwner = outputNArray.Owner();
751 const InputOwnerType & inputOwner = inputNArray.Owner();
754 const nsize_type & outputSizes = outputOwner.sizes();
755 const nsize_type & inputSizes = inputOwner.sizes();
756 if (inputSizes.NotEqual(outputSizes)) {
761 const nstride_type & outputStrides = outputOwner.strides();
762 const nstride_type & inputStrides = inputOwner.strides();
764 if (outputOwner.IsCompact() && inputOwner.IsCompact()
765 && (outputOwner.strides() == inputOwner.strides())) {
770 nstride_type outputSTND;
772 OutputPointerType outputPointer = outputOwner.
Pointer();
775 nstride_type inputSTND;
776 nstride_type inputOTND;
777 InputPointerType inputPointer = inputOwner.Pointer();
779 dimension_type numberOfWrappedDimensions = 0;
780 const dimension_type maxWrappedDimensions = outputOwner.dimension();
787 while (numberOfWrappedDimensions != maxWrappedDimensions) {
788 *outputPointer = _elementOperationType::Operate(*inputPointer);
790 numberOfWrappedDimensions =
800 template <
class _elementOperationType>
804 template <
class _inputOutputNArrayType>
805 static void Run(_inputOutputNArrayType & inputOutputNArray)
807 typedef _inputOutputNArrayType InputOutputNArrayType;
808 typedef typename InputOutputNArrayType::OwnerType InputOutputOwnerType;
809 typedef typename InputOutputOwnerType::const_pointer InputOutputConstPointerType;
810 typedef typename InputOutputOwnerType::pointer InputOutputPointerType;
813 InputOutputOwnerType & inputOutputOwner = inputOutputNArray.Owner();
816 const nstride_type & inputOutputStrides = inputOutputOwner.strides();
818 if (inputOutputOwner.IsCompact()) {
822 const nsize_type & inputOutputSizes = inputOutputOwner.sizes();
823 nstride_type inputOutputSTND;
825 InputOutputPointerType inputOutputPointer = inputOutputOwner.
Pointer();
827 dimension_type numberOfWrappedDimensions = 0;
828 const dimension_type maxWrappedDimensions = inputOutputOwner.dimension();
830 CalculateSTND(inputOutputSTND, inputOutputSizes, inputOutputStrides);
831 InitializeTargets(inputOutputTargets, inputOutputSizes, inputOutputStrides, inputOutputPointer);
833 while (numberOfWrappedDimensions != maxWrappedDimensions) {
834 _elementOperationType::Operate(*inputOutputPointer);
836 numberOfWrappedDimensions =
837 IncrementPointers(inputOutputTargets, inputOutputPointer, inputOutputStrides, inputOutputSTND);
844 template <
class _inputOutputElementOperationType,
class _scalarNArrayElementOperationType>
848 template <
class _inputOutputNArrayType,
class _inputScalarType,
class _inputNArrayType>
849 static void Run(_inputOutputNArrayType & inputOutputNArray,
850 const _inputScalarType inputScalar,
851 const _inputNArrayType & inputNArray)
853 typedef _inputOutputNArrayType InputOutputNArrayType;
854 typedef typename InputOutputNArrayType::OwnerType InputOutputOwnerType;
855 typedef typename InputOutputOwnerType::const_pointer InputOutputConstPointerType;
856 typedef typename InputOutputOwnerType::pointer InputOutputPointerType;
858 typedef _inputNArrayType InputNArrayType;
859 typedef typename InputNArrayType::OwnerType InputOwnerType;
860 typedef typename InputOwnerType::const_pointer InputPointerType;
863 InputOutputOwnerType & inputOutputOwner = inputOutputNArray.Owner();
864 const InputOwnerType & inputOwner = inputNArray.Owner();
867 const nsize_type & inputOutputSizes = inputOutputOwner.sizes();
868 const nsize_type & inputSizes = inputOwner.sizes();
869 if (inputOutputSizes.NotEqual(inputSizes)) {
874 const nstride_type & inputOutputStrides = inputOutputOwner.strides();
875 const nstride_type & inputStrides = inputOwner.strides();
877 if (inputOutputOwner.IsCompact() && inputOwner.IsCompact()
878 && (inputOutputOwner.strides() == inputOwner.strides())) {
883 nstride_type inputOutputSTND;
885 InputOutputPointerType inputOutputPointer = inputOutputNArray.
Pointer();
888 nstride_type inputSTND;
889 nstride_type inputOTND;
890 InputPointerType inputPointer = inputNArray.Pointer();
892 dimension_type numberOfWrappedDimensions = 0;
893 const dimension_type maxWrappedDimensions = inputOutputNArray.dimension();
895 CalculateSTND(inputOutputSTND, inputOutputSizes, inputOutputStrides);
898 InitializeTargets(inputOutputTargets, inputOutputSizes, inputOutputStrides, inputOutputPointer);
900 while (numberOfWrappedDimensions != maxWrappedDimensions) {
901 _inputOutputElementOperationType::Operate(*inputOutputPointer,
902 _scalarNArrayElementOperationType::Operate(inputScalar, *inputPointer) );
904 numberOfWrappedDimensions =
905 IncrementPointers(inputOutputTargets, inputOutputPointer, inputOutputStrides, inputOutputSTND);
915 template <
class _inputOutputElementOperationType,
class _nArrayElementOperationType>
919 template <
class _inputOutputNArrayType,
class _input1NArrayType,
class _input2NArrayType>
920 static void Run(_inputOutputNArrayType & inputOutputNArray,
921 const _input1NArrayType & input1NArray,
922 const _input2NArrayType & input2NArray)
924 typedef _inputOutputNArrayType InputOutputNArrayType;
925 typedef typename InputOutputNArrayType::OwnerType InputOutputOwnerType;
926 typedef typename InputOutputOwnerType::const_pointer InputOutputConstPointerType;
927 typedef typename InputOutputOwnerType::pointer InputOutputPointerType;
929 typedef _input1NArrayType Input1NArrayType;
930 typedef typename Input1NArrayType::OwnerType Input1OwnerType;
931 typedef typename Input1OwnerType::const_pointer Input1PointerType;
933 typedef _input2NArrayType Input2NArrayType;
934 typedef typename Input2NArrayType::OwnerType Input2OwnerType;
935 typedef typename Input2OwnerType::const_pointer Input2PointerType;
938 InputOutputOwnerType & inputOutputOwner = inputOutputNArray.Owner();
939 const Input1OwnerType & input1Owner = input1NArray.Owner();
940 const Input2OwnerType & input2Owner = input2NArray.Owner();
943 const nsize_type & inputOutputSizes = inputOutputOwner.sizes();
944 const nsize_type & input1Sizes = input1Owner.sizes();
945 const nsize_type & input2Sizes = input2Owner.sizes();
946 if (inputOutputSizes.NotEqual(input1Sizes) || inputOutputSizes.NotEqual(input2Sizes)) {
951 const nstride_type & inputOutputStrides = inputOutputOwner.strides();
952 const nstride_type & input1Strides = input1Owner.strides();
953 const nstride_type & input2Strides = input2Owner.strides();
955 if (inputOutputOwner.IsCompact() && input1Owner.IsCompact() && input2Owner.IsCompact()
956 && (inputOutputOwner.strides() == input1Owner.strides())
957 && (inputOutputOwner.strides() == input2Owner.strides())) {
962 nstride_type inputOutputSTND;
964 InputOutputPointerType inputOutputPointer = inputOutputNArray.
Pointer();
967 nstride_type input1STND;
968 nstride_type input1OTND;
969 Input1PointerType input1Pointer = input1NArray.Pointer();
972 nstride_type input2STND;
973 nstride_type input2OTND;
974 Input2PointerType input2Pointer = input2NArray.Pointer();
976 dimension_type numberOfWrappedDimensions = 0;
977 const dimension_type maxWrappedDimensions = inputOutputNArray.dimension();
979 CalculateSTND(inputOutputSTND, inputOutputSizes, inputOutputStrides);
984 InitializeTargets(inputOutputTargets, inputOutputSizes, inputOutputStrides, inputOutputPointer);
986 while (numberOfWrappedDimensions != maxWrappedDimensions) {
987 _inputOutputElementOperationType::Operate(*inputOutputPointer,
988 _nArrayElementOperationType::Operate(*input1Pointer, *input2Pointer) );
990 numberOfWrappedDimensions =
991 IncrementPointers(inputOutputTargets, inputOutputPointer, inputOutputStrides, inputOutputSTND);
1004 template <
class _inputNArrayType>
1005 static void Run(
const _inputNArrayType & inputNArray,
1006 typename _inputNArrayType::value_type & minValue,
1007 typename _inputNArrayType::value_type & maxValue)
1009 typedef _inputNArrayType InputNArrayType;
1010 typedef typename InputNArrayType::OwnerType InputOwnerType;
1011 typedef typename InputOwnerType::value_type
value_type;
1012 typedef typename InputOwnerType::const_pointer InputPointerType;
1015 const InputOwnerType & inputOwner = inputNArray.Owner();
1016 InputPointerType inputPointer = inputOwner.Pointer();
1018 if (inputPointer == 0)
1022 if (inputOwner.IsCompact()) {
1026 const nsize_type & inputSizes = inputOwner.sizes();
1027 const nstride_type & inputStrides = inputOwner.strides();
1028 nstride_type inputSTND;
1031 dimension_type numberOfWrappedDimensions = 0;
1032 const dimension_type maxWrappedDimensions = inputOwner.dimension();
1037 value_type minElement, maxElement, inputElement;
1038 minElement = maxElement = *inputPointer;
1040 while (numberOfWrappedDimensions != maxWrappedDimensions) {
1041 inputElement = *inputPointer;
1043 if (inputElement < minElement) {
1044 minElement = inputElement;
1045 }
else if (inputElement > maxElement) {
1046 maxElement = inputElement;
1049 numberOfWrappedDimensions =
1052 minValue = minElement;
1053 maxValue = maxElement;
static void Run(_ioOwnerType &ioOwner, const _input1OwnerType &input1Owner, const _input2OwnerType &input2Owner)
Definition vctDynamicCompactLoopEngines.h:549
static void Run(_inputOutputOwnerType &inputOutputOwner, const _inputOwnerType &inputOwner)
Definition vctDynamicCompactLoopEngines.h:121
static void Run(_inputOutputOwnerType &inputOutputOwner)
Definition vctDynamicCompactLoopEngines.h:367
static void Run(_ioOwnerType &ioOwner, const _inputScalarType inputScalar, const _inputOwnerType &inputOwner)
Definition vctDynamicCompactLoopEngines.h:500
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
static OutputType Run(const _inputOwnerType &inputOwner, const _inputScalarType &inputScalar)
Definition vctDynamicCompactLoopEngines.h:603
Definition vctDynamicNArrayLoopEngines.h:1002
static void Run(const _inputNArrayType &inputNArray, typename _inputNArrayType::value_type &minValue, typename _inputNArrayType::value_type &maxValue)
Definition vctDynamicNArrayLoopEngines.h:1005
Definition vctDynamicNArrayLoopEngines.h:802
static void Run(_inputOutputNArrayType &inputOutputNArray)
Definition vctDynamicNArrayLoopEngines.h:805
Definition vctDynamicNArrayLoopEngines.h:666
static void Run(_inputOutputNArrayType &inputOutputNArray, const _inputNArrayType &inputNArray)
Definition vctDynamicNArrayLoopEngines.h:669
Definition vctDynamicNArrayLoopEngines.h:917
static void Run(_inputOutputNArrayType &inputOutputNArray, const _input1NArrayType &input1NArray, const _input2NArrayType &input2NArray)
Definition vctDynamicNArrayLoopEngines.h:920
Definition vctDynamicNArrayLoopEngines.h:622
static void Run(_inputOutputNArrayType &inputOutputNArray, const _inputScalarType inputScalar)
Definition vctDynamicNArrayLoopEngines.h:625
Definition vctDynamicNArrayLoopEngines.h:846
static void Run(_inputOutputNArrayType &inputOutputNArray, const _inputScalarType inputScalar, const _inputNArrayType &inputNArray)
Definition vctDynamicNArrayLoopEngines.h:849
Definition vctDynamicNArrayLoopEngines.h:734
static void Run(_outputNArrayType &outputNArray, const _inputNArrayType &inputNArray)
Definition vctDynamicNArrayLoopEngines.h:737
Definition vctDynamicNArrayLoopEngines.h:398
static void Run(_outputNArrayType &outputNArray, const _input1NArrayType &input1NArray, const _input2NArrayType &input2NArray)
Definition vctDynamicNArrayLoopEngines.h:401
Definition vctDynamicNArrayLoopEngines.h:484
static void Run(_outputNArrayType &outputNArray, const _inputNArrayType &inputNArray, const _inputScalarType inputScalar)
Definition vctDynamicNArrayLoopEngines.h:487
Definition vctDynamicNArrayLoopEngines.h:553
static void Run(_outputNArrayType &outputNArray, const _inputScalarType inputScalar, const _inputNArrayType &inputNArray)
Definition vctDynamicNArrayLoopEngines.h:556
Definition vctDynamicNArrayLoopEngines.h:225
_incrementalOperationType::OutputType OutputType
Definition vctDynamicNArrayLoopEngines.h:227
static OutputType Run(const _inputNArrayType &inputNArray)
Definition vctDynamicNArrayLoopEngines.h:230
Definition vctDynamicNArrayLoopEngines.h:274
static OutputType Run(const _input1NArrayType &input1NArray, const _input2NArrayType &input2NArray)
Definition vctDynamicNArrayLoopEngines.h:279
_incrementalOperationType::OutputType OutputType
Definition vctDynamicNArrayLoopEngines.h:276
Definition vctDynamicNArrayLoopEngines.h:348
static OutputType Run(const _inputNArrayType &inputNArray, const _inputScalarType inputScalar)
Definition vctDynamicNArrayLoopEngines.h:353
_incrementalOperationType::OutputType OutputType
Definition vctDynamicNArrayLoopEngines.h:350
Container class for the dynamic nArray engines.
Definition vctDynamicNArrayLoopEngines.h:42
vct::index_type index_type
Definition vctDynamicNArrayLoopEngines.h:48
static void SyncCurrentPointer(const _elementType *¤tPointer, const nstride_type &otnd, difference_type numberOfWrappedDimensions)
Definition vctDynamicNArrayLoopEngines.h:140
static void InitializeTargets(vctFixedSizeVector< const _elementType *, _dimension > &targets, const nsize_type &sizes, const nstride_type &strides, const _elementType *basePtr)
Definition vctDynamicNArrayLoopEngines.h:113
static void ThrowSizeMismatchException(void) CISST_THROW(std
Definition vctDynamicNArrayLoopEngines.h:54
static void CalculateOTND(nstride_type &otnd, const nstride_type &strides, const nstride_type &stnd)
Definition vctDynamicNArrayLoopEngines.h:88
VCT_NARRAY_TRAITS_TYPEDEFS(_dimension)
static dimension_type IncrementPointers(vctFixedSizeVector< const _elementType *, _dimension > &targets, _pointerType ¤tPointer, const nstride_type &strides, const nstride_type &stnd)
Definition vctDynamicNArrayLoopEngines.h:152
vct::size_type size_type
Definition vctDynamicNArrayLoopEngines.h:45
static void CalculateSTND(nstride_type &stnd, const nsize_type &sizes, const nstride_type &strides)
Definition vctDynamicNArrayLoopEngines.h:61
vct::difference_type difference_type
Definition vctDynamicNArrayLoopEngines.h:47
vct::stride_type stride_type
Definition vctDynamicNArrayLoopEngines.h:46
VectorTraits::const_iterator const_iterator
Definition vctFixedSizeConstVectorBase.h:126
VectorTraits::const_reverse_iterator const_reverse_iterator
Definition vctFixedSizeConstVectorBase.h:132
VectorTraits::iterator iterator
Definition vctFixedSizeConstVectorBase.h:123
VectorTraits::reverse_iterator reverse_iterator
Definition vctFixedSizeConstVectorBase.h:129
iterator begin(void)
Definition vctFixedSizeVectorBase.h:117
reverse_iterator rbegin(void)
Definition vctFixedSizeVectorBase.h:143
pointer Pointer(size_type index=0)
Definition vctFixedSizeVectorBase.h:226
iterator end(void)
Definition vctFixedSizeVectorBase.h:130
Implementation of a fixed-size vector using template metaprogramming.
Definition vctFixedSizeVector.h:54
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
ptrdiff_t difference_type
Definition vctContainerTraits.h:38
size_t size_type
Definition vctContainerTraits.h:35
size_t index_type
Definition vctContainerTraits.h:36
ptrdiff_t stride_type
Definition vctContainerTraits.h:37
Basic traits for the cisstVector containers.
Declaration of vctDynamicCompactLoopEngines.
const nsize_type & sizes(void) const
Definition vctDynamicConstMatrixBase.h:233
const nstride_type & strides(void) const
Definition vctDynamicConstMatrixBase.h:258
Declaration of vctFixedSizeVector.