cisst-saw
Loading...
Searching...
No Matches
vctBinaryOperations.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: 2003-08-18
8
9 (C) Copyright 2003-2013 Johns Hopkins University (JHU), All Rights
10 Reserved.
11
12--- begin cisst license - do not edit ---
13
14This software is provided "as is" under an open source license, with
15no warranty. The complete license can be found in license.txt and
16http://www.cisst.org/cisst/license.txt.
17
18--- end cisst license ---
19*/
20
21#pragma once
22#ifndef _vctBinaryOperations_h
23#define _vctBinaryOperations_h
24
29
31
61template<class _outputType, class _input1Type = _outputType, class _input2Type = _outputType>
63 public:
64 typedef _outputType OutputType;
65 typedef _input1Type Input1Type;
66 typedef _input2Type Input2Type;
67
72 class Addition {
73 public:
74 typedef _outputType OutputType;
80 static inline OutputType Operate(const Input1Type & input1, const Input2Type & input2) {
81 return OutputType(input1+input2);
82 }
83
84 static inline OutputType NeutralElement()
85 {
86 return OutputType(0);
87 }
88 };
89
95 public:
96 typedef _outputType OutputType;
102 static inline OutputType Operate(const Input1Type & input1, const Input2Type & input2) {
103 return OutputType(input1-input2);
104 }
105
107 {
108 return OutputType(0);
109 }
110 };
111
117 public:
118 typedef _outputType OutputType;
124 static inline OutputType Operate(const Input1Type & input1, const Input2Type & input2) {
125 return OutputType(input1*input2);
126 }
127
129 {
130 return OutputType(1);
131 }
132 };
133
138 class Division {
139 public:
140 typedef _outputType OutputType;
146 static inline OutputType Operate(const Input1Type & input1, const Input2Type & input2) {
147 return OutputType(input1 / input2);
148 }
149
151 {
152 return OutputType(1);
153 }
154 };
155
156
162 public:
163 typedef _outputType OutputType;
169 static inline OutputType Operate(const Input1Type & input1, const Input2Type & CMN_UNUSED(input2)) {
170 return OutputType(input1);
171 }
172 };
173
181 public:
182 typedef _outputType OutputType;
188 static inline OutputType Operate(const Input1Type & CMN_UNUSED(input1), const Input2Type & input2) {
189 return OutputType(input2);
190 }
191 };
192
200 class Maximum {
201 public:
202 typedef _outputType OutputType;
208 static inline const OutputType & Operate(const OutputType & input1, const OutputType & input2) {
209 return (input1 > input2) ? input1 : input2;
210 }
211
216 };
217
225 class Minimum {
226 public:
227 typedef _outputType OutputType;
233 static inline const OutputType & Operate(const OutputType & input1, const OutputType & input2) {
234 return (input1 < input2) ? input1 : input2;
235 }
236
241 };
242
252 class ClipIn {
253 public:
254 typedef _outputType OutputType;
260 static inline const OutputType Operate(const OutputType & bound, const OutputType & input) {
261 if (input > bound) {
262 return bound;
263 } else if (input < -bound) {
264 return -bound;
265 }
266 return input;
267 }
268
272 };
273
274
282 class Equal {
283 public:
284 typedef _outputType OutputType;
290 static inline OutputType Operate(const Input1Type & input1, const Input2Type & input2) {
291 return OutputType(input1 == input2);
292 }
293 };
294
302 class NotEqual {
303 public:
304 typedef _outputType OutputType;
310 static inline OutputType Operate(const Input1Type & input1, const Input2Type & input2) {
311 return OutputType(input1 != input2);
312 }
313 };
314
322 class Lesser {
323 public:
324 typedef _outputType OutputType;
330 static inline OutputType Operate(const Input1Type & input1, const Input2Type & input2) {
331 return OutputType(input1 < input2);
332 }
333 };
334
344 public:
345 typedef _outputType OutputType;
351 static inline OutputType Operate(const Input1Type & input1, const Input2Type & input2) {
352 return OutputType(input1 <= input2);
353 }
354 };
355
363 class Greater {
364 public:
365 typedef bool OutputType;
371 static inline OutputType Operate(const Input1Type & input1, const Input2Type & input2) {
372 return OutputType(input1 > input2);
373 }
374 };
375
385 public:
386 typedef _outputType OutputType;
392 static inline OutputType Operate(const Input1Type & input1, const Input2Type & input2) {
393 return OutputType(input1 >= input2);
394 }
395 };
396
403 class And {
404 public:
405 typedef _outputType OutputType;
411 static inline OutputType Operate(const Input1Type & input1, const Input2Type & input2) {
412 return OutputType(input1 && input2);
413 }
414
416 {
417 return OutputType(true);
418 }
419 };
420
427 class Or {
428 public:
429 typedef _outputType OutputType;
435 static inline OutputType Operate(const OutputType & input1, const OutputType & input2) {
436 return OutputType(input1 || input2);
437 }
438
440 {
441 return OutputType(false);
442 }
443 };
444
454 class Bound {
455 public:
456 typedef _outputType OutputType;
457 static inline OutputType Operate(const Input1Type & input1, const Input2Type & input2) {
458 return OutputType( (-input2 <= input1) && (input1 <= input2) );
459 }
460 };
461
462
472 public:
473 typedef _outputType OutputType;
474 static inline OutputType Operate(const Input1Type & input1, const Input2Type & input2) {
475 return input1.DotProduct(input2);
476 }
477 };
478
479
480};
481
482// Specialize Addition for bool to avoid compiler warnings. Other binary operations
483// can be specialized if needed.
484template<>
485class vctBinaryOperations<bool, bool, bool>::Addition {
486 public:
492 static inline bool Operate(const bool & input1, const bool & input2) {
493 return (input1|input2);
494 }
495
496 static inline bool NeutralElement()
497 {
498 return false;
499 }
500};
501
502
503#endif // _vctBinaryOperations_h
504
static CISST_EXPORT Type MaxPositiveValue(void)
static CISST_EXPORT Type MinNegativeValue(void)
Returns the sum of the two InputType object.
Definition vctBinaryOperations.h:72
static OutputType Operate(const Input1Type &input1, const Input2Type &input2)
Definition vctBinaryOperations.h:80
static bool Operate(const bool &input1, const bool &input2)
Definition vctBinaryOperations.h:492
_outputType OutputType
Definition vctBinaryOperations.h:74
static bool NeutralElement()
Definition vctBinaryOperations.h:496
static OutputType NeutralElement()
Definition vctBinaryOperations.h:84
Logical And operator between input1 and input2.
Definition vctBinaryOperations.h:403
_outputType OutputType
Definition vctBinaryOperations.h:405
static OutputType Operate(const Input1Type &input1, const Input2Type &input2)
Definition vctBinaryOperations.h:411
static OutputType NeutralElement()
Definition vctBinaryOperations.h:415
Test if the first argument is bound by the second argument.
Definition vctBinaryOperations.h:454
_outputType OutputType
Definition vctBinaryOperations.h:456
static OutputType Operate(const Input1Type &input1, const Input2Type &input2)
Definition vctBinaryOperations.h:457
Return the -input2 in input1 is lesser than -input2, input2 if input 1 is greater than input2 and inp...
Definition vctBinaryOperations.h:252
static OutputType NeutralElement(void)
Definition vctBinaryOperations.h:269
_outputType OutputType
Definition vctBinaryOperations.h:254
static const OutputType Operate(const OutputType &bound, const OutputType &input)
Definition vctBinaryOperations.h:260
Returns the ratio of the two InputType object.
Definition vctBinaryOperations.h:138
static OutputType NeutralElement()
Definition vctBinaryOperations.h:150
_outputType OutputType
Definition vctBinaryOperations.h:140
static OutputType Operate(const Input1Type &input1, const Input2Type &input2)
Definition vctBinaryOperations.h:146
Dot product.
Definition vctBinaryOperations.h:471
static OutputType Operate(const Input1Type &input1, const Input2Type &input2)
Definition vctBinaryOperations.h:474
_outputType OutputType
Definition vctBinaryOperations.h:473
Test for equality between input1 and input2.
Definition vctBinaryOperations.h:282
_outputType OutputType
Definition vctBinaryOperations.h:284
static OutputType Operate(const Input1Type &input1, const Input2Type &input2)
Definition vctBinaryOperations.h:290
Return the first operand of (input1, input2), i.e., input1.
Definition vctBinaryOperations.h:161
_outputType OutputType
Definition vctBinaryOperations.h:163
static OutputType Operate(const Input1Type &input1, const Input2Type &CMN_UNUSED(input2))
Definition vctBinaryOperations.h:169
Test if input1 is greater than input2.
Definition vctBinaryOperations.h:363
static OutputType Operate(const Input1Type &input1, const Input2Type &input2)
Definition vctBinaryOperations.h:371
bool OutputType
Definition vctBinaryOperations.h:365
Test if input1 is greater than or equal to input2.
Definition vctBinaryOperations.h:384
static OutputType Operate(const Input1Type &input1, const Input2Type &input2)
Definition vctBinaryOperations.h:392
_outputType OutputType
Definition vctBinaryOperations.h:386
Test if input1 is lesser than input2.
Definition vctBinaryOperations.h:322
_outputType OutputType
Definition vctBinaryOperations.h:324
static OutputType Operate(const Input1Type &input1, const Input2Type &input2)
Definition vctBinaryOperations.h:330
Test if input1 is lesser than or equal to input2.
Definition vctBinaryOperations.h:343
static OutputType Operate(const Input1Type &input1, const Input2Type &input2)
Definition vctBinaryOperations.h:351
_outputType OutputType
Definition vctBinaryOperations.h:345
Return the greater of (input1, input2).
Definition vctBinaryOperations.h:200
_outputType OutputType
Definition vctBinaryOperations.h:202
static OutputType NeutralElement()
Definition vctBinaryOperations.h:212
static const OutputType & Operate(const OutputType &input1, const OutputType &input2)
Definition vctBinaryOperations.h:208
Return the lesser of (input1, input2).
Definition vctBinaryOperations.h:225
_outputType OutputType
Definition vctBinaryOperations.h:227
static OutputType NeutralElement()
Definition vctBinaryOperations.h:237
static const OutputType & Operate(const OutputType &input1, const OutputType &input2)
Definition vctBinaryOperations.h:233
Returns the product of the two InputType object.
Definition vctBinaryOperations.h:116
static OutputType Operate(const Input1Type &input1, const Input2Type &input2)
Definition vctBinaryOperations.h:124
_outputType OutputType
Definition vctBinaryOperations.h:118
static OutputType NeutralElement()
Definition vctBinaryOperations.h:128
Test for non equality between input1 and input2.
Definition vctBinaryOperations.h:302
static OutputType Operate(const Input1Type &input1, const Input2Type &input2)
Definition vctBinaryOperations.h:310
_outputType OutputType
Definition vctBinaryOperations.h:304
Logical Or operator between input1 and input2.
Definition vctBinaryOperations.h:427
static OutputType Operate(const OutputType &input1, const OutputType &input2)
Definition vctBinaryOperations.h:435
_outputType OutputType
Definition vctBinaryOperations.h:429
static OutputType NeutralElement()
Definition vctBinaryOperations.h:439
Return the second operand of (input1, input2), i.e., input2.
Definition vctBinaryOperations.h:180
static OutputType Operate(const Input1Type &CMN_UNUSED(input1), const Input2Type &input2)
Definition vctBinaryOperations.h:188
_outputType OutputType
Definition vctBinaryOperations.h:182
Returns the difference of the two InputType object.
Definition vctBinaryOperations.h:94
static OutputType Operate(const Input1Type &input1, const Input2Type &input2)
Definition vctBinaryOperations.h:102
static OutputType NeutralElement()
Definition vctBinaryOperations.h:106
_outputType OutputType
Definition vctBinaryOperations.h:96
Define binary operations between objects as classes.
Definition vctBinaryOperations.h:62
_input1Type Input1Type
Definition vctBinaryOperations.h:65
_input2Type Input2Type
Definition vctBinaryOperations.h:66
_outputType OutputType
Definition vctBinaryOperations.h:64
#define CMN_UNUSED(argument)
Definition cmnPortability.h:497
Declaration of the class cmnTypeTraits.