24 #ifndef ARM_COMPUTE_UTILS_MATH_SAFE_OPS
25 #define ARM_COMPUTE_UTILS_MATH_SAFE_OPS
50 template <
typename T, ARM_COMPUTE_REQUIRES_TA(std::is_
integral<T>::value)>
55 if ((val_b > 0) && (val_a > std::numeric_limits<T>::max() - val_b))
57 result = std::numeric_limits<T>::max();
59 else if ((val_b < 0) && (val_a < std::numeric_limits<T>::min() - val_b))
61 result = std::numeric_limits<T>::min();
65 result = val_a + val_b;
82 template <
typename T, ARM_COMPUTE_REQUIRES_TA(std::is_
integral<T>::value)>
87 if ((val_b < 0) && (val_a > std::numeric_limits<T>::max() + val_b))
89 result = std::numeric_limits<T>::max();
91 else if ((val_b > 0) && (val_a < std::numeric_limits<T>::min() + val_b))
93 result = std::numeric_limits<T>::min();
97 result = val_a - val_b;
114 template <
typename T, ARM_COMPUTE_REQUIRES_TA(std::is_
integral<T>::value)>
121 if ((val_b > 0) && (val_a > (std::numeric_limits<T>::max() / val_b)))
123 result = std::numeric_limits<T>::max();
125 else if (val_b < (std::numeric_limits<T>::min() / val_a))
127 result = std::numeric_limits<T>::min();
131 result = val_a * val_b;
136 if ((val_b > 0) && (val_a < (std::numeric_limits<T>::min() / val_b)))
138 result = std::numeric_limits<T>::max();
140 else if ((val_a != 0) && (val_b < (std::numeric_limits<T>::max() / val_a)))
142 result = std::numeric_limits<T>::min();
146 result = val_a * val_b;
164 template <
typename T, ARM_COMPUTE_REQUIRES_TA(std::is_
integral<T>::value)>
169 if ((val_b == 0) || ((val_a == std::numeric_limits<T>::min()) && (val_b == -1)))
171 result = std::numeric_limits<T>::min();
175 result = val_a / val_b;