24 #ifndef ARM_COMPUTE_UTILS_MATH_SAFE_OPS 25 #define ARM_COMPUTE_UTILS_MATH_SAFE_OPS 49 template <
typename T, ARM_COMPUTE_REQUIRES_TA(std::is_
integral<T>::value)>
54 if((val_b > 0) && (val_a > std::numeric_limits<T>::max() - val_b))
56 result = std::numeric_limits<T>::max();
58 else if((val_b < 0) && (val_a < std::numeric_limits<T>::min() - val_b))
60 result = std::numeric_limits<T>::min();
64 result = val_a + val_b;
81 template <
typename T, ARM_COMPUTE_REQUIRES_TA(std::is_
integral<T>::value)>
86 if((val_b < 0) && (val_a > std::numeric_limits<T>::max() + val_b))
88 result = std::numeric_limits<T>::max();
90 else if((val_b > 0) && (val_a < std::numeric_limits<T>::min() + val_b))
92 result = std::numeric_limits<T>::min();
96 result = val_a - val_b;
113 template <
typename T, ARM_COMPUTE_REQUIRES_TA(std::is_
integral<T>::value)>
120 if((val_b > 0) && (val_a > (std::numeric_limits<T>::max() / val_b)))
122 result = std::numeric_limits<T>::max();
124 else if(val_b < (std::numeric_limits<T>::min() / val_a))
126 result = std::numeric_limits<T>::min();
130 result = val_a * val_b;
135 if((val_b > 0) && (val_a < (std::numeric_limits<T>::min() / val_b)))
137 result = std::numeric_limits<T>::max();
139 else if((val_a != 0) && (val_b < (std::numeric_limits<T>::max() / val_a)))
141 result = std::numeric_limits<T>::min();
145 result = val_a * val_b;
163 template <
typename T, ARM_COMPUTE_REQUIRES_TA(std::is_
integral<T>::value)>
168 if((val_b == 0) || ((val_a == std::numeric_limits<T>::min()) && (val_b == -1)))
170 result = std::numeric_limits<T>::min();
174 result = val_a / val_b;
T safe_integer_div(T val_a, T val_b)
Safe integer division between two integers.
Copyright (c) 2017-2021 Arm Limited.
T safe_integer_mul(T val_a, T val_b)
Safe integer multiplication between two integers.
T safe_integer_sub(T val_a, T val_b)
Safe integer subtraction between two integers.
T safe_integer_add(T val_a, T val_b)
Safe integer addition between two integers.