cisst-saw
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
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 
14 This software is provided "as is" under an open source license, with
15 no warranty. The complete license can be found in license.txt and
16 http://www.cisst.org/cisst/license.txt.
17 
18 --- end cisst license ---
19 */
20 
21 #pragma once
22 #ifndef _vctBinaryOperations_h
23 #define _vctBinaryOperations_h
24 
31 
61 template<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 
94  class Subtraction {
95  public:
96  typedef _outputType OutputType;
102  static inline OutputType Operate(const Input1Type & input1, const Input2Type & input2) {
103  return OutputType(input1-input2);
104  }
105 
106  static inline OutputType NeutralElement()
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 
128  static inline OutputType NeutralElement()
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 
150  static inline OutputType NeutralElement()
151  {
152  return OutputType(1);
153  }
154  };
155 
156 
161  class FirstOperand {
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 
212  static inline OutputType NeutralElement()
213  {
215  }
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 
237  static inline OutputType NeutralElement()
238  {
240  }
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 
269  static inline OutputType NeutralElement(void) {
271  }
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 
415  static inline OutputType NeutralElement()
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 
439  static inline OutputType NeutralElement()
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 
471  class DotProduct {
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.
484 template<>
485 class 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 
Returns the sum of the two InputType object.
Definition: vctBinaryOperations.h:72
bool OutputType
Definition: vctBinaryOperations.h:365
_outputType OutputType
Definition: vctBinaryOperations.h:118
_outputType OutputType
Definition: vctBinaryOperations.h:304
Returns the difference of the two InputType object.
Definition: vctBinaryOperations.h:94
static OutputType NeutralElement()
Definition: vctBinaryOperations.h:212
static OutputType Operate(const Input1Type &input1, const Input2Type &input2)
Definition: vctBinaryOperations.h:310
static OutputType Operate(const Input1Type &input1, const Input2Type &input2)
Definition: vctBinaryOperations.h:411
_outputType OutputType
Definition: vctBinaryOperations.h:345
static OutputType NeutralElement(void)
Definition: vctBinaryOperations.h:269
static OutputType Operate(const Input1Type &input1, const Input2Type &input2)
Definition: vctBinaryOperations.h:80
static OutputType Operate(const Input1Type &input1, const Input2Type &input2)
Definition: vctBinaryOperations.h:290
#define CMN_UNUSED(argument)
Definition: cmnPortability.h:479
_outputType OutputType
Definition: vctBinaryOperations.h:405
Test if input1 is lesser than input2.
Definition: vctBinaryOperations.h:322
Return the greater of (input1, input2).
Definition: vctBinaryOperations.h:200
static OutputType Operate(const Input1Type &input1, const Input2Type &input2)
Definition: vctBinaryOperations.h:457
static bool Operate(const bool &input1, const bool &input2)
Definition: vctBinaryOperations.h:492
_outputType OutputType
Definition: vctBinaryOperations.h:473
_outputType OutputType
Definition: vctBinaryOperations.h:386
Test for non equality between input1 and input2.
Definition: vctBinaryOperations.h:302
Returns the ratio of the two InputType object.
Definition: vctBinaryOperations.h:138
_outputType OutputType
Definition: vctBinaryOperations.h:202
_input1Type Input1Type
Definition: vctBinaryOperations.h:65
Test for equality between input1 and input2.
Definition: vctBinaryOperations.h:282
static const OutputType & Operate(const OutputType &input1, const OutputType &input2)
Definition: vctBinaryOperations.h:233
_outputType OutputType
Definition: vctBinaryOperations.h:140
static const OutputType Operate(const OutputType &bound, const OutputType &input)
Definition: vctBinaryOperations.h:260
static OutputType Operate(const Input1Type &input1, const Input2Type &input2)
Definition: vctBinaryOperations.h:330
Return the -input2 in input1 is lesser than -input2, input2 if input 1 is greater than input2 and inp...
Definition: vctBinaryOperations.h:252
Define binary operations between objects as classes.
Definition: vctBinaryOperations.h:62
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
Dot product.
Definition: vctBinaryOperations.h:471
_outputType OutputType
Definition: vctBinaryOperations.h:96
_outputType OutputType
Definition: vctBinaryOperations.h:284
static OutputType NeutralElement()
Definition: vctBinaryOperations.h:439
Test if input1 is greater than or equal to input2.
Definition: vctBinaryOperations.h:384
_input2Type Input2Type
Definition: vctBinaryOperations.h:66
Declaration of the class cmnTypeTraits.
Return the first operand of (input1, input2), i.e., input1.
Definition: vctBinaryOperations.h:161
static const OutputType & Operate(const OutputType &input1, const OutputType &input2)
Definition: vctBinaryOperations.h:208
static OutputType NeutralElement()
Definition: vctBinaryOperations.h:128
static OutputType Operate(const Input1Type &input1, const Input2Type &input2)
Definition: vctBinaryOperations.h:392
static OutputType Operate(const Input1Type &CMN_UNUSED(input1), const Input2Type &input2)
Definition: vctBinaryOperations.h:188
static OutputType Operate(const OutputType &input1, const OutputType &input2)
Definition: vctBinaryOperations.h:435
Return the second operand of (input1, input2), i.e., input2.
Definition: vctBinaryOperations.h:180
_outputType OutputType
Definition: vctBinaryOperations.h:227
_outputType OutputType
Definition: vctBinaryOperations.h:64
Logical And operator between input1 and input2.
Definition: vctBinaryOperations.h:403
Test if the first argument is bound by the second argument.
Definition: vctBinaryOperations.h:454
static OutputType Operate(const Input1Type &input1, const Input2Type &input2)
Definition: vctBinaryOperations.h:351
static OutputType Operate(const Input1Type &input1, const Input2Type &input2)
Definition: vctBinaryOperations.h:102
Test if input1 is lesser than or equal to input2.
Definition: vctBinaryOperations.h:343
static OutputType NeutralElement()
Definition: vctBinaryOperations.h:84
static OutputType Operate(const Input1Type &input1, const Input2Type &input2)
Definition: vctBinaryOperations.h:146
static OutputType Operate(const Input1Type &input1, const Input2Type &input2)
Definition: vctBinaryOperations.h:474
static OutputType NeutralElement()
Definition: vctBinaryOperations.h:415
static CISST_EXPORT Type MaxPositiveValue(void)
_outputType OutputType
Definition: vctBinaryOperations.h:254
Return the lesser of (input1, input2).
Definition: vctBinaryOperations.h:225
_outputType OutputType
Definition: vctBinaryOperations.h:163
static bool NeutralElement()
Definition: vctBinaryOperations.h:496
static OutputType Operate(const Input1Type &input1, const Input2Type &input2)
Definition: vctBinaryOperations.h:124
static CISST_EXPORT Type MinNegativeValue(void)
static OutputType Operate(const Input1Type &input1, const Input2Type &input2)
Definition: vctBinaryOperations.h:371
Returns the product of the two InputType object.
Definition: vctBinaryOperations.h:116
_outputType OutputType
Definition: vctBinaryOperations.h:456
_outputType OutputType
Definition: vctBinaryOperations.h:429
_outputType OutputType
Definition: vctBinaryOperations.h:74
static OutputType NeutralElement()
Definition: vctBinaryOperations.h:237
_outputType OutputType
Definition: vctBinaryOperations.h:324
Logical Or operator between input1 and input2.
Definition: vctBinaryOperations.h:427
static OutputType NeutralElement()
Definition: vctBinaryOperations.h:106
static OutputType NeutralElement()
Definition: vctBinaryOperations.h:150
_outputType OutputType
Definition: vctBinaryOperations.h:182