18#ifndef itkArithmeticOpsFunctors_h
19#define itkArithmeticOpsFunctors_h
30template <
typename TInput1,
typename TInput2 = TInput1,
typename TOutput = TInput1>
31class ITK_TEMPLATE_EXPORT
Add2
45 return static_cast<TOutput
>(A + B);
55template <
typename TInput1,
typename TInput2,
typename TInput3,
typename TOutput>
56class ITK_TEMPLATE_EXPORT
Add3
68 operator()(
const TInput1 & A,
const TInput2 & B,
const TInput3 & C)
const
70 return static_cast<TOutput
>(A + B + C);
80template <
typename TInput1,
typename TInput2 = TInput1,
typename TOutput = TInput1>
81class ITK_TEMPLATE_EXPORT
Sub2
95 return static_cast<TOutput
>(A - B);
105template <
typename TInput1,
typename TInput2 = TInput1,
typename TOutput = TInput1>
120 return static_cast<TOutput
>(A * B);
130template <
typename TInput1,
typename TInput2,
typename TOutput>
131class ITK_TEMPLATE_EXPORT
Div
147 return (TOutput)(A / B);
160template <
typename TNumerator,
typename TDenominator = TNumerator,
typename TOutput = TNumerator>
182 operator()(
const TNumerator & n,
const TDenominator & d)
const
188 return static_cast<TOutput
>(n) /
static_cast<TOutput
>(d);
200template <
typename TInput1,
typename TInput2,
typename TOutput>
217 return static_cast<TOutput
>(A % B);
224#if !defined(ITK_FUTURE_LEGACY_REMOVE)
234template <
typename TInput,
typename TOutput>
235class ITK_TEMPLATE_EXPORT ModulusTransform
238 ModulusTransform() { m_Dividend = 5; }
239 ~ModulusTransform() =
default;
241 SetDividend(TOutput dividend)
243 m_Dividend = dividend;
247 operator==(
const ModulusTransform & other)
const
249 return m_Dividend == other.m_Dividend;
252 ITK_UNEQUAL_OPERATOR_MEMBER_FUNCTION(ModulusTransform);
255 operator()(
const TInput & x)
const
257 auto result =
static_cast<TOutput
>(x % m_Dividend);
277template <
class TInput1,
class TInput2,
class TOutput>
292 const double temp = std::floor(
static_cast<double>(A) /
static_cast<double>(B));
293 if (std::is_integral_v<TOutput> && Math::isinf(temp))
302 return static_cast<TOutput
>(temp);
317template <
class TInput1,
class TInput2,
class TOutput>
344template <
class TInput1,
class TOutput = TInput1>
359 return (TOutput)(-A);
ITK_UNEQUAL_OPERATOR_MEMBER_FUNCTION(Add2)
bool operator==(const Add2 &) const
TOutput operator()(const TInput1 &A, const TInput2 &B) const
bool operator==(const Add3 &) const
ITK_UNEQUAL_OPERATOR_MEMBER_FUNCTION(Add3)
TOutput operator()(const TInput1 &A, const TInput2 &B, const TInput3 &C) const
Cast arguments to double, performs division then takes the floor.
bool operator==(const DivFloor &) const
ITK_UNEQUAL_OPERATOR_MEMBER_FUNCTION(DivFloor)
TOutput operator()(const TInput1 &A, const TInput2 &B) const
Promotes arguments to real type and performs division.
TOutput operator()(const TInput1 &A, const TInput2 &B) const
ITK_UNEQUAL_OPERATOR_MEMBER_FUNCTION(DivReal)
bool operator==(const DivReal &) const
bool operator==(const Div &) const
TOutput operator()(const TInput1 &A, const TInput2 &B) const
ITK_UNEQUAL_OPERATOR_MEMBER_FUNCTION(Div)
ITK_UNEQUAL_OPERATOR_MEMBER_FUNCTION(DivideOrZeroOut)
~DivideOrZeroOut()=default
typename TInputImage2::PixelType m_Threshold
TOutput operator()(const TNumerator &n, const TDenominator &d) const
typename TOutputImage::PixelType m_Constant
bool operator==(const DivideOrZeroOut &other) const
bool operator==(const Modulus &) const
TOutput operator()(const TInput1 &A, const TInput2 &B) const
ITK_UNEQUAL_OPERATOR_MEMBER_FUNCTION(Modulus)
TOutput operator()(const TInput1 &A, const TInput2 &B) const
ITK_UNEQUAL_OPERATOR_MEMBER_FUNCTION(Mult)
bool operator==(const Mult &) const
bool operator==(const Sub2 &) const
ITK_UNEQUAL_OPERATOR_MEMBER_FUNCTION(Sub2)
TOutput operator()(const TInput1 &A, const TInput2 &B) const
Apply the unary minus operator.
bool operator==(const UnaryMinus &) const
TOutput operator()(const TInput1 &A) const
ITK_UNEQUAL_OPERATOR_MEMBER_FUNCTION(UnaryMinus)
Define additional traits for native types such as int or float.
static constexpr T NonpositiveMin()
static constexpr T max(const T &)
bool ITKIOXML_EXPORT operator==(itk::FancyString &s, const std::string &)
bool NotAlmostEquals(T1 x1, T2 x2)