22 #ifndef _vctDynamicCompactLoopEngines_h
23 #define _vctDynamicCompactLoopEngines_h
71 template<
class _elementOperationType>
74 template<
class _outputOwnerType,
class _input1OwnerType,
class _input2OwnerType>
75 static inline void Run(_outputOwnerType & outputOwner,
76 const _input1OwnerType & input1Owner,
77 const _input2OwnerType & input2Owner) {
79 typedef _outputOwnerType OutputOwnerType;
80 typedef typename OutputOwnerType::pointer OutputPointerType;
83 typedef _input1OwnerType Input1OwnerType;
84 typedef typename Input1OwnerType::const_pointer Input1PointerType;
86 typedef _input2OwnerType Input2OwnerType;
87 typedef typename Input2OwnerType::const_pointer Input2PointerType;
89 const size_type size = outputOwner.size();
91 OutputPointerType outputPointer = outputOwner.Pointer();
92 const OutputPointerType outputEnd = outputPointer + size;
94 Input1PointerType input1Pointer = input1Owner.Pointer();
95 Input2PointerType input2Pointer = input2Owner.Pointer();
98 outputPointer != outputEnd;
99 outputPointer++, input1Pointer++, input2Pointer++) {
100 *outputPointer = _elementOperationType::Operate(*input1Pointer, *input2Pointer);
117 template<
class _elementOperationType>
120 template<
class _inputOutputOwnerType,
class _inputOwnerType>
121 static void Run(_inputOutputOwnerType & inputOutputOwner,
122 const _inputOwnerType & inputOwner) {
124 typedef _inputOutputOwnerType InputOutputOwnerType;
125 typedef typename InputOutputOwnerType::pointer InputOutputPointerType;
128 typedef _inputOwnerType InputOwnerType;
129 typedef typename InputOwnerType::const_pointer InputPointerType;
131 const size_type size = inputOutputOwner.size();
133 InputOutputPointerType inputOutputPointer = inputOutputOwner.Pointer();
134 const InputOutputPointerType inputOutputEnd = inputOutputPointer + size;
136 InputPointerType inputPointer = inputOwner.Pointer();
139 inputOutputPointer != inputOutputEnd;
140 inputOutputPointer++, inputPointer++) {
141 *inputOutputPointer = _elementOperationType::Operate(*inputOutputPointer, *inputPointer);
159 template<
class _elementOperationType>
162 template<
class _inputOutput1OwnerType,
class _inputOutput2OwnerType>
163 static void Run(_inputOutput1OwnerType & inputOutput1Owner,
164 _inputOutput2OwnerType & inputOutput2Owner) {
166 typedef _inputOutput1OwnerType InputOutput1OwnerType;
167 typedef typename InputOutput1OwnerType::pointer InputOutput1PointerType;
170 typedef _inputOutput2OwnerType InputOutput2OwnerType;
171 typedef typename InputOutput2OwnerType::pointer InputOutput2PointerType;
173 const size_type size = inputOutput1Owner.size();
175 InputOutput1PointerType inputOutput1Pointer = inputOutput1Owner.Pointer();
176 const InputOutput1PointerType inputOutput1End = inputOutput1Pointer + size;
178 InputOutput2PointerType inputOutput2Pointer = inputOutput2Owner.Pointer();
181 inputOutput1Pointer != inputOutput1End;
182 inputOutput1Pointer++, inputOutput2Pointer++) {
183 _elementOperationType::Operate(*inputOutput1Pointer, *inputOutput2Pointer);
200 template<
class _elementOperationType>
203 template<
class _outputOwnerType,
class _inputOwnerType,
class _inputScalarType>
204 static inline void Run(_outputOwnerType & outputOwner,
205 const _inputOwnerType & inputOwner,
206 const _inputScalarType inputScalar) {
208 typedef _outputOwnerType OutputOwnerType;
209 typedef typename OutputOwnerType::pointer OutputPointerType;
212 typedef _inputOwnerType InputOwnerType;
213 typedef typename InputOwnerType::const_pointer InputPointerType;
215 const size_type size = outputOwner.size();
217 OutputPointerType outputPointer = outputOwner.Pointer();
218 const OutputPointerType outputEnd = outputPointer + size;
220 InputPointerType inputPointer = inputOwner.Pointer();
223 outputPointer != outputEnd;
224 outputPointer++, inputPointer++) {
225 *outputPointer = _elementOperationType::Operate(*inputPointer, inputScalar);
242 template<
class _elementOperationType>
245 template<
class _outputOwnerType,
class _inputScalarType,
class _inputOwnerType>
246 static inline void Run(_outputOwnerType & outputOwner,
247 const _inputScalarType inputScalar,
248 const _inputOwnerType & inputOwner) {
250 typedef _outputOwnerType OutputOwnerType;
251 typedef typename OutputOwnerType::pointer OutputPointerType;
254 typedef _inputOwnerType InputOwnerType;
255 typedef typename InputOwnerType::const_pointer InputPointerType;
257 const size_type size = outputOwner.size();
259 OutputPointerType outputPointer = outputOwner.Pointer();
260 const OutputPointerType outputEnd = outputPointer + size;
262 InputPointerType inputPointer = inputOwner.Pointer();
265 outputPointer != outputEnd;
266 outputPointer++, inputPointer++) {
267 *outputPointer = _elementOperationType::Operate(inputScalar, *inputPointer);
285 template<
class _elementOperationType>
288 template<
class _inputOutputOwnerType,
class _inputScalarType>
289 static void Run(_inputOutputOwnerType & inputOutputOwner,
290 const _inputScalarType inputScalar) {
292 typedef _inputOutputOwnerType InputOutputOwnerType;
293 typedef typename InputOutputOwnerType::pointer InputOutputPointerType;
296 const size_type size = inputOutputOwner.size();
298 InputOutputPointerType inputOutputPointer = inputOutputOwner.Pointer();
299 const InputOutputPointerType inputOutputEnd = inputOutputPointer + size;;
302 inputOutputPointer != inputOutputEnd;
303 inputOutputPointer++) {
304 _elementOperationType::Operate(*inputOutputPointer, inputScalar);
321 template<
class _elementOperationType>
324 template<
class _outputOwnerType,
class _inputOwnerType>
325 static inline void Run(_outputOwnerType & outputOwner,
326 const _inputOwnerType & inputOwner) {
328 typedef _outputOwnerType OutputOwnerType;
329 typedef typename OutputOwnerType::pointer OutputPointerType;
332 typedef _inputOwnerType InputOwnerType;
333 typedef typename InputOwnerType::const_pointer InputPointerType;
335 OutputPointerType outputPointer = outputOwner.Pointer();
336 const size_type size = outputOwner.size();
337 const OutputPointerType outputEnd = outputPointer + size;
339 InputPointerType inputPointer = inputOwner.Pointer();
342 outputPointer != outputEnd;
343 outputPointer++, inputPointer++) {
344 *outputPointer = _elementOperationType::Operate(*inputPointer);
363 template<
class _elementOperationType>
366 template<
class _inputOutputOwnerType>
367 static inline void Run(_inputOutputOwnerType & inputOutputOwner) {
369 typedef _inputOutputOwnerType InputOutputOwnerType;
370 typedef typename InputOutputOwnerType::pointer InputOutputPointerType;
373 const size_type size = inputOutputOwner.size();
375 InputOutputPointerType inputOutputPointer = inputOutputOwner.Pointer();
376 const InputOutputPointerType inputOutputEnd = inputOutputPointer + size;
379 inputOutputPointer != inputOutputEnd;
380 inputOutputPointer++) {
381 _elementOperationType::Operate(*inputOutputPointer);
400 template<
class _incrementalOperationType,
class _elementOperationType>
403 typedef typename _incrementalOperationType::OutputType
OutputType;
405 template<
class _inputOwnerType>
408 typedef _inputOwnerType InputOwnerType;
409 typedef typename InputOwnerType::const_pointer InputPointerType;
412 const size_type size = inputOwner.size();
413 OutputType incrementalResult = _incrementalOperationType::NeutralElement();
415 InputPointerType inputPointer = inputOwner.Pointer();
416 const InputPointerType inputEnd = inputPointer + size;
419 inputPointer != inputEnd;
421 incrementalResult = _incrementalOperationType::Operate(incrementalResult,
422 _elementOperationType::Operate(*inputPointer));
424 return incrementalResult;
444 template<
class _incrementalOperationType,
class _elementOperationType>
447 typedef typename _incrementalOperationType::OutputType
OutputType;
449 template<
class _input1OwnerType,
class _input2OwnerType>
451 const _input2OwnerType & input2Owner) {
453 typedef _input1OwnerType Input1OwnerType;
454 typedef typename Input1OwnerType::const_pointer Input1PointerType;
457 typedef _input2OwnerType Input2OwnerType;
458 typedef typename Input2OwnerType::const_pointer Input2PointerType;
460 const size_type size = input1Owner.size();
462 OutputType incrementalResult = _incrementalOperationType::NeutralElement();
464 Input1PointerType input1Pointer = input1Owner.Pointer();
465 const Input1PointerType input1End = input1Pointer + size;
467 Input2PointerType input2Pointer = input2Owner.Pointer();
470 input1Pointer != input1End;
471 input1Pointer++, input2Pointer++) {
472 incrementalResult = _incrementalOperationType::Operate(incrementalResult,
473 _elementOperationType::Operate(*input1Pointer,
476 return incrementalResult;
496 template<
class _ioElementOperationType,
class _scalarElementOperationType>
499 template<
class _ioOwnerType,
class _inputScalarType,
class _inputOwnerType>
500 static inline void Run(_ioOwnerType & ioOwner,
501 const _inputScalarType inputScalar,
const _inputOwnerType & inputOwner)
503 typedef _ioOwnerType IoOwnerType;
504 typedef typename IoOwnerType::pointer IoPointerType;
507 typedef _inputOwnerType InputOwnerType;
508 typedef typename InputOwnerType::const_pointer InputPointerType;
510 const size_type size = ioOwner.size();
512 IoPointerType ioPointer = ioOwner.Pointer();
513 const IoPointerType ioEnd = ioPointer + size;
515 InputPointerType inputPointer = inputOwner.Pointer();
519 ioPointer++, inputPointer++)
521 _ioElementOperationType::Operate(*ioPointer,
522 _scalarElementOperationType::Operate(inputScalar, *inputPointer));
545 template<
class _ioElementOperationType,
class _ownerElementOperationType>
548 template<
class _ioOwnerType,
class _input1OwnerType,
class _input2OwnerType>
549 static inline void Run(_ioOwnerType & ioOwner,
550 const _input1OwnerType & input1Owner,
const _input2OwnerType & input2Owner)
552 typedef _ioOwnerType IoOwnerType;
553 typedef typename IoOwnerType::pointer IoPointerType;
556 typedef _input1OwnerType Input1OwnerType;
557 typedef typename Input1OwnerType::const_pointer Input1PointerType;
559 typedef _input2OwnerType Input2OwnerType;
560 typedef typename Input2OwnerType::const_pointer Input2PointerType;
562 const size_type size = ioOwner.size();
564 IoPointerType ioPointer = ioOwner.Pointer();
565 const IoPointerType ioEnd = ioPointer + size;
567 Input1PointerType input1Pointer = input1Owner.Pointer();
568 Input2PointerType input2Pointer = input2Owner.Pointer();
572 ioPointer++, input1Pointer++, input2Pointer++)
574 _ioElementOperationType::Operate(*ioPointer,
575 _ownerElementOperationType::Operate(*input1Pointer, *input2Pointer));
597 template<
class _incrementalOperationType,
class _elementOperationType>
600 typedef typename _incrementalOperationType::OutputType
OutputType;
602 template<
class _inputOwnerType,
class _inputScalarType>
604 const _inputScalarType & inputScalar) {
606 typedef _inputOwnerType InputOwnerType;
607 typedef typename InputOwnerType::const_pointer InputPointerType;
610 const size_type size = inputOwner.size();
611 OutputType incrementalResult = _incrementalOperationType::NeutralElement();
613 InputPointerType inputPointer = inputOwner.Pointer();
614 const InputPointerType inputEnd = inputPointer + size;
617 inputPointer != inputEnd;
619 incrementalResult = _incrementalOperationType::Operate(incrementalResult,
620 _elementOperationType::Operate(*inputPointer, inputScalar));
622 return incrementalResult;
629 template<
class _inputOwnerType>
630 static void Run(
const _inputOwnerType & inputOwner,
typename _inputOwnerType::value_type & minValue,
631 typename _inputOwnerType::value_type & maxValue)
633 typedef _inputOwnerType InputOwnerType;
634 typedef typename InputOwnerType::const_pointer InputPointerType;
636 typedef typename InputOwnerType::value_type value_type;
638 InputPointerType inputPointer = inputOwner.Pointer();
640 const size_type size = inputOwner.size();
641 const InputPointerType inputEnd = inputPointer + size;
643 value_type minElement, maxElement;
644 maxElement = minElement = *inputPointer;
647 inputPointer != inputEnd;
649 const value_type element = *inputPointer;
650 if (element < minElement) {
651 minElement = element;
652 }
else if (maxElement < element) {
653 maxElement = element;
656 minValue = minElement;
657 maxValue = maxElement;
664 #endif // _vctDynamicCompactLoopEngines_h
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 compact containers.
Definition: vctDynamicCompactLoopEngines.h:160
Implement operation of the form for compact containers.
Definition: vctDynamicCompactLoopEngines.h:243
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
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
_incrementalOperationType::OutputType OutputType
Definition: vctDynamicCompactLoopEngines.h:403
size_t size_type
Definition: vctContainerTraits.h:35
_incrementalOperationType::OutputType OutputType
Definition: vctDynamicCompactLoopEngines.h:600
Container class for the loop based engines for compact containers.
Definition: vctDynamicCompactLoopEngines.h:56
Implement operation of the form for compact containers.
Definition: vctDynamicCompactLoopEngines.h:401
Implement operation of the form for compact containers.
Definition: vctDynamicCompactLoopEngines.h:364
static void Run(_inputOutput1OwnerType &inputOutput1Owner, _inputOutput2OwnerType &inputOutput2Owner)
Definition: vctDynamicCompactLoopEngines.h:163
Implement operation of the form for compact containers.
Definition: vctDynamicCompactLoopEngines.h:497
static void Run(_ioOwnerType &ioOwner, const _input1OwnerType &input1Owner, const _input2OwnerType &input2Owner)
Definition: vctDynamicCompactLoopEngines.h:549
Implement operation of the form for compact containers.
Definition: vctDynamicCompactLoopEngines.h:286
Implement operation of the form for compact containers.
Definition: vctDynamicCompactLoopEngines.h:118
Definition: vctDynamicCompactLoopEngines.h:627
Implement operation of the form for compact containers.
Definition: vctDynamicCompactLoopEngines.h:598
Implement operation of the form for compact containers.
Definition: vctDynamicCompactLoopEngines.h:72
Implement operation of the form for compact containers.
Definition: vctDynamicCompactLoopEngines.h:445
Implement operation of the form for compact containers.
Definition: vctDynamicCompactLoopEngines.h:201
static void Run(_outputOwnerType &outputOwner, const _input1OwnerType &input1Owner, const _input2OwnerType &input2Owner)
Definition: vctDynamicCompactLoopEngines.h:75
static void Run(_outputOwnerType &outputOwner, const _inputOwnerType &inputOwner, const _inputScalarType inputScalar)
Definition: vctDynamicCompactLoopEngines.h:204
Declaration of the template function cmnThrow.
static OutputType Run(const _inputOwnerType &inputOwner, const _inputScalarType &inputScalar)
Definition: vctDynamicCompactLoopEngines.h:603
Implement operation of the form for compact containers.
Definition: vctDynamicCompactLoopEngines.h:546
static void Run(const _inputOwnerType &inputOwner, typename _inputOwnerType::value_type &minValue, typename _inputOwnerType::value_type &maxValue)
Definition: vctDynamicCompactLoopEngines.h:630
Implement operation of the form for compact containers.
Definition: vctDynamicCompactLoopEngines.h:322
static void Run(_ioOwnerType &ioOwner, const _inputScalarType inputScalar, const _inputOwnerType &inputOwner)
Definition: vctDynamicCompactLoopEngines.h:500
_incrementalOperationType::OutputType OutputType
Definition: vctDynamicCompactLoopEngines.h:447