Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(784)

Side by Side Diff: base/numerics/safe_numerics_unittest.cc

Issue 2945433003: Add ClampedNumeric templates (Closed)
Patch Set: more docs and modulus Created 3 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright 2013 The Chromium Authors. All rights reserved. 1 // Copyright 2013 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include <stddef.h> 5 #include <stddef.h>
6 #include <stdint.h> 6 #include <stdint.h>
7 7
8 #include <limits> 8 #include <limits>
9 #include <type_traits> 9 #include <type_traits>
10 10
11 #include "base/compiler_specific.h" 11 #include "base/compiler_specific.h"
12 #include "base/logging.h" 12 #include "base/logging.h"
13 #include "base/numerics/safe_conversions.h" 13 #include "base/numerics/safe_conversions.h"
14 #include "base/numerics/safe_math.h" 14 #include "base/numerics/safe_math.h"
15 #include "base/test/gtest_util.h" 15 #include "base/test/gtest_util.h"
16 #include "build/build_config.h" 16 #include "build/build_config.h"
17 #include "testing/gtest/include/gtest/gtest.h" 17 #include "testing/gtest/include/gtest/gtest.h"
18 18
19 #if defined(COMPILER_MSVC) && defined(ARCH_CPU_32_BITS) 19 #if defined(COMPILER_MSVC) && defined(ARCH_CPU_32_BITS)
20 #include <mmintrin.h> 20 #include <mmintrin.h>
21 #endif 21 #endif
22 22
23 using std::numeric_limits; 23 using std::numeric_limits;
24 using base::CheckedNumeric; 24 using base::CheckedNumeric;
25 using base::ClampedNumeric;
dcheng 2017/06/28 07:25:06 FWIW, I think we usually dump tests into the same
jschuh 2017/06/28 12:32:38 Now you tell me.
25 using base::IsValidForType; 26 using base::IsValidForType;
26 using base::ValueOrDieForType; 27 using base::ValueOrDieForType;
27 using base::ValueOrDefaultForType; 28 using base::ValueOrDefaultForType;
28 using base::MakeCheckedNum; 29 using base::MakeCheckedNum;
30 using base::MakeClampedNum;
29 using base::CheckMax; 31 using base::CheckMax;
30 using base::CheckMin; 32 using base::CheckMin;
31 using base::CheckAdd; 33 using base::CheckAdd;
32 using base::CheckSub; 34 using base::CheckSub;
33 using base::CheckMul; 35 using base::CheckMul;
34 using base::CheckDiv; 36 using base::CheckDiv;
35 using base::CheckMod; 37 using base::CheckMod;
36 using base::CheckLsh; 38 using base::CheckLsh;
37 using base::CheckRsh; 39 using base::CheckRsh;
40 using base::ClampMax;
41 using base::ClampMin;
42 using base::ClampAdd;
43 using base::ClampSub;
44 using base::ClampMul;
45 using base::ClampDiv;
46 using base::ClampMod;
47 using base::ClampLsh;
48 using base::ClampRsh;
49 using base::as_unsigned;
38 using base::checked_cast; 50 using base::checked_cast;
39 using base::IsValueInRangeForNumericType; 51 using base::IsValueInRangeForNumericType;
40 using base::IsValueNegative; 52 using base::IsValueNegative;
53 using base::SaturationDefaultLimits;
41 using base::SizeT; 54 using base::SizeT;
42 using base::StrictNumeric; 55 using base::StrictNumeric;
43 using base::MakeStrictNum; 56 using base::MakeStrictNum;
44 using base::saturated_cast; 57 using base::saturated_cast;
45 using base::strict_cast; 58 using base::strict_cast;
46 using base::internal::MaxExponent; 59 using base::internal::MaxExponent;
47 using base::internal::IntegerBitsPlusSign; 60 using base::internal::IntegerBitsPlusSign;
48 using base::internal::RangeCheck; 61 using base::internal::RangeCheck;
49 62
50 // These tests deliberately cause arithmetic boundary errors. If the compiler is 63 // These tests deliberately cause arithmetic boundary errors. If the compiler is
(...skipping 73 matching lines...) Expand 10 before | Expand all | Expand 10 after
124 ""); 137 "");
125 static_assert(!FastIntegerArithmeticPromotion<intmax_t, int8_t>::is_contained, 138 static_assert(!FastIntegerArithmeticPromotion<intmax_t, int8_t>::is_contained,
126 ""); 139 "");
127 static_assert(!FastIntegerArithmeticPromotion<uintmax_t, int8_t>::is_contained, 140 static_assert(!FastIntegerArithmeticPromotion<uintmax_t, int8_t>::is_contained,
128 ""); 141 "");
129 142
130 template <typename U> 143 template <typename U>
131 U GetNumericValueForTest(const CheckedNumeric<U>& src) { 144 U GetNumericValueForTest(const CheckedNumeric<U>& src) {
132 return src.state_.value(); 145 return src.state_.value();
133 } 146 }
147
148 template <typename U>
149 U GetNumericValueForTest(const ClampedNumeric<U>& src) {
150 return static_cast<U>(src);
151 }
152
153 template <typename U>
154 U GetNumericValueForTest(const U& src) {
155 return src;
156 }
157
134 } // namespace internal. 158 } // namespace internal.
135 } // namespace base. 159 } // namespace base.
136 160
137 using base::internal::GetNumericValueForTest; 161 using base::internal::GetNumericValueForTest;
138 162
139 // Logs the ValueOrDie() failure instead of crashing. 163 // Logs the ValueOrDie() failure instead of crashing.
140 struct LogOnFailure { 164 struct LogOnFailure {
141 template <typename T> 165 template <typename T>
142 static T HandleFailure() { 166 static T HandleFailure() {
143 LOG(WARNING) << "ValueOrDie() failed unexpectedly."; 167 LOG(WARNING) << "ValueOrDie() failed unexpectedly.";
144 return T(); 168 return T();
145 } 169 }
146 }; 170 };
147 171
172 template <typename T>
173 constexpr T GetValue(const T& src) {
174 return src;
175 }
176
177 template <typename T, typename U>
178 constexpr T GetValueAsDest(const U& src) {
179 return static_cast<T>(src);
180 }
181
182 template <typename T>
183 constexpr T GetValue(const CheckedNumeric<T>& src) {
184 return src.template ValueOrDie<T, LogOnFailure>();
185 }
186
187 template <typename T, typename U>
188 constexpr T GetValueAsDest(const CheckedNumeric<U>& src) {
189 return src.template ValueOrDie<T, LogOnFailure>();
190 }
191
192 template <typename T>
193 constexpr T GetValue(const ClampedNumeric<T>& src) {
194 return static_cast<T>(src);
195 }
196
197 template <typename T, typename U>
198 constexpr T GetValueAsDest(const ClampedNumeric<U>& src) {
199 return static_cast<T>(src);
200 }
201
148 // Helper macros to wrap displaying the conversion types and line numbers. 202 // Helper macros to wrap displaying the conversion types and line numbers.
149 #define TEST_EXPECTED_VALIDITY(expected, actual) \ 203 #define TEST_EXPECTED_VALIDITY(expected, actual) \
150 EXPECT_EQ(expected, (actual).template Cast<Dst>().IsValid()) \ 204 EXPECT_EQ(expected, (actual).template Cast<Dst>().IsValid()) \
151 << "Result test: Value " << GetNumericValueForTest(actual) << " as " \ 205 << "Result test: Value " << GetNumericValueForTest(actual) << " as " \
152 << dst << " on line " << line 206 << dst << " on line " << line
153 207
154 #define TEST_EXPECTED_SUCCESS(actual) TEST_EXPECTED_VALIDITY(true, actual) 208 #define TEST_EXPECTED_SUCCESS(actual) TEST_EXPECTED_VALIDITY(true, actual)
155 #define TEST_EXPECTED_FAILURE(actual) TEST_EXPECTED_VALIDITY(false, actual) 209 #define TEST_EXPECTED_FAILURE(actual) TEST_EXPECTED_VALIDITY(false, actual)
156 210
157 // We have to handle promotions, so infer the underlying type below from actual. 211 // We have to handle promotions, so infer the underlying type below from actual.
158 #define TEST_EXPECTED_VALUE(expected, actual) \ 212 #define TEST_EXPECTED_VALUE(expected, actual) \
159 EXPECT_EQ(static_cast<typename std::decay<decltype(actual)>::type::type>( \ 213 EXPECT_EQ(GetValue(expected), GetValueAsDest<decltype(expected)>(actual)) \
160 expected), \
161 ((actual) \
162 .template ValueOrDie< \
163 typename std::decay<decltype(actual)>::type::type, \
164 LogOnFailure>())) \
165 << "Result test: Value " << GetNumericValueForTest(actual) << " as " \ 214 << "Result test: Value " << GetNumericValueForTest(actual) << " as " \
166 << dst << " on line " << line 215 << dst << " on line " << line
167 216
168 // Test the simple pointer arithmetic overrides. 217 // Test the simple pointer arithmetic overrides.
169 template <typename Dst> 218 template <typename Dst>
170 void TestStrictPointerMath() { 219 void TestStrictPointerMath() {
171 Dst dummy_value = 0; 220 Dst dummy_value = 0;
172 Dst* dummy_ptr = &dummy_value; 221 Dst* dummy_ptr = &dummy_value;
173 static const Dst kDummyOffset = 2; // Don't want to go too far. 222 static const Dst kDummyOffset = 2; // Don't want to go too far.
174 EXPECT_EQ(dummy_ptr + kDummyOffset, 223 EXPECT_EQ(dummy_ptr + kDummyOffset,
175 dummy_ptr + StrictNumeric<Dst>(kDummyOffset)); 224 dummy_ptr + StrictNumeric<Dst>(kDummyOffset));
176 EXPECT_EQ(dummy_ptr - kDummyOffset, 225 EXPECT_EQ(dummy_ptr - kDummyOffset,
177 dummy_ptr - StrictNumeric<Dst>(kDummyOffset)); 226 dummy_ptr - StrictNumeric<Dst>(kDummyOffset));
178 EXPECT_NE(dummy_ptr, dummy_ptr + StrictNumeric<Dst>(kDummyOffset)); 227 EXPECT_NE(dummy_ptr, dummy_ptr + StrictNumeric<Dst>(kDummyOffset));
179 EXPECT_NE(dummy_ptr, dummy_ptr - StrictNumeric<Dst>(kDummyOffset)); 228 EXPECT_NE(dummy_ptr, dummy_ptr - StrictNumeric<Dst>(kDummyOffset));
180 EXPECT_DEATH_IF_SUPPORTED( 229 EXPECT_DEATH_IF_SUPPORTED(
181 dummy_ptr + StrictNumeric<size_t>(std::numeric_limits<size_t>::max()), 230 dummy_ptr + StrictNumeric<size_t>(std::numeric_limits<size_t>::max()),
182 ""); 231 "");
183 } 232 }
184 233
185 // Signed integer arithmetic. 234 // Signed integer arithmetic.
186 template <typename Dst> 235 template <typename Dst>
187 static void TestSpecializedArithmetic( 236 static void TestSpecializedArithmetic(
188 const char* dst, 237 const char* dst,
189 int line, 238 int line,
190 typename std::enable_if<numeric_limits<Dst>::is_integer && 239 typename std::enable_if<numeric_limits<Dst>::is_integer &&
191 numeric_limits<Dst>::is_signed, 240 numeric_limits<Dst>::is_signed,
192 int>::type = 0) { 241 int>::type = 0) {
193 using DstLimits = numeric_limits<Dst>; 242 using DstLimits = SaturationDefaultLimits<Dst>;
194 TEST_EXPECTED_FAILURE(-CheckedNumeric<Dst>(DstLimits::lowest())); 243 TEST_EXPECTED_FAILURE(-CheckedNumeric<Dst>(DstLimits::lowest()));
195 TEST_EXPECTED_FAILURE(CheckedNumeric<Dst>(DstLimits::lowest()).Abs()); 244 TEST_EXPECTED_FAILURE(CheckedNumeric<Dst>(DstLimits::lowest()).Abs());
196 TEST_EXPECTED_VALUE(1, CheckedNumeric<Dst>(-1).Abs()); 245 TEST_EXPECTED_VALUE(1, CheckedNumeric<Dst>(-1).Abs());
197 TEST_EXPECTED_VALUE(DstLimits::max(), 246 TEST_EXPECTED_VALUE(DstLimits::max(),
198 MakeCheckedNum(-DstLimits::max()).Abs()); 247 MakeCheckedNum(-DstLimits::max()).Abs());
199 248
249 TEST_EXPECTED_VALUE(DstLimits::Overflow(),
250 -ClampedNumeric<Dst>(DstLimits::lowest()));
251 TEST_EXPECTED_VALUE(DstLimits::Overflow(),
252 ClampedNumeric<Dst>(DstLimits::lowest()).Abs());
253 TEST_EXPECTED_VALUE(1, ClampedNumeric<Dst>(-1).Abs());
254 TEST_EXPECTED_VALUE(DstLimits::max(),
255 MakeClampedNum(-DstLimits::max()).Abs());
256
200 TEST_EXPECTED_SUCCESS(CheckedNumeric<Dst>(DstLimits::max()) + -1); 257 TEST_EXPECTED_SUCCESS(CheckedNumeric<Dst>(DstLimits::max()) + -1);
201 TEST_EXPECTED_FAILURE(CheckedNumeric<Dst>(DstLimits::lowest()) + -1); 258 TEST_EXPECTED_FAILURE(CheckedNumeric<Dst>(DstLimits::lowest()) + -1);
202 TEST_EXPECTED_FAILURE(CheckedNumeric<Dst>(DstLimits::lowest()) + 259 TEST_EXPECTED_FAILURE(CheckedNumeric<Dst>(DstLimits::lowest()) +
203 DstLimits::lowest()); 260 DstLimits::lowest());
204 261
262 TEST_EXPECTED_VALUE(DstLimits::max() - 1,
263 ClampedNumeric<Dst>(DstLimits::max()) + -1);
264 TEST_EXPECTED_VALUE(DstLimits::Underflow(),
265 ClampedNumeric<Dst>(DstLimits::lowest()) + -1);
266 TEST_EXPECTED_VALUE(
267 DstLimits::Underflow(),
268 ClampedNumeric<Dst>(DstLimits::lowest()) + DstLimits::lowest());
269
205 TEST_EXPECTED_FAILURE(CheckedNumeric<Dst>(DstLimits::lowest()) - 1); 270 TEST_EXPECTED_FAILURE(CheckedNumeric<Dst>(DstLimits::lowest()) - 1);
206 TEST_EXPECTED_SUCCESS(CheckedNumeric<Dst>(DstLimits::lowest()) - -1); 271 TEST_EXPECTED_SUCCESS(CheckedNumeric<Dst>(DstLimits::lowest()) - -1);
207 TEST_EXPECTED_FAILURE(CheckedNumeric<Dst>(DstLimits::max()) - 272 TEST_EXPECTED_FAILURE(CheckedNumeric<Dst>(DstLimits::max()) -
208 DstLimits::lowest()); 273 DstLimits::lowest());
209 TEST_EXPECTED_FAILURE(CheckedNumeric<Dst>(DstLimits::lowest()) - 274 TEST_EXPECTED_FAILURE(CheckedNumeric<Dst>(DstLimits::lowest()) -
210 DstLimits::max()); 275 DstLimits::max());
211 276
277 TEST_EXPECTED_VALUE(DstLimits::Underflow(),
278 ClampedNumeric<Dst>(DstLimits::lowest()) - 1);
279 TEST_EXPECTED_VALUE(DstLimits::lowest() + 1,
280 ClampedNumeric<Dst>(DstLimits::lowest()) - -1);
281 TEST_EXPECTED_VALUE(
282 DstLimits::Overflow(),
283 ClampedNumeric<Dst>(DstLimits::max()) - DstLimits::lowest());
284 TEST_EXPECTED_VALUE(
285 DstLimits::Underflow(),
286 ClampedNumeric<Dst>(DstLimits::lowest()) - DstLimits::max());
287
212 TEST_EXPECTED_FAILURE(CheckedNumeric<Dst>(DstLimits::lowest()) * 2); 288 TEST_EXPECTED_FAILURE(CheckedNumeric<Dst>(DstLimits::lowest()) * 2);
289 TEST_EXPECTED_VALUE(DstLimits::Underflow(),
290 ClampedNumeric<Dst>(DstLimits::lowest()) * 2);
213 291
214 TEST_EXPECTED_FAILURE(CheckedNumeric<Dst>(DstLimits::lowest()) / -1); 292 TEST_EXPECTED_FAILURE(CheckedNumeric<Dst>(DstLimits::lowest()) / -1);
215 TEST_EXPECTED_VALUE(0, CheckedNumeric<Dst>(-1) / 2); 293 TEST_EXPECTED_VALUE(0, CheckedNumeric<Dst>(-1) / 2);
216 TEST_EXPECTED_FAILURE(CheckedNumeric<Dst>(DstLimits::lowest()) * -1); 294 TEST_EXPECTED_FAILURE(CheckedNumeric<Dst>(DstLimits::lowest()) * -1);
217 TEST_EXPECTED_VALUE(DstLimits::max(), 295 TEST_EXPECTED_VALUE(DstLimits::max(),
218 CheckedNumeric<Dst>(DstLimits::lowest() + 1) * Dst(-1)); 296 CheckedNumeric<Dst>(DstLimits::lowest() + 1) * Dst(-1));
219 TEST_EXPECTED_VALUE(DstLimits::max(), 297 TEST_EXPECTED_VALUE(DstLimits::max(),
220 CheckedNumeric<Dst>(-1) * Dst(DstLimits::lowest() + 1)); 298 CheckedNumeric<Dst>(-1) * Dst(DstLimits::lowest() + 1));
221 TEST_EXPECTED_VALUE(DstLimits::lowest(), 299 TEST_EXPECTED_VALUE(DstLimits::lowest(),
222 CheckedNumeric<Dst>(DstLimits::lowest()) * Dst(1)); 300 CheckedNumeric<Dst>(DstLimits::lowest()) * Dst(1));
223 TEST_EXPECTED_VALUE(DstLimits::lowest(), 301 TEST_EXPECTED_VALUE(DstLimits::lowest(),
224 CheckedNumeric<Dst>(1) * Dst(DstLimits::lowest())); 302 CheckedNumeric<Dst>(1) * Dst(DstLimits::lowest()));
225 TEST_EXPECTED_VALUE(DstLimits::lowest(), 303 TEST_EXPECTED_VALUE(
226 MakeCheckedNum(DstLimits::lowest()).UnsignedAbs()); 304 typename std::make_unsigned<Dst>::type(0) - DstLimits::lowest(),
305 MakeCheckedNum(DstLimits::lowest()).UnsignedAbs());
227 TEST_EXPECTED_VALUE(DstLimits::max(), 306 TEST_EXPECTED_VALUE(DstLimits::max(),
228 MakeCheckedNum(DstLimits::max()).UnsignedAbs()); 307 MakeCheckedNum(DstLimits::max()).UnsignedAbs());
229 TEST_EXPECTED_VALUE(0, CheckedNumeric<Dst>(0).UnsignedAbs()); 308 TEST_EXPECTED_VALUE(0, CheckedNumeric<Dst>(0).UnsignedAbs());
230 TEST_EXPECTED_VALUE(1, CheckedNumeric<Dst>(1).UnsignedAbs()); 309 TEST_EXPECTED_VALUE(1, CheckedNumeric<Dst>(1).UnsignedAbs());
231 TEST_EXPECTED_VALUE(1, CheckedNumeric<Dst>(-1).UnsignedAbs()); 310 TEST_EXPECTED_VALUE(1, CheckedNumeric<Dst>(-1).UnsignedAbs());
232 311
312 TEST_EXPECTED_VALUE(DstLimits::Overflow(),
313 ClampedNumeric<Dst>(DstLimits::lowest()) / -1);
314 TEST_EXPECTED_VALUE(0, ClampedNumeric<Dst>(-1) / 2);
315 TEST_EXPECTED_VALUE(DstLimits::Overflow(),
316 ClampedNumeric<Dst>(DstLimits::lowest()) * -1);
317 TEST_EXPECTED_VALUE(DstLimits::max(),
318 ClampedNumeric<Dst>(DstLimits::lowest() + 1) * Dst(-1));
319 TEST_EXPECTED_VALUE(DstLimits::max(),
320 ClampedNumeric<Dst>(-1) * Dst(DstLimits::lowest() + 1));
321 TEST_EXPECTED_VALUE(DstLimits::lowest(),
322 ClampedNumeric<Dst>(DstLimits::lowest()) * Dst(1));
323 TEST_EXPECTED_VALUE(DstLimits::lowest(),
324 ClampedNumeric<Dst>(1) * Dst(DstLimits::lowest()));
325 TEST_EXPECTED_VALUE(
326 typename std::make_unsigned<Dst>::type(0) - DstLimits::lowest(),
327 MakeClampedNum(DstLimits::lowest()).UnsignedAbs());
328 TEST_EXPECTED_VALUE(DstLimits::max(),
329 MakeClampedNum(DstLimits::max()).UnsignedAbs());
330 TEST_EXPECTED_VALUE(0, ClampedNumeric<Dst>(0).UnsignedAbs());
331 TEST_EXPECTED_VALUE(1, ClampedNumeric<Dst>(1).UnsignedAbs());
332 TEST_EXPECTED_VALUE(1, ClampedNumeric<Dst>(-1).UnsignedAbs());
333
233 // Modulus is legal only for integers. 334 // Modulus is legal only for integers.
234 TEST_EXPECTED_VALUE(0, CheckedNumeric<Dst>() % 1); 335 TEST_EXPECTED_VALUE(0, CheckedNumeric<Dst>() % 1);
235 TEST_EXPECTED_VALUE(0, CheckedNumeric<Dst>(1) % 1); 336 TEST_EXPECTED_VALUE(0, CheckedNumeric<Dst>(1) % 1);
236 TEST_EXPECTED_VALUE(-1, CheckedNumeric<Dst>(-1) % 2); 337 TEST_EXPECTED_VALUE(-1, CheckedNumeric<Dst>(-1) % 2);
237 TEST_EXPECTED_FAILURE(CheckedNumeric<Dst>(-1) % -2); 338 TEST_EXPECTED_VALUE(-1, CheckedNumeric<Dst>(-1) % -2);
238 TEST_EXPECTED_VALUE(0, CheckedNumeric<Dst>(DstLimits::lowest()) % 2); 339 TEST_EXPECTED_VALUE(0, CheckedNumeric<Dst>(DstLimits::lowest()) % 2);
239 TEST_EXPECTED_VALUE(1, CheckedNumeric<Dst>(DstLimits::max()) % 2); 340 TEST_EXPECTED_VALUE(1, CheckedNumeric<Dst>(DstLimits::max()) % 2);
240 // Test all the different modulus combinations. 341 // Test all the different modulus combinations.
241 TEST_EXPECTED_VALUE(0, CheckedNumeric<Dst>(1) % CheckedNumeric<Dst>(1)); 342 TEST_EXPECTED_VALUE(0, CheckedNumeric<Dst>(1) % CheckedNumeric<Dst>(1));
242 TEST_EXPECTED_VALUE(0, 1 % CheckedNumeric<Dst>(1)); 343 TEST_EXPECTED_VALUE(0, 1 % CheckedNumeric<Dst>(1));
243 TEST_EXPECTED_VALUE(0, CheckedNumeric<Dst>(1) % 1); 344 TEST_EXPECTED_VALUE(0, CheckedNumeric<Dst>(1) % 1);
244 CheckedNumeric<Dst> checked_dst = 1; 345 CheckedNumeric<Dst> checked_dst = 1;
245 TEST_EXPECTED_VALUE(0, checked_dst %= 1); 346 TEST_EXPECTED_VALUE(0, checked_dst %= 1);
246 // Test that div by 0 is avoided but returns invalid result. 347 // Test that div by 0 is avoided but returns invalid result.
247 TEST_EXPECTED_FAILURE(CheckedNumeric<Dst>(1) % 0); 348 TEST_EXPECTED_FAILURE(CheckedNumeric<Dst>(1) % 0);
248 // Test bit shifts. 349 // Test bit shifts.
249 volatile Dst negative_one = -1; 350 volatile Dst negative_one = -1;
250 TEST_EXPECTED_FAILURE(CheckedNumeric<Dst>(1) << negative_one); 351 TEST_EXPECTED_FAILURE(CheckedNumeric<Dst>(1) << negative_one);
251 TEST_EXPECTED_FAILURE(CheckedNumeric<Dst>(1) 352 TEST_EXPECTED_FAILURE(CheckedNumeric<Dst>(1)
252 << (IntegerBitsPlusSign<Dst>::value - 1)); 353 << (IntegerBitsPlusSign<Dst>::value - 1));
253 TEST_EXPECTED_FAILURE(CheckedNumeric<Dst>(0) 354 TEST_EXPECTED_VALUE(Dst(0), CheckedNumeric<Dst>(0)
254 << IntegerBitsPlusSign<Dst>::value); 355 << IntegerBitsPlusSign<Dst>::value);
255 TEST_EXPECTED_FAILURE(CheckedNumeric<Dst>(DstLimits::max()) << 1); 356 TEST_EXPECTED_FAILURE(CheckedNumeric<Dst>(DstLimits::max()) << 1);
256 TEST_EXPECTED_VALUE( 357 TEST_EXPECTED_VALUE(
257 static_cast<Dst>(1) << (IntegerBitsPlusSign<Dst>::value - 2), 358 static_cast<Dst>(1) << (IntegerBitsPlusSign<Dst>::value - 2),
258 CheckedNumeric<Dst>(1) << (IntegerBitsPlusSign<Dst>::value - 2)); 359 CheckedNumeric<Dst>(1) << (IntegerBitsPlusSign<Dst>::value - 2));
259 TEST_EXPECTED_VALUE(0, CheckedNumeric<Dst>(0) 360 TEST_EXPECTED_VALUE(0, CheckedNumeric<Dst>(0)
260 << (IntegerBitsPlusSign<Dst>::value - 1)); 361 << (IntegerBitsPlusSign<Dst>::value - 1));
261 TEST_EXPECTED_VALUE(1, CheckedNumeric<Dst>(1) << 0); 362 TEST_EXPECTED_VALUE(1, CheckedNumeric<Dst>(1) << 0);
262 TEST_EXPECTED_VALUE(2, CheckedNumeric<Dst>(1) << 1); 363 TEST_EXPECTED_VALUE(2, CheckedNumeric<Dst>(1) << 1);
263 TEST_EXPECTED_FAILURE(CheckedNumeric<Dst>(1) >> 364 TEST_EXPECTED_FAILURE(CheckedNumeric<Dst>(1) >>
264 IntegerBitsPlusSign<Dst>::value); 365 IntegerBitsPlusSign<Dst>::value);
265 TEST_EXPECTED_VALUE( 366 TEST_EXPECTED_VALUE(
266 0, CheckedNumeric<Dst>(1) >> (IntegerBitsPlusSign<Dst>::value - 1)); 367 0, CheckedNumeric<Dst>(1) >> (IntegerBitsPlusSign<Dst>::value - 1));
267 TEST_EXPECTED_FAILURE(CheckedNumeric<Dst>(1) >> negative_one); 368 TEST_EXPECTED_FAILURE(CheckedNumeric<Dst>(1) >> negative_one);
268 369
370 // Modulus is legal only for integers.
371 TEST_EXPECTED_VALUE(0, ClampedNumeric<Dst>() % 1);
372 TEST_EXPECTED_VALUE(0, ClampedNumeric<Dst>(1) % 1);
373 TEST_EXPECTED_VALUE(-1, ClampedNumeric<Dst>(-1) % 2);
374 TEST_EXPECTED_VALUE(-1, ClampedNumeric<Dst>(-1) % -2);
375 TEST_EXPECTED_VALUE(0, ClampedNumeric<Dst>(DstLimits::lowest()) % 2);
376 TEST_EXPECTED_VALUE(1, ClampedNumeric<Dst>(DstLimits::max()) % 2);
377 // Test all the different modulus combinations.
378 TEST_EXPECTED_VALUE(0, ClampedNumeric<Dst>(1) % ClampedNumeric<Dst>(1));
379 TEST_EXPECTED_VALUE(0, 1 % ClampedNumeric<Dst>(1));
380 TEST_EXPECTED_VALUE(0, ClampedNumeric<Dst>(1) % 1);
381 ClampedNumeric<Dst> clamped_dst = 1;
382 TEST_EXPECTED_VALUE(0, clamped_dst %= 1);
383 TEST_EXPECTED_VALUE(Dst(1), ClampedNumeric<Dst>(1) % 0);
384 // Test bit shifts.
385 TEST_EXPECTED_VALUE(DstLimits::Overflow(),
386 ClampedNumeric<Dst>(1)
387 << (IntegerBitsPlusSign<Dst>::value - 1U));
388 TEST_EXPECTED_VALUE(Dst(0), ClampedNumeric<Dst>(0)
389 << (IntegerBitsPlusSign<Dst>::value + 0U));
390 TEST_EXPECTED_VALUE(DstLimits::Overflow(),
391 ClampedNumeric<Dst>(DstLimits::max()) << 1U);
392 TEST_EXPECTED_VALUE(
393 static_cast<Dst>(1) << (IntegerBitsPlusSign<Dst>::value - 2U),
394 ClampedNumeric<Dst>(1) << (IntegerBitsPlusSign<Dst>::value - 2U));
395 TEST_EXPECTED_VALUE(0, ClampedNumeric<Dst>(0)
396 << (IntegerBitsPlusSign<Dst>::value - 1U));
397 TEST_EXPECTED_VALUE(1, ClampedNumeric<Dst>(1) << 0U);
398 TEST_EXPECTED_VALUE(2, ClampedNumeric<Dst>(1) << 1U);
399 TEST_EXPECTED_VALUE(
400 0, ClampedNumeric<Dst>(1) >> (IntegerBitsPlusSign<Dst>::value + 0U));
401 TEST_EXPECTED_VALUE(
402 0, ClampedNumeric<Dst>(1) >> (IntegerBitsPlusSign<Dst>::value - 1U));
403
269 TestStrictPointerMath<Dst>(); 404 TestStrictPointerMath<Dst>();
270 } 405 }
271 406
272 // Unsigned integer arithmetic. 407 // Unsigned integer arithmetic.
273 template <typename Dst> 408 template <typename Dst>
274 static void TestSpecializedArithmetic( 409 static void TestSpecializedArithmetic(
275 const char* dst, 410 const char* dst,
276 int line, 411 int line,
277 typename std::enable_if<numeric_limits<Dst>::is_integer && 412 typename std::enable_if<numeric_limits<Dst>::is_integer &&
278 !numeric_limits<Dst>::is_signed, 413 !numeric_limits<Dst>::is_signed,
279 int>::type = 0) { 414 int>::type = 0) {
280 using DstLimits = numeric_limits<Dst>; 415 using DstLimits = SaturationDefaultLimits<Dst>;
281 TEST_EXPECTED_SUCCESS(-CheckedNumeric<Dst>(DstLimits::lowest())); 416 TEST_EXPECTED_SUCCESS(-CheckedNumeric<Dst>(DstLimits::lowest()));
282 TEST_EXPECTED_SUCCESS(CheckedNumeric<Dst>(DstLimits::lowest()).Abs()); 417 TEST_EXPECTED_SUCCESS(CheckedNumeric<Dst>(DstLimits::lowest()).Abs());
283 TEST_EXPECTED_FAILURE(CheckedNumeric<Dst>(DstLimits::lowest()) + -1); 418 TEST_EXPECTED_FAILURE(CheckedNumeric<Dst>(DstLimits::lowest()) + -1);
284 TEST_EXPECTED_FAILURE(CheckedNumeric<Dst>(DstLimits::lowest()) - 1); 419 TEST_EXPECTED_FAILURE(CheckedNumeric<Dst>(DstLimits::lowest()) - 1);
285 TEST_EXPECTED_VALUE(0, CheckedNumeric<Dst>(DstLimits::lowest()) * 2); 420 TEST_EXPECTED_VALUE(0, CheckedNumeric<Dst>(DstLimits::lowest()) * 2);
286 TEST_EXPECTED_VALUE(0, CheckedNumeric<Dst>(1) / 2); 421 TEST_EXPECTED_VALUE(0, CheckedNumeric<Dst>(1) / 2);
287 TEST_EXPECTED_SUCCESS(CheckedNumeric<Dst>(DstLimits::lowest()).UnsignedAbs()); 422 TEST_EXPECTED_SUCCESS(CheckedNumeric<Dst>(DstLimits::lowest()).UnsignedAbs());
288 TEST_EXPECTED_SUCCESS( 423 TEST_EXPECTED_SUCCESS(
289 CheckedNumeric<typename std::make_signed<Dst>::type>( 424 CheckedNumeric<typename std::make_signed<Dst>::type>(
290 std::numeric_limits<typename std::make_signed<Dst>::type>::lowest()) 425 std::numeric_limits<typename std::make_signed<Dst>::type>::lowest())
291 .UnsignedAbs()); 426 .UnsignedAbs());
292 TEST_EXPECTED_VALUE(DstLimits::lowest(), 427 TEST_EXPECTED_VALUE(DstLimits::lowest(),
293 MakeCheckedNum(DstLimits::lowest()).UnsignedAbs()); 428 MakeCheckedNum(DstLimits::lowest()).UnsignedAbs());
294 TEST_EXPECTED_VALUE(DstLimits::max(), 429 TEST_EXPECTED_VALUE(DstLimits::max(),
295 MakeCheckedNum(DstLimits::max()).UnsignedAbs()); 430 MakeCheckedNum(DstLimits::max()).UnsignedAbs());
296 TEST_EXPECTED_VALUE(0, CheckedNumeric<Dst>(0).UnsignedAbs()); 431 TEST_EXPECTED_VALUE(0, CheckedNumeric<Dst>(0).UnsignedAbs());
297 TEST_EXPECTED_VALUE(1, CheckedNumeric<Dst>(1).UnsignedAbs()); 432 TEST_EXPECTED_VALUE(1, CheckedNumeric<Dst>(1).UnsignedAbs());
298 433
434 TEST_EXPECTED_VALUE(0, -ClampedNumeric<Dst>(DstLimits::lowest()));
435 TEST_EXPECTED_VALUE(0, ClampedNumeric<Dst>(DstLimits::lowest()).Abs());
436 TEST_EXPECTED_VALUE(DstLimits::Underflow(),
437 ClampedNumeric<Dst>(DstLimits::lowest()) + -1);
438 TEST_EXPECTED_VALUE(DstLimits::Underflow(),
439 ClampedNumeric<Dst>(DstLimits::lowest()) - 1);
440 TEST_EXPECTED_VALUE(0, ClampedNumeric<Dst>(DstLimits::lowest()) * 2);
441 TEST_EXPECTED_VALUE(0, ClampedNumeric<Dst>(1) / 2);
442 TEST_EXPECTED_VALUE(0,
443 ClampedNumeric<Dst>(DstLimits::lowest()).UnsignedAbs());
444 TEST_EXPECTED_VALUE(
445 as_unsigned(
446 std::numeric_limits<typename std::make_signed<Dst>::type>::lowest()),
447 ClampedNumeric<typename std::make_signed<Dst>::type>(
448 std::numeric_limits<typename std::make_signed<Dst>::type>::lowest())
449 .UnsignedAbs());
450 TEST_EXPECTED_VALUE(DstLimits::lowest(),
451 MakeClampedNum(DstLimits::lowest()).UnsignedAbs());
452 TEST_EXPECTED_VALUE(DstLimits::max(),
453 MakeClampedNum(DstLimits::max()).UnsignedAbs());
454 TEST_EXPECTED_VALUE(0, ClampedNumeric<Dst>(0).UnsignedAbs());
455 TEST_EXPECTED_VALUE(1, ClampedNumeric<Dst>(1).UnsignedAbs());
456
299 // Modulus is legal only for integers. 457 // Modulus is legal only for integers.
300 TEST_EXPECTED_VALUE(0, CheckedNumeric<Dst>() % 1); 458 TEST_EXPECTED_VALUE(0, CheckedNumeric<Dst>() % 1);
301 TEST_EXPECTED_VALUE(0, CheckedNumeric<Dst>(1) % 1); 459 TEST_EXPECTED_VALUE(0, CheckedNumeric<Dst>(1) % 1);
302 TEST_EXPECTED_VALUE(1, CheckedNumeric<Dst>(1) % 2); 460 TEST_EXPECTED_VALUE(1, CheckedNumeric<Dst>(1) % 2);
303 TEST_EXPECTED_VALUE(0, CheckedNumeric<Dst>(DstLimits::lowest()) % 2); 461 TEST_EXPECTED_VALUE(0, CheckedNumeric<Dst>(DstLimits::lowest()) % 2);
304 TEST_EXPECTED_VALUE(1, CheckedNumeric<Dst>(DstLimits::max()) % 2); 462 TEST_EXPECTED_VALUE(1, CheckedNumeric<Dst>(DstLimits::max()) % 2);
305 // Test all the different modulus combinations. 463 // Test all the different modulus combinations.
306 TEST_EXPECTED_VALUE(0, CheckedNumeric<Dst>(1) % CheckedNumeric<Dst>(1)); 464 TEST_EXPECTED_VALUE(0, CheckedNumeric<Dst>(1) % CheckedNumeric<Dst>(1));
307 TEST_EXPECTED_VALUE(0, 1 % CheckedNumeric<Dst>(1)); 465 TEST_EXPECTED_VALUE(0, 1 % CheckedNumeric<Dst>(1));
308 TEST_EXPECTED_VALUE(0, CheckedNumeric<Dst>(1) % 1); 466 TEST_EXPECTED_VALUE(0, CheckedNumeric<Dst>(1) % 1);
309 CheckedNumeric<Dst> checked_dst = 1; 467 CheckedNumeric<Dst> checked_dst = 1;
310 TEST_EXPECTED_VALUE(0, checked_dst %= 1); 468 TEST_EXPECTED_VALUE(0, checked_dst %= 1);
311 // Test that div by 0 is avoided but returns invalid result. 469 // Test that div by 0 is avoided but returns invalid result.
312 TEST_EXPECTED_FAILURE(CheckedNumeric<Dst>(1) % 0); 470 TEST_EXPECTED_FAILURE(CheckedNumeric<Dst>(1) % 0);
313 TEST_EXPECTED_FAILURE(CheckedNumeric<Dst>(1) 471 TEST_EXPECTED_FAILURE(CheckedNumeric<Dst>(1)
314 << IntegerBitsPlusSign<Dst>::value); 472 << IntegerBitsPlusSign<Dst>::value);
315 // Test bit shifts. 473 // Test bit shifts.
316 volatile int negative_one = -1; 474 volatile int negative_one = -1;
317 TEST_EXPECTED_FAILURE(CheckedNumeric<Dst>(1) << negative_one); 475 TEST_EXPECTED_FAILURE(CheckedNumeric<Dst>(1) << negative_one);
318 TEST_EXPECTED_FAILURE(CheckedNumeric<Dst>(1) 476 TEST_EXPECTED_FAILURE(CheckedNumeric<Dst>(1)
319 << IntegerBitsPlusSign<Dst>::value); 477 << IntegerBitsPlusSign<Dst>::value);
320 TEST_EXPECTED_FAILURE(CheckedNumeric<Dst>(0) 478 TEST_EXPECTED_VALUE(Dst(0), CheckedNumeric<Dst>(0)
321 << IntegerBitsPlusSign<Dst>::value); 479 << IntegerBitsPlusSign<Dst>::value);
322 TEST_EXPECTED_FAILURE(CheckedNumeric<Dst>(DstLimits::max()) << 1); 480 TEST_EXPECTED_FAILURE(CheckedNumeric<Dst>(DstLimits::max()) << 1);
323 TEST_EXPECTED_VALUE( 481 TEST_EXPECTED_VALUE(
324 static_cast<Dst>(1) << (IntegerBitsPlusSign<Dst>::value - 1), 482 static_cast<Dst>(1) << (IntegerBitsPlusSign<Dst>::value - 1),
325 CheckedNumeric<Dst>(1) << (IntegerBitsPlusSign<Dst>::value - 1)); 483 CheckedNumeric<Dst>(1) << (IntegerBitsPlusSign<Dst>::value - 1));
326 TEST_EXPECTED_VALUE(1, CheckedNumeric<Dst>(1) << 0); 484 TEST_EXPECTED_VALUE(1, CheckedNumeric<Dst>(1) << 0);
327 TEST_EXPECTED_VALUE(2, CheckedNumeric<Dst>(1) << 1); 485 TEST_EXPECTED_VALUE(2, CheckedNumeric<Dst>(1) << 1);
328 TEST_EXPECTED_FAILURE(CheckedNumeric<Dst>(1) >> 486 TEST_EXPECTED_FAILURE(CheckedNumeric<Dst>(1) >>
329 IntegerBitsPlusSign<Dst>::value); 487 IntegerBitsPlusSign<Dst>::value);
330 TEST_EXPECTED_VALUE( 488 TEST_EXPECTED_VALUE(
331 0, CheckedNumeric<Dst>(1) >> (IntegerBitsPlusSign<Dst>::value - 1)); 489 0, CheckedNumeric<Dst>(1) >> (IntegerBitsPlusSign<Dst>::value - 1));
(...skipping 11 matching lines...) Expand all
343 TEST_EXPECTED_VALUE(std::numeric_limits<Dst>::max(), 501 TEST_EXPECTED_VALUE(std::numeric_limits<Dst>::max(),
344 CheckedNumeric<Dst>(0) | static_cast<Dst>(-1)); 502 CheckedNumeric<Dst>(0) | static_cast<Dst>(-1));
345 TEST_EXPECTED_VALUE(0, CheckedNumeric<Dst>(1) ^ 1); 503 TEST_EXPECTED_VALUE(0, CheckedNumeric<Dst>(1) ^ 1);
346 TEST_EXPECTED_VALUE(1, CheckedNumeric<Dst>(1) ^ 0); 504 TEST_EXPECTED_VALUE(1, CheckedNumeric<Dst>(1) ^ 0);
347 TEST_EXPECTED_VALUE(1, CheckedNumeric<Dst>(0) ^ 1); 505 TEST_EXPECTED_VALUE(1, CheckedNumeric<Dst>(0) ^ 1);
348 TEST_EXPECTED_VALUE(0, CheckedNumeric<Dst>(0) ^ 0); 506 TEST_EXPECTED_VALUE(0, CheckedNumeric<Dst>(0) ^ 0);
349 TEST_EXPECTED_VALUE(std::numeric_limits<Dst>::max(), 507 TEST_EXPECTED_VALUE(std::numeric_limits<Dst>::max(),
350 CheckedNumeric<Dst>(0) ^ static_cast<Dst>(-1)); 508 CheckedNumeric<Dst>(0) ^ static_cast<Dst>(-1));
351 TEST_EXPECTED_VALUE(DstLimits::max(), ~CheckedNumeric<Dst>(0)); 509 TEST_EXPECTED_VALUE(DstLimits::max(), ~CheckedNumeric<Dst>(0));
352 510
511 // Modulus is legal only for integers.
512 TEST_EXPECTED_VALUE(0, ClampedNumeric<Dst>() % 1);
513 TEST_EXPECTED_VALUE(0, ClampedNumeric<Dst>(1) % 1);
514 TEST_EXPECTED_VALUE(1, ClampedNumeric<Dst>(1) % 2);
515 TEST_EXPECTED_VALUE(0, ClampedNumeric<Dst>(DstLimits::lowest()) % 2);
516 TEST_EXPECTED_VALUE(1, ClampedNumeric<Dst>(DstLimits::max()) % 2);
517 // Test all the different modulus combinations.
518 TEST_EXPECTED_VALUE(0, ClampedNumeric<Dst>(1) % ClampedNumeric<Dst>(1));
519 TEST_EXPECTED_VALUE(0, 1 % ClampedNumeric<Dst>(1));
520 TEST_EXPECTED_VALUE(0, ClampedNumeric<Dst>(1) % 1);
521 ClampedNumeric<Dst> clamped_dst = 1;
522 TEST_EXPECTED_VALUE(0, clamped_dst %= 1);
523 // Test that div by 0 is avoided but returns invalid result.
524 TEST_EXPECTED_VALUE(Dst(1), ClampedNumeric<Dst>(1) % 0);
525 TEST_EXPECTED_VALUE(DstLimits::Overflow(),
526 ClampedNumeric<Dst>(1)
527 << as_unsigned(IntegerBitsPlusSign<Dst>::value));
528 // Test bit shifts.
529 TEST_EXPECTED_VALUE(DstLimits::Overflow(),
530 ClampedNumeric<Dst>(1)
531 << as_unsigned(IntegerBitsPlusSign<Dst>::value));
532 TEST_EXPECTED_VALUE(Dst(0), ClampedNumeric<Dst>(0) << as_unsigned(
533 IntegerBitsPlusSign<Dst>::value));
534 TEST_EXPECTED_VALUE(DstLimits::Overflow(),
535 ClampedNumeric<Dst>(DstLimits::max()) << 1U);
536 TEST_EXPECTED_VALUE(
537 static_cast<Dst>(1) << (IntegerBitsPlusSign<Dst>::value - 1U),
538 ClampedNumeric<Dst>(1) << (IntegerBitsPlusSign<Dst>::value - 1U));
539 TEST_EXPECTED_VALUE(1, ClampedNumeric<Dst>(1) << 0U);
540 TEST_EXPECTED_VALUE(2, ClampedNumeric<Dst>(1) << 1U);
541 TEST_EXPECTED_VALUE(0, ClampedNumeric<Dst>(1) >>
542 as_unsigned(IntegerBitsPlusSign<Dst>::value));
543 TEST_EXPECTED_VALUE(
544 0, ClampedNumeric<Dst>(1) >> (IntegerBitsPlusSign<Dst>::value - 1U));
545 TEST_EXPECTED_VALUE(1, ClampedNumeric<Dst>(1) & 1);
546 TEST_EXPECTED_VALUE(0, ClampedNumeric<Dst>(1) & 0);
547 TEST_EXPECTED_VALUE(0, ClampedNumeric<Dst>(0) & 1);
548 TEST_EXPECTED_VALUE(0, ClampedNumeric<Dst>(1) & 0);
549 TEST_EXPECTED_VALUE(std::numeric_limits<Dst>::max(),
550 MakeCheckedNum(DstLimits::max()) & -1);
551 TEST_EXPECTED_VALUE(1, ClampedNumeric<Dst>(1) | 1);
552 TEST_EXPECTED_VALUE(1, ClampedNumeric<Dst>(1) | 0);
553 TEST_EXPECTED_VALUE(1, ClampedNumeric<Dst>(0) | 1);
554 TEST_EXPECTED_VALUE(0, ClampedNumeric<Dst>(0) | 0);
555 TEST_EXPECTED_VALUE(std::numeric_limits<Dst>::max(),
556 ClampedNumeric<Dst>(0) | static_cast<Dst>(-1));
557 TEST_EXPECTED_VALUE(0, ClampedNumeric<Dst>(1) ^ 1);
558 TEST_EXPECTED_VALUE(1, ClampedNumeric<Dst>(1) ^ 0);
559 TEST_EXPECTED_VALUE(1, ClampedNumeric<Dst>(0) ^ 1);
560 TEST_EXPECTED_VALUE(0, ClampedNumeric<Dst>(0) ^ 0);
561 TEST_EXPECTED_VALUE(std::numeric_limits<Dst>::max(),
562 ClampedNumeric<Dst>(0) ^ static_cast<Dst>(-1));
563 TEST_EXPECTED_VALUE(DstLimits::max(), ~ClampedNumeric<Dst>(0));
564
353 TestStrictPointerMath<Dst>(); 565 TestStrictPointerMath<Dst>();
354 } 566 }
355 567
356 // Floating point arithmetic. 568 // Floating point arithmetic.
357 template <typename Dst> 569 template <typename Dst>
358 void TestSpecializedArithmetic( 570 void TestSpecializedArithmetic(
359 const char* dst, 571 const char* dst,
360 int line, 572 int line,
361 typename std::enable_if<numeric_limits<Dst>::is_iec559, int>::type = 0) { 573 typename std::enable_if<numeric_limits<Dst>::is_iec559, int>::type = 0) {
362 using DstLimits = numeric_limits<Dst>; 574 using DstLimits = SaturationDefaultLimits<Dst>;
363 TEST_EXPECTED_SUCCESS(-CheckedNumeric<Dst>(DstLimits::lowest())); 575 TEST_EXPECTED_SUCCESS(-CheckedNumeric<Dst>(DstLimits::lowest()));
364 576
365 TEST_EXPECTED_SUCCESS(CheckedNumeric<Dst>(DstLimits::lowest()).Abs()); 577 TEST_EXPECTED_SUCCESS(CheckedNumeric<Dst>(DstLimits::lowest()).Abs());
366 TEST_EXPECTED_VALUE(1, CheckedNumeric<Dst>(-1).Abs()); 578 TEST_EXPECTED_VALUE(1, CheckedNumeric<Dst>(-1).Abs());
367 579
368 TEST_EXPECTED_SUCCESS(CheckedNumeric<Dst>(DstLimits::lowest()) + -1); 580 TEST_EXPECTED_SUCCESS(CheckedNumeric<Dst>(DstLimits::lowest()) + -1);
369 TEST_EXPECTED_SUCCESS(CheckedNumeric<Dst>(DstLimits::max()) + 1); 581 TEST_EXPECTED_SUCCESS(CheckedNumeric<Dst>(DstLimits::max()) + 1);
370 TEST_EXPECTED_FAILURE(CheckedNumeric<Dst>(DstLimits::lowest()) + 582 TEST_EXPECTED_FAILURE(CheckedNumeric<Dst>(DstLimits::lowest()) +
371 DstLimits::lowest()); 583 DstLimits::lowest());
372 584
373 TEST_EXPECTED_FAILURE(CheckedNumeric<Dst>(DstLimits::max()) - 585 TEST_EXPECTED_FAILURE(CheckedNumeric<Dst>(DstLimits::max()) -
374 DstLimits::lowest()); 586 DstLimits::lowest());
375 TEST_EXPECTED_FAILURE(CheckedNumeric<Dst>(DstLimits::lowest()) - 587 TEST_EXPECTED_FAILURE(CheckedNumeric<Dst>(DstLimits::lowest()) -
376 DstLimits::max()); 588 DstLimits::max());
377 589
378 TEST_EXPECTED_FAILURE(CheckedNumeric<Dst>(DstLimits::lowest()) * 2); 590 TEST_EXPECTED_FAILURE(CheckedNumeric<Dst>(DstLimits::lowest()) * 2);
379 591
380 TEST_EXPECTED_VALUE(-0.5, CheckedNumeric<Dst>(-1.0) / 2); 592 TEST_EXPECTED_VALUE(-0.5, CheckedNumeric<Dst>(-1.0) / 2);
593
594 TEST_EXPECTED_VALUE(DstLimits::max(),
595 -ClampedNumeric<Dst>(DstLimits::lowest()));
596
597 TEST_EXPECTED_VALUE(DstLimits::max(),
598 ClampedNumeric<Dst>(DstLimits::lowest()).Abs());
599 TEST_EXPECTED_VALUE(1, ClampedNumeric<Dst>(-1).Abs());
600
601 TEST_EXPECTED_VALUE(DstLimits::lowest() - 1,
602 ClampedNumeric<Dst>(DstLimits::lowest()) + -1);
603 TEST_EXPECTED_VALUE(DstLimits::max() + 1,
604 ClampedNumeric<Dst>(DstLimits::max()) + 1);
605 TEST_EXPECTED_VALUE(
606 DstLimits::Underflow(),
607 ClampedNumeric<Dst>(DstLimits::lowest()) + DstLimits::lowest());
608
609 TEST_EXPECTED_VALUE(
610 DstLimits::Overflow(),
611 ClampedNumeric<Dst>(DstLimits::max()) - DstLimits::lowest());
612 TEST_EXPECTED_VALUE(
613 DstLimits::Underflow(),
614 ClampedNumeric<Dst>(DstLimits::lowest()) - DstLimits::max());
615
616 TEST_EXPECTED_VALUE(DstLimits::Underflow(),
617 ClampedNumeric<Dst>(DstLimits::lowest()) * 2);
618
619 TEST_EXPECTED_VALUE(-0.5, ClampedNumeric<Dst>(-1.0) / 2);
381 } 620 }
382 621
383 // Generic arithmetic tests. 622 // Generic arithmetic tests.
384 template <typename Dst> 623 template <typename Dst>
385 static void TestArithmetic(const char* dst, int line) { 624 static void TestArithmetic(const char* dst, int line) {
386 using DstLimits = numeric_limits<Dst>; 625 using DstLimits = SaturationDefaultLimits<Dst>;
387 626
388 EXPECT_EQ(true, CheckedNumeric<Dst>().IsValid()); 627 EXPECT_EQ(true, CheckedNumeric<Dst>().IsValid());
389 EXPECT_EQ(false, 628 EXPECT_EQ(false,
390 CheckedNumeric<Dst>(CheckedNumeric<Dst>(DstLimits::max()) * 629 CheckedNumeric<Dst>(CheckedNumeric<Dst>(DstLimits::max()) *
391 DstLimits::max()).IsValid()); 630 DstLimits::max()).IsValid());
392 EXPECT_EQ(static_cast<Dst>(0), CheckedNumeric<Dst>().ValueOrDie()); 631 EXPECT_EQ(static_cast<Dst>(0), CheckedNumeric<Dst>().ValueOrDie());
393 EXPECT_EQ(static_cast<Dst>(0), CheckedNumeric<Dst>().ValueOrDefault(1)); 632 EXPECT_EQ(static_cast<Dst>(0), CheckedNumeric<Dst>().ValueOrDefault(1));
394 EXPECT_EQ(static_cast<Dst>(1), 633 EXPECT_EQ(static_cast<Dst>(1),
395 CheckedNumeric<Dst>(CheckedNumeric<Dst>(DstLimits::max()) * 634 CheckedNumeric<Dst>(CheckedNumeric<Dst>(DstLimits::max()) *
396 DstLimits::max()).ValueOrDefault(1)); 635 DstLimits::max()).ValueOrDefault(1));
(...skipping 13 matching lines...) Expand all
410 TEST_EXPECTED_VALUE(1, CheckedNumeric<Dst>(1) / 1); 649 TEST_EXPECTED_VALUE(1, CheckedNumeric<Dst>(1) / 1);
411 CheckedNumeric<Dst> checked_dst = 1; 650 CheckedNumeric<Dst> checked_dst = 1;
412 TEST_EXPECTED_VALUE(2, checked_dst += 1); 651 TEST_EXPECTED_VALUE(2, checked_dst += 1);
413 checked_dst = 1; 652 checked_dst = 1;
414 TEST_EXPECTED_VALUE(0, checked_dst -= 1); 653 TEST_EXPECTED_VALUE(0, checked_dst -= 1);
415 checked_dst = 1; 654 checked_dst = 1;
416 TEST_EXPECTED_VALUE(1, checked_dst *= 1); 655 TEST_EXPECTED_VALUE(1, checked_dst *= 1);
417 checked_dst = 1; 656 checked_dst = 1;
418 TEST_EXPECTED_VALUE(1, checked_dst /= 1); 657 TEST_EXPECTED_VALUE(1, checked_dst /= 1);
419 658
659 TEST_EXPECTED_VALUE(2, ClampedNumeric<Dst>(1) + ClampedNumeric<Dst>(1));
660 TEST_EXPECTED_VALUE(0, ClampedNumeric<Dst>(1) - ClampedNumeric<Dst>(1));
661 TEST_EXPECTED_VALUE(1, ClampedNumeric<Dst>(1) * ClampedNumeric<Dst>(1));
662 TEST_EXPECTED_VALUE(1, ClampedNumeric<Dst>(1) / ClampedNumeric<Dst>(1));
663 TEST_EXPECTED_VALUE(2, 1 + ClampedNumeric<Dst>(1));
664 TEST_EXPECTED_VALUE(0, 1 - ClampedNumeric<Dst>(1));
665 TEST_EXPECTED_VALUE(1, 1 * ClampedNumeric<Dst>(1));
666 TEST_EXPECTED_VALUE(1, 1 / ClampedNumeric<Dst>(1));
667 TEST_EXPECTED_VALUE(2, ClampedNumeric<Dst>(1) + 1);
668 TEST_EXPECTED_VALUE(0, ClampedNumeric<Dst>(1) - 1);
669 TEST_EXPECTED_VALUE(1, ClampedNumeric<Dst>(1) * 1);
670 TEST_EXPECTED_VALUE(1, ClampedNumeric<Dst>(1) / 1);
671 ClampedNumeric<Dst> clamped_dst = 1;
672 TEST_EXPECTED_VALUE(2, clamped_dst += 1);
673 clamped_dst = 1;
674 TEST_EXPECTED_VALUE(0, clamped_dst -= 1);
675 clamped_dst = 1;
676 TEST_EXPECTED_VALUE(1, clamped_dst *= 1);
677 clamped_dst = 1;
678 TEST_EXPECTED_VALUE(1, clamped_dst /= 1);
679
420 // Generic negation. 680 // Generic negation.
421 if (DstLimits::is_signed) { 681 if (DstLimits::is_signed) {
422 TEST_EXPECTED_VALUE(0, -CheckedNumeric<Dst>()); 682 TEST_EXPECTED_VALUE(0, -CheckedNumeric<Dst>());
423 TEST_EXPECTED_VALUE(-1, -CheckedNumeric<Dst>(1)); 683 TEST_EXPECTED_VALUE(-1, -CheckedNumeric<Dst>(1));
424 TEST_EXPECTED_VALUE(1, -CheckedNumeric<Dst>(-1)); 684 TEST_EXPECTED_VALUE(1, -CheckedNumeric<Dst>(-1));
425 TEST_EXPECTED_VALUE(static_cast<Dst>(DstLimits::max() * -1), 685 TEST_EXPECTED_VALUE(static_cast<Dst>(DstLimits::max() * -1),
426 -CheckedNumeric<Dst>(DstLimits::max())); 686 -CheckedNumeric<Dst>(DstLimits::max()));
687
688 TEST_EXPECTED_VALUE(0, -ClampedNumeric<Dst>());
689 TEST_EXPECTED_VALUE(-1, -ClampedNumeric<Dst>(1));
690 TEST_EXPECTED_VALUE(1, -ClampedNumeric<Dst>(-1));
691 TEST_EXPECTED_VALUE(static_cast<Dst>(DstLimits::max() * -1),
692 -ClampedNumeric<Dst>(DstLimits::max()));
427 } 693 }
428 694
429 // Generic absolute value. 695 // Generic absolute value.
430 TEST_EXPECTED_VALUE(0, CheckedNumeric<Dst>().Abs()); 696 TEST_EXPECTED_VALUE(0, CheckedNumeric<Dst>().Abs());
431 TEST_EXPECTED_VALUE(1, CheckedNumeric<Dst>(1).Abs()); 697 TEST_EXPECTED_VALUE(1, CheckedNumeric<Dst>(1).Abs());
432 TEST_EXPECTED_VALUE(DstLimits::max(), 698 TEST_EXPECTED_VALUE(DstLimits::max(),
433 CheckedNumeric<Dst>(DstLimits::max()).Abs()); 699 CheckedNumeric<Dst>(DstLimits::max()).Abs());
434 700
701 TEST_EXPECTED_VALUE(0, ClampedNumeric<Dst>().Abs());
702 TEST_EXPECTED_VALUE(1, ClampedNumeric<Dst>(1).Abs());
703 TEST_EXPECTED_VALUE(DstLimits::max(),
704 ClampedNumeric<Dst>(DstLimits::max()).Abs());
705
435 // Generic addition. 706 // Generic addition.
436 TEST_EXPECTED_VALUE(1, (CheckedNumeric<Dst>() + 1)); 707 TEST_EXPECTED_VALUE(1, (CheckedNumeric<Dst>() + 1));
437 TEST_EXPECTED_VALUE(2, (CheckedNumeric<Dst>(1) + 1)); 708 TEST_EXPECTED_VALUE(2, (CheckedNumeric<Dst>(1) + 1));
438 if (numeric_limits<Dst>::is_signed) 709 if (numeric_limits<Dst>::is_signed)
439 TEST_EXPECTED_VALUE(0, (CheckedNumeric<Dst>(-1) + 1)); 710 TEST_EXPECTED_VALUE(0, (CheckedNumeric<Dst>(-1) + 1));
440 TEST_EXPECTED_SUCCESS(CheckedNumeric<Dst>(DstLimits::lowest()) + 1); 711 TEST_EXPECTED_SUCCESS(CheckedNumeric<Dst>(DstLimits::lowest()) + 1);
441 TEST_EXPECTED_FAILURE(CheckedNumeric<Dst>(DstLimits::max()) + 712 TEST_EXPECTED_FAILURE(CheckedNumeric<Dst>(DstLimits::max()) +
442 DstLimits::max()); 713 DstLimits::max());
443 714
715 TEST_EXPECTED_VALUE(1, (ClampedNumeric<Dst>() + 1));
716 TEST_EXPECTED_VALUE(2, (ClampedNumeric<Dst>(1) + 1));
717 if (numeric_limits<Dst>::is_signed)
718 TEST_EXPECTED_VALUE(0, (ClampedNumeric<Dst>(-1) + 1));
719 TEST_EXPECTED_VALUE(DstLimits::lowest() + 1,
720 ClampedNumeric<Dst>(DstLimits::lowest()) + 1);
721 TEST_EXPECTED_VALUE(DstLimits::Overflow(),
722 ClampedNumeric<Dst>(DstLimits::max()) + DstLimits::max());
723
444 // Generic subtraction. 724 // Generic subtraction.
445 TEST_EXPECTED_VALUE(0, (CheckedNumeric<Dst>(1) - 1)); 725 TEST_EXPECTED_VALUE(0, (CheckedNumeric<Dst>(1) - 1));
446 TEST_EXPECTED_SUCCESS(CheckedNumeric<Dst>(DstLimits::max()) - 1); 726 TEST_EXPECTED_SUCCESS(CheckedNumeric<Dst>(DstLimits::max()) - 1);
447 if (numeric_limits<Dst>::is_signed) { 727 if (numeric_limits<Dst>::is_signed) {
448 TEST_EXPECTED_VALUE(-1, (CheckedNumeric<Dst>() - 1)); 728 TEST_EXPECTED_VALUE(-1, (CheckedNumeric<Dst>() - 1));
449 TEST_EXPECTED_VALUE(-2, (CheckedNumeric<Dst>(-1) - 1)); 729 TEST_EXPECTED_VALUE(-2, (CheckedNumeric<Dst>(-1) - 1));
450 } else { 730 } else {
451 TEST_EXPECTED_FAILURE(CheckedNumeric<Dst>(DstLimits::max()) - -1); 731 TEST_EXPECTED_FAILURE(CheckedNumeric<Dst>(DstLimits::max()) - -1);
452 } 732 }
453 733
734 TEST_EXPECTED_VALUE(0, (ClampedNumeric<Dst>(1) - 1));
735 TEST_EXPECTED_VALUE(DstLimits::max() - 1,
736 ClampedNumeric<Dst>(DstLimits::max()) - 1);
737 if (numeric_limits<Dst>::is_signed) {
738 TEST_EXPECTED_VALUE(-1, (ClampedNumeric<Dst>() - 1));
739 TEST_EXPECTED_VALUE(-2, (ClampedNumeric<Dst>(-1) - 1));
740 } else {
741 TEST_EXPECTED_VALUE(DstLimits::max(),
742 ClampedNumeric<Dst>(DstLimits::max()) - -1);
743 }
744
454 // Generic multiplication. 745 // Generic multiplication.
455 TEST_EXPECTED_VALUE(0, (CheckedNumeric<Dst>() * 1)); 746 TEST_EXPECTED_VALUE(0, (CheckedNumeric<Dst>() * 1));
456 TEST_EXPECTED_VALUE(1, (CheckedNumeric<Dst>(1) * 1)); 747 TEST_EXPECTED_VALUE(1, (CheckedNumeric<Dst>(1) * 1));
457 TEST_EXPECTED_VALUE(0, (CheckedNumeric<Dst>(0) * 0)); 748 TEST_EXPECTED_VALUE(0, (CheckedNumeric<Dst>(0) * 0));
458 if (numeric_limits<Dst>::is_signed) { 749 if (numeric_limits<Dst>::is_signed) {
459 TEST_EXPECTED_VALUE(0, (CheckedNumeric<Dst>(-1) * 0)); 750 TEST_EXPECTED_VALUE(0, (CheckedNumeric<Dst>(-1) * 0));
460 TEST_EXPECTED_VALUE(0, (CheckedNumeric<Dst>(0) * -1)); 751 TEST_EXPECTED_VALUE(0, (CheckedNumeric<Dst>(0) * -1));
461 TEST_EXPECTED_VALUE(-2, (CheckedNumeric<Dst>(-1) * 2)); 752 TEST_EXPECTED_VALUE(-2, (CheckedNumeric<Dst>(-1) * 2));
462 } else { 753 } else {
463 TEST_EXPECTED_FAILURE(CheckedNumeric<Dst>(DstLimits::max()) * -2); 754 TEST_EXPECTED_FAILURE(CheckedNumeric<Dst>(DstLimits::max()) * -2);
464 TEST_EXPECTED_FAILURE(CheckedNumeric<Dst>(DstLimits::max()) * 755 TEST_EXPECTED_FAILURE(CheckedNumeric<Dst>(DstLimits::max()) *
465 CheckedNumeric<uintmax_t>(-2)); 756 CheckedNumeric<uintmax_t>(-2));
466 } 757 }
467 TEST_EXPECTED_FAILURE(CheckedNumeric<Dst>(DstLimits::max()) * 758 TEST_EXPECTED_FAILURE(CheckedNumeric<Dst>(DstLimits::max()) *
468 DstLimits::max()); 759 DstLimits::max());
469 760
761 TEST_EXPECTED_VALUE(0, (ClampedNumeric<Dst>() * 1));
762 TEST_EXPECTED_VALUE(1, (ClampedNumeric<Dst>(1) * 1));
763 TEST_EXPECTED_VALUE(0, (ClampedNumeric<Dst>(0) * 0));
764 if (numeric_limits<Dst>::is_signed) {
765 TEST_EXPECTED_VALUE(0, (ClampedNumeric<Dst>(-1) * 0));
766 TEST_EXPECTED_VALUE(0, (ClampedNumeric<Dst>(0) * -1));
767 TEST_EXPECTED_VALUE(-2, (ClampedNumeric<Dst>(-1) * 2));
768 } else {
769 TEST_EXPECTED_VALUE(DstLimits::Underflow(),
770 ClampedNumeric<Dst>(DstLimits::max()) * -2);
771 TEST_EXPECTED_VALUE(0, ClampedNumeric<Dst>(DstLimits::max()) *
772 ClampedNumeric<uintmax_t>(-2));
773 }
774 TEST_EXPECTED_VALUE(DstLimits::Overflow(),
775 ClampedNumeric<Dst>(DstLimits::max()) * DstLimits::max());
776
470 // Generic division. 777 // Generic division.
471 TEST_EXPECTED_VALUE(0, CheckedNumeric<Dst>() / 1); 778 TEST_EXPECTED_VALUE(0, CheckedNumeric<Dst>() / 1);
472 TEST_EXPECTED_VALUE(1, CheckedNumeric<Dst>(1) / 1); 779 TEST_EXPECTED_VALUE(1, CheckedNumeric<Dst>(1) / 1);
473 TEST_EXPECTED_VALUE(DstLimits::lowest() / 2, 780 TEST_EXPECTED_VALUE(DstLimits::lowest() / 2,
474 CheckedNumeric<Dst>(DstLimits::lowest()) / 2); 781 CheckedNumeric<Dst>(DstLimits::lowest()) / 2);
475 TEST_EXPECTED_VALUE(DstLimits::max() / 2, 782 TEST_EXPECTED_VALUE(DstLimits::max() / 2,
476 CheckedNumeric<Dst>(DstLimits::max()) / 2); 783 CheckedNumeric<Dst>(DstLimits::max()) / 2);
477 784
785 TEST_EXPECTED_VALUE(0, ClampedNumeric<Dst>() / 1);
786 TEST_EXPECTED_VALUE(1, ClampedNumeric<Dst>(1) / 1);
787 TEST_EXPECTED_VALUE(DstLimits::lowest() / 2,
788 ClampedNumeric<Dst>(DstLimits::lowest()) / 2);
789 TEST_EXPECTED_VALUE(DstLimits::max() / 2,
790 ClampedNumeric<Dst>(DstLimits::max()) / 2);
791
478 TestSpecializedArithmetic<Dst>(dst, line); 792 TestSpecializedArithmetic<Dst>(dst, line);
479 } 793 }
480 794
481 // Helper macro to wrap displaying the conversion types and line numbers. 795 // Helper macro to wrap displaying the conversion types and line numbers.
482 #define TEST_ARITHMETIC(Dst) TestArithmetic<Dst>(#Dst, __LINE__) 796 #define TEST_ARITHMETIC(Dst) TestArithmetic<Dst>(#Dst, __LINE__)
483 797
484 TEST(SafeNumerics, SignedIntegerMath) { 798 TEST(SafeNumerics, SignedIntegerMath) {
485 TEST_ARITHMETIC(int8_t); 799 TEST_ARITHMETIC(int8_t);
486 TEST_ARITHMETIC(int); 800 TEST_ARITHMETIC(int);
487 TEST_ARITHMETIC(intptr_t); 801 TEST_ARITHMETIC(intptr_t);
(...skipping 110 matching lines...) Expand 10 before | Expand all | Expand 10 after
598 DstLimits::max(), SrcLimits::lowest()) 912 DstLimits::max(), SrcLimits::lowest())
599 .ValueOrDie()); 913 .ValueOrDie());
600 EXPECT_EQ(DstLimits::max(), CheckMax(MakeStrictNum(1), MakeCheckedNum(0), 914 EXPECT_EQ(DstLimits::max(), CheckMax(MakeStrictNum(1), MakeCheckedNum(0),
601 DstLimits::max(), SrcLimits::lowest()) 915 DstLimits::max(), SrcLimits::lowest())
602 .ValueOrDie()); 916 .ValueOrDie());
603 } 917 }
604 918
605 template <typename Dst, typename Src> 919 template <typename Dst, typename Src>
606 struct TestNumericConversion<Dst, Src, SIGN_PRESERVING_VALUE_PRESERVING> { 920 struct TestNumericConversion<Dst, Src, SIGN_PRESERVING_VALUE_PRESERVING> {
607 static void Test(const char *dst, const char *src, int line) { 921 static void Test(const char *dst, const char *src, int line) {
608 using SrcLimits = numeric_limits<Src>; 922 using SrcLimits = SaturationDefaultLimits<Src>;
609 using DstLimits = numeric_limits<Dst>; 923 using DstLimits = SaturationDefaultLimits<Dst>;
610 // Integral to floating. 924 // Integral to floating.
611 static_assert((DstLimits::is_iec559 && SrcLimits::is_integer) || 925 static_assert((DstLimits::is_iec559 && SrcLimits::is_integer) ||
612 // Not floating to integral and... 926 // Not floating to integral and...
613 (!(DstLimits::is_integer && SrcLimits::is_iec559) && 927 (!(DstLimits::is_integer && SrcLimits::is_iec559) &&
614 // Same sign, same numeric, source is narrower or same. 928 // Same sign, same numeric, source is narrower or same.
615 ((SrcLimits::is_signed == DstLimits::is_signed && 929 ((SrcLimits::is_signed == DstLimits::is_signed &&
616 MaxExponent<Dst>::value >= MaxExponent<Src>::value) || 930 MaxExponent<Dst>::value >= MaxExponent<Src>::value) ||
617 // Or signed destination and source is smaller 931 // Or signed destination and source is smaller
618 (DstLimits::is_signed && 932 (DstLimits::is_signed &&
619 MaxExponent<Dst>::value >= MaxExponent<Src>::value))), 933 MaxExponent<Dst>::value >= MaxExponent<Src>::value))),
620 "Comparison must be sign preserving and value preserving"); 934 "Comparison must be sign preserving and value preserving");
621 935
622 TestStrictComparison<Dst, Src>(); 936 TestStrictComparison<Dst, Src>();
623 937
624 const CheckedNumeric<Dst> checked_dst = SrcLimits::max(); 938 const CheckedNumeric<Dst> checked_dst = SrcLimits::max();
939 const ClampedNumeric<Dst> clamped_dst = SrcLimits::max();
625 TEST_EXPECTED_SUCCESS(checked_dst); 940 TEST_EXPECTED_SUCCESS(checked_dst);
941 TEST_EXPECTED_VALUE(Dst(SrcLimits::max()), clamped_dst);
626 if (MaxExponent<Dst>::value > MaxExponent<Src>::value) { 942 if (MaxExponent<Dst>::value > MaxExponent<Src>::value) {
627 if (MaxExponent<Dst>::value >= MaxExponent<Src>::value * 2 - 1) { 943 if (MaxExponent<Dst>::value >= MaxExponent<Src>::value * 2 - 1) {
628 // At least twice larger type. 944 // At least twice larger type.
629 TEST_EXPECTED_SUCCESS(SrcLimits::max() * checked_dst); 945 TEST_EXPECTED_SUCCESS(SrcLimits::max() * checked_dst);
630 946 TEST_EXPECTED_VALUE(SrcLimits::max() * clamped_dst,
947 Dst(SrcLimits::max()) * SrcLimits::max());
631 } else { // Larger, but not at least twice as large. 948 } else { // Larger, but not at least twice as large.
632 TEST_EXPECTED_FAILURE(SrcLimits::max() * checked_dst); 949 TEST_EXPECTED_FAILURE(SrcLimits::max() * checked_dst);
633 TEST_EXPECTED_SUCCESS(checked_dst + 1); 950 TEST_EXPECTED_SUCCESS(checked_dst + 1);
951 TEST_EXPECTED_VALUE(DstLimits::Overflow(),
952 SrcLimits::max() * clamped_dst);
953 TEST_EXPECTED_VALUE(Dst(SrcLimits::max()) + Dst(1),
954 clamped_dst + Dst(1));
634 } 955 }
635 } else { // Same width type. 956 } else { // Same width type.
636 TEST_EXPECTED_FAILURE(checked_dst + 1); 957 TEST_EXPECTED_FAILURE(checked_dst + 1);
958 TEST_EXPECTED_VALUE(DstLimits::Overflow(), clamped_dst + Dst(1));
637 } 959 }
638 960
639 TEST_EXPECTED_RANGE(RANGE_VALID, SrcLimits::max()); 961 TEST_EXPECTED_RANGE(RANGE_VALID, SrcLimits::max());
640 TEST_EXPECTED_RANGE(RANGE_VALID, static_cast<Src>(1)); 962 TEST_EXPECTED_RANGE(RANGE_VALID, static_cast<Src>(1));
641 if (SrcLimits::is_iec559) { 963 if (SrcLimits::is_iec559) {
642 TEST_EXPECTED_RANGE(RANGE_VALID, SrcLimits::max() * static_cast<Src>(-1)); 964 TEST_EXPECTED_RANGE(RANGE_VALID, SrcLimits::max() * static_cast<Src>(-1));
643 TEST_EXPECTED_RANGE(RANGE_OVERFLOW, SrcLimits::infinity()); 965 TEST_EXPECTED_RANGE(RANGE_OVERFLOW, SrcLimits::infinity());
644 TEST_EXPECTED_RANGE(RANGE_UNDERFLOW, SrcLimits::infinity() * -1); 966 TEST_EXPECTED_RANGE(RANGE_UNDERFLOW, SrcLimits::infinity() * -1);
645 TEST_EXPECTED_RANGE(RANGE_INVALID, SrcLimits::quiet_NaN()); 967 TEST_EXPECTED_RANGE(RANGE_INVALID, SrcLimits::quiet_NaN());
646 } else if (numeric_limits<Src>::is_signed) { 968 } else if (numeric_limits<Src>::is_signed) {
647 TEST_EXPECTED_RANGE(RANGE_VALID, static_cast<Src>(-1)); 969 TEST_EXPECTED_RANGE(RANGE_VALID, static_cast<Src>(-1));
648 TEST_EXPECTED_RANGE(RANGE_VALID, SrcLimits::lowest()); 970 TEST_EXPECTED_RANGE(RANGE_VALID, SrcLimits::lowest());
649 } 971 }
650 } 972 }
651 }; 973 };
652 974
653 template <typename Dst, typename Src> 975 template <typename Dst, typename Src>
654 struct TestNumericConversion<Dst, Src, SIGN_PRESERVING_NARROW> { 976 struct TestNumericConversion<Dst, Src, SIGN_PRESERVING_NARROW> {
655 static void Test(const char *dst, const char *src, int line) { 977 static void Test(const char *dst, const char *src, int line) {
656 using SrcLimits = numeric_limits<Src>; 978 using SrcLimits = SaturationDefaultLimits<Src>;
657 using DstLimits = numeric_limits<Dst>; 979 using DstLimits = SaturationDefaultLimits<Dst>;
658 static_assert(SrcLimits::is_signed == DstLimits::is_signed, 980 static_assert(SrcLimits::is_signed == DstLimits::is_signed,
659 "Destination and source sign must be the same"); 981 "Destination and source sign must be the same");
660 static_assert(MaxExponent<Dst>::value <= MaxExponent<Src>::value, 982 static_assert(MaxExponent<Dst>::value <= MaxExponent<Src>::value,
661 "Destination must be narrower than source"); 983 "Destination must be narrower than source");
662 984
663 TestStrictComparison<Dst, Src>(); 985 TestStrictComparison<Dst, Src>();
664 986
665 const CheckedNumeric<Dst> checked_dst; 987 const CheckedNumeric<Dst> checked_dst;
666 TEST_EXPECTED_FAILURE(checked_dst + SrcLimits::max()); 988 TEST_EXPECTED_FAILURE(checked_dst + SrcLimits::max());
667 TEST_EXPECTED_VALUE(1, checked_dst + static_cast<Src>(1)); 989 TEST_EXPECTED_VALUE(1, checked_dst + Src(1));
668 TEST_EXPECTED_FAILURE(checked_dst - SrcLimits::max()); 990 TEST_EXPECTED_FAILURE(checked_dst - SrcLimits::max());
669 991
992 const ClampedNumeric<Dst> clamped_dst;
993 TEST_EXPECTED_VALUE(DstLimits::Overflow(), clamped_dst + SrcLimits::max());
994 TEST_EXPECTED_VALUE(1, clamped_dst + Src(1));
995 TEST_EXPECTED_VALUE(DstLimits::Underflow(), clamped_dst - SrcLimits::max());
996
670 TEST_EXPECTED_RANGE(RANGE_OVERFLOW, SrcLimits::max()); 997 TEST_EXPECTED_RANGE(RANGE_OVERFLOW, SrcLimits::max());
671 TEST_EXPECTED_RANGE(RANGE_VALID, static_cast<Src>(1)); 998 TEST_EXPECTED_RANGE(RANGE_VALID, static_cast<Src>(1));
672 if (SrcLimits::is_iec559) { 999 if (SrcLimits::is_iec559) {
673 TEST_EXPECTED_RANGE(RANGE_UNDERFLOW, SrcLimits::max() * -1); 1000 TEST_EXPECTED_RANGE(RANGE_UNDERFLOW, SrcLimits::max() * -1);
674 TEST_EXPECTED_RANGE(RANGE_VALID, static_cast<Src>(-1)); 1001 TEST_EXPECTED_RANGE(RANGE_VALID, static_cast<Src>(-1));
675 TEST_EXPECTED_RANGE(RANGE_OVERFLOW, SrcLimits::infinity()); 1002 TEST_EXPECTED_RANGE(RANGE_OVERFLOW, SrcLimits::infinity());
676 TEST_EXPECTED_RANGE(RANGE_UNDERFLOW, SrcLimits::infinity() * -1); 1003 TEST_EXPECTED_RANGE(RANGE_UNDERFLOW, SrcLimits::infinity() * -1);
677 TEST_EXPECTED_RANGE(RANGE_INVALID, SrcLimits::quiet_NaN()); 1004 TEST_EXPECTED_RANGE(RANGE_INVALID, SrcLimits::quiet_NaN());
678 if (DstLimits::is_integer) { 1005 if (DstLimits::is_integer) {
679 if (SrcLimits::digits < DstLimits::digits) { 1006 if (SrcLimits::digits < DstLimits::digits) {
680 TEST_EXPECTED_RANGE(RANGE_OVERFLOW, 1007 TEST_EXPECTED_RANGE(RANGE_OVERFLOW,
681 static_cast<Src>(DstLimits::max())); 1008 static_cast<Src>(DstLimits::max()));
682 } else { 1009 } else {
683 TEST_EXPECTED_RANGE(RANGE_VALID, static_cast<Src>(DstLimits::max())); 1010 TEST_EXPECTED_RANGE(RANGE_VALID, static_cast<Src>(DstLimits::max()));
684 } 1011 }
685 TEST_EXPECTED_RANGE( 1012 TEST_EXPECTED_RANGE(
686 RANGE_VALID, 1013 RANGE_VALID,
687 static_cast<Src>(GetMaxConvertibleToFloat<Src, Dst>())); 1014 static_cast<Src>(GetMaxConvertibleToFloat<Src, Dst>()));
688 TEST_EXPECTED_RANGE(RANGE_VALID, static_cast<Src>(DstLimits::lowest())); 1015 TEST_EXPECTED_RANGE(RANGE_VALID, static_cast<Src>(DstLimits::lowest()));
689 } 1016 }
690 } else if (SrcLimits::is_signed) { 1017 } else if (SrcLimits::is_signed) {
691 TEST_EXPECTED_VALUE(-1, checked_dst - static_cast<Src>(1)); 1018 TEST_EXPECTED_VALUE(-1, checked_dst - static_cast<Src>(1));
1019 TEST_EXPECTED_VALUE(-1, clamped_dst - static_cast<Src>(1));
692 TEST_EXPECTED_RANGE(RANGE_UNDERFLOW, SrcLimits::lowest()); 1020 TEST_EXPECTED_RANGE(RANGE_UNDERFLOW, SrcLimits::lowest());
693 TEST_EXPECTED_RANGE(RANGE_VALID, static_cast<Src>(-1)); 1021 TEST_EXPECTED_RANGE(RANGE_VALID, static_cast<Src>(-1));
694 } else { 1022 } else {
695 TEST_EXPECTED_FAILURE(checked_dst - static_cast<Src>(1)); 1023 TEST_EXPECTED_FAILURE(checked_dst - static_cast<Src>(1));
1024 TEST_EXPECTED_VALUE(Dst(0), clamped_dst - static_cast<Src>(1));
696 TEST_EXPECTED_RANGE(RANGE_VALID, SrcLimits::lowest()); 1025 TEST_EXPECTED_RANGE(RANGE_VALID, SrcLimits::lowest());
697 } 1026 }
698 } 1027 }
699 }; 1028 };
700 1029
701 template <typename Dst, typename Src> 1030 template <typename Dst, typename Src>
702 struct TestNumericConversion<Dst, Src, SIGN_TO_UNSIGN_WIDEN_OR_EQUAL> { 1031 struct TestNumericConversion<Dst, Src, SIGN_TO_UNSIGN_WIDEN_OR_EQUAL> {
703 static void Test(const char *dst, const char *src, int line) { 1032 static void Test(const char *dst, const char *src, int line) {
704 using SrcLimits = numeric_limits<Src>; 1033 using SrcLimits = SaturationDefaultLimits<Src>;
705 using DstLimits = numeric_limits<Dst>; 1034 using DstLimits = SaturationDefaultLimits<Dst>;
706 static_assert(MaxExponent<Dst>::value >= MaxExponent<Src>::value, 1035 static_assert(MaxExponent<Dst>::value >= MaxExponent<Src>::value,
707 "Destination must be equal or wider than source."); 1036 "Destination must be equal or wider than source.");
708 static_assert(SrcLimits::is_signed, "Source must be signed"); 1037 static_assert(SrcLimits::is_signed, "Source must be signed");
709 static_assert(!DstLimits::is_signed, "Destination must be unsigned"); 1038 static_assert(!DstLimits::is_signed, "Destination must be unsigned");
710 1039
711 TestStrictComparison<Dst, Src>(); 1040 TestStrictComparison<Dst, Src>();
712 1041
713 const CheckedNumeric<Dst> checked_dst; 1042 const CheckedNumeric<Dst> checked_dst;
714 TEST_EXPECTED_VALUE(SrcLimits::max(), checked_dst + SrcLimits::max()); 1043 TEST_EXPECTED_VALUE(SrcLimits::max(), checked_dst + SrcLimits::max());
715 TEST_EXPECTED_FAILURE(checked_dst + static_cast<Src>(-1)); 1044 TEST_EXPECTED_FAILURE(checked_dst + static_cast<Src>(-1));
1045 TEST_EXPECTED_SUCCESS(checked_dst * static_cast<Src>(-1));
716 TEST_EXPECTED_FAILURE(checked_dst + SrcLimits::lowest()); 1046 TEST_EXPECTED_FAILURE(checked_dst + SrcLimits::lowest());
717 1047
1048 const ClampedNumeric<Dst> clamped_dst;
1049 TEST_EXPECTED_VALUE(SrcLimits::max(), clamped_dst + SrcLimits::max());
1050 TEST_EXPECTED_VALUE(DstLimits::Underflow(),
1051 clamped_dst + static_cast<Src>(-1));
1052 TEST_EXPECTED_VALUE(0, clamped_dst * static_cast<Src>(-1));
1053 TEST_EXPECTED_VALUE(DstLimits::Underflow(),
1054 clamped_dst + SrcLimits::lowest());
1055
718 TEST_EXPECTED_RANGE(RANGE_UNDERFLOW, SrcLimits::lowest()); 1056 TEST_EXPECTED_RANGE(RANGE_UNDERFLOW, SrcLimits::lowest());
719 TEST_EXPECTED_RANGE(RANGE_VALID, SrcLimits::max()); 1057 TEST_EXPECTED_RANGE(RANGE_VALID, SrcLimits::max());
720 TEST_EXPECTED_RANGE(RANGE_VALID, static_cast<Src>(1)); 1058 TEST_EXPECTED_RANGE(RANGE_VALID, static_cast<Src>(1));
721 TEST_EXPECTED_RANGE(RANGE_UNDERFLOW, static_cast<Src>(-1)); 1059 TEST_EXPECTED_RANGE(RANGE_UNDERFLOW, static_cast<Src>(-1));
722 } 1060 }
723 }; 1061 };
724 1062
725 template <typename Dst, typename Src> 1063 template <typename Dst, typename Src>
726 struct TestNumericConversion<Dst, Src, SIGN_TO_UNSIGN_NARROW> { 1064 struct TestNumericConversion<Dst, Src, SIGN_TO_UNSIGN_NARROW> {
727 static void Test(const char *dst, const char *src, int line) { 1065 static void Test(const char *dst, const char *src, int line) {
728 using SrcLimits = numeric_limits<Src>; 1066 using SrcLimits = SaturationDefaultLimits<Src>;
729 using DstLimits = numeric_limits<Dst>; 1067 using DstLimits = SaturationDefaultLimits<Dst>;
730 static_assert(MaxExponent<Dst>::value < MaxExponent<Src>::value, 1068 static_assert(MaxExponent<Dst>::value < MaxExponent<Src>::value,
731 "Destination must be narrower than source."); 1069 "Destination must be narrower than source.");
732 static_assert(SrcLimits::is_signed, "Source must be signed."); 1070 static_assert(SrcLimits::is_signed, "Source must be signed.");
733 static_assert(!DstLimits::is_signed, "Destination must be unsigned."); 1071 static_assert(!DstLimits::is_signed, "Destination must be unsigned.");
734 1072
735 TestStrictComparison<Dst, Src>(); 1073 TestStrictComparison<Dst, Src>();
736 1074
737 const CheckedNumeric<Dst> checked_dst; 1075 const CheckedNumeric<Dst> checked_dst;
738 TEST_EXPECTED_VALUE(1, checked_dst + static_cast<Src>(1)); 1076 TEST_EXPECTED_VALUE(1, checked_dst + static_cast<Src>(1));
739 TEST_EXPECTED_FAILURE(checked_dst + SrcLimits::max()); 1077 TEST_EXPECTED_FAILURE(checked_dst + SrcLimits::max());
740 TEST_EXPECTED_FAILURE(checked_dst + static_cast<Src>(-1)); 1078 TEST_EXPECTED_FAILURE(checked_dst + static_cast<Src>(-1));
741 TEST_EXPECTED_FAILURE(checked_dst + SrcLimits::lowest()); 1079 TEST_EXPECTED_FAILURE(checked_dst + SrcLimits::lowest());
742 1080
1081 const ClampedNumeric<Dst> clamped_dst;
1082 TEST_EXPECTED_VALUE(1, clamped_dst + static_cast<Src>(1));
1083 TEST_EXPECTED_VALUE(DstLimits::Overflow(), clamped_dst + SrcLimits::max());
1084 TEST_EXPECTED_VALUE(DstLimits::Underflow(),
1085 clamped_dst + static_cast<Src>(-1));
1086 TEST_EXPECTED_VALUE(DstLimits::Underflow(),
1087 clamped_dst + SrcLimits::lowest());
1088
743 TEST_EXPECTED_RANGE(RANGE_OVERFLOW, SrcLimits::max()); 1089 TEST_EXPECTED_RANGE(RANGE_OVERFLOW, SrcLimits::max());
744 TEST_EXPECTED_RANGE(RANGE_VALID, static_cast<Src>(1)); 1090 TEST_EXPECTED_RANGE(RANGE_VALID, static_cast<Src>(1));
745 TEST_EXPECTED_RANGE(RANGE_UNDERFLOW, static_cast<Src>(-1)); 1091 TEST_EXPECTED_RANGE(RANGE_UNDERFLOW, static_cast<Src>(-1));
746 1092
747 // Additional saturation tests. 1093 // Additional saturation tests.
748 EXPECT_EQ(DstLimits::max(), saturated_cast<Dst>(SrcLimits::max())) << src; 1094 EXPECT_EQ(DstLimits::max(), saturated_cast<Dst>(SrcLimits::max()));
749 EXPECT_EQ(DstLimits::lowest(), saturated_cast<Dst>(SrcLimits::lowest())); 1095 EXPECT_EQ(DstLimits::lowest(), saturated_cast<Dst>(SrcLimits::lowest()));
750 1096
751 if (SrcLimits::is_iec559) { 1097 if (SrcLimits::is_iec559) {
752 EXPECT_EQ(Dst(0), saturated_cast<Dst>(SrcLimits::quiet_NaN())); 1098 EXPECT_EQ(Dst(0), saturated_cast<Dst>(SrcLimits::quiet_NaN()));
753 1099
754 TEST_EXPECTED_RANGE(RANGE_UNDERFLOW, SrcLimits::max() * -1); 1100 TEST_EXPECTED_RANGE(RANGE_UNDERFLOW, SrcLimits::max() * -1);
755 TEST_EXPECTED_RANGE(RANGE_OVERFLOW, SrcLimits::infinity()); 1101 TEST_EXPECTED_RANGE(RANGE_OVERFLOW, SrcLimits::infinity());
756 TEST_EXPECTED_RANGE(RANGE_UNDERFLOW, SrcLimits::infinity() * -1); 1102 TEST_EXPECTED_RANGE(RANGE_UNDERFLOW, SrcLimits::infinity() * -1);
757 TEST_EXPECTED_RANGE(RANGE_INVALID, SrcLimits::quiet_NaN()); 1103 TEST_EXPECTED_RANGE(RANGE_INVALID, SrcLimits::quiet_NaN());
758 if (DstLimits::is_integer) { 1104 if (DstLimits::is_integer) {
(...skipping 10 matching lines...) Expand all
769 } 1115 }
770 } else { 1116 } else {
771 TEST_EXPECTED_RANGE(RANGE_UNDERFLOW, SrcLimits::lowest()); 1117 TEST_EXPECTED_RANGE(RANGE_UNDERFLOW, SrcLimits::lowest());
772 } 1118 }
773 } 1119 }
774 }; 1120 };
775 1121
776 template <typename Dst, typename Src> 1122 template <typename Dst, typename Src>
777 struct TestNumericConversion<Dst, Src, UNSIGN_TO_SIGN_NARROW_OR_EQUAL> { 1123 struct TestNumericConversion<Dst, Src, UNSIGN_TO_SIGN_NARROW_OR_EQUAL> {
778 static void Test(const char *dst, const char *src, int line) { 1124 static void Test(const char *dst, const char *src, int line) {
779 using SrcLimits = numeric_limits<Src>; 1125 using SrcLimits = SaturationDefaultLimits<Src>;
780 using DstLimits = numeric_limits<Dst>; 1126 using DstLimits = SaturationDefaultLimits<Dst>;
781 static_assert(MaxExponent<Dst>::value <= MaxExponent<Src>::value, 1127 static_assert(MaxExponent<Dst>::value <= MaxExponent<Src>::value,
782 "Destination must be narrower or equal to source."); 1128 "Destination must be narrower or equal to source.");
783 static_assert(!SrcLimits::is_signed, "Source must be unsigned."); 1129 static_assert(!SrcLimits::is_signed, "Source must be unsigned.");
784 static_assert(DstLimits::is_signed, "Destination must be signed."); 1130 static_assert(DstLimits::is_signed, "Destination must be signed.");
785 1131
786 TestStrictComparison<Dst, Src>(); 1132 TestStrictComparison<Dst, Src>();
787 1133
788 const CheckedNumeric<Dst> checked_dst; 1134 const CheckedNumeric<Dst> checked_dst;
789 TEST_EXPECTED_VALUE(1, checked_dst + static_cast<Src>(1)); 1135 TEST_EXPECTED_VALUE(1, checked_dst + static_cast<Src>(1));
790 TEST_EXPECTED_FAILURE(checked_dst + SrcLimits::max()); 1136 TEST_EXPECTED_FAILURE(checked_dst + SrcLimits::max());
791 TEST_EXPECTED_VALUE(SrcLimits::lowest(), checked_dst + SrcLimits::lowest()); 1137 TEST_EXPECTED_VALUE(SrcLimits::lowest(), checked_dst + SrcLimits::lowest());
792 1138
1139 const ClampedNumeric<Dst> clamped_dst;
1140 TEST_EXPECTED_VALUE(1, clamped_dst + static_cast<Src>(1));
1141 TEST_EXPECTED_VALUE(DstLimits::Overflow(), clamped_dst + SrcLimits::max());
1142 TEST_EXPECTED_VALUE(SrcLimits::lowest(), clamped_dst + SrcLimits::lowest());
1143
793 TEST_EXPECTED_RANGE(RANGE_VALID, SrcLimits::lowest()); 1144 TEST_EXPECTED_RANGE(RANGE_VALID, SrcLimits::lowest());
794 TEST_EXPECTED_RANGE(RANGE_OVERFLOW, SrcLimits::max()); 1145 TEST_EXPECTED_RANGE(RANGE_OVERFLOW, SrcLimits::max());
795 TEST_EXPECTED_RANGE(RANGE_VALID, static_cast<Src>(1)); 1146 TEST_EXPECTED_RANGE(RANGE_VALID, static_cast<Src>(1));
796 1147
797 // Additional saturation tests. 1148 // Additional saturation tests.
798 EXPECT_EQ(DstLimits::max(), saturated_cast<Dst>(SrcLimits::max())); 1149 EXPECT_EQ(DstLimits::max(), saturated_cast<Dst>(SrcLimits::max()));
799 EXPECT_EQ(Dst(0), saturated_cast<Dst>(SrcLimits::lowest())); 1150 EXPECT_EQ(Dst(0), saturated_cast<Dst>(SrcLimits::lowest()));
800 } 1151 }
801 }; 1152 };
802 1153
(...skipping 357 matching lines...) Expand 10 before | Expand all | Expand 10 after
1160 EXPECT_TRUE(too_large.IsValid()); 1511 EXPECT_TRUE(too_large.IsValid());
1161 too_large += d; 1512 too_large += d;
1162 EXPECT_FALSE(too_large.IsValid()); 1513 EXPECT_FALSE(too_large.IsValid());
1163 too_large -= d; 1514 too_large -= d;
1164 EXPECT_FALSE(too_large.IsValid()); 1515 EXPECT_FALSE(too_large.IsValid());
1165 too_large /= d; 1516 too_large /= d;
1166 EXPECT_FALSE(too_large.IsValid()); 1517 EXPECT_FALSE(too_large.IsValid());
1167 } 1518 }
1168 1519
1169 TEST(SafeNumerics, VariadicNumericOperations) { 1520 TEST(SafeNumerics, VariadicNumericOperations) {
1170 auto a = CheckAdd(1, 2UL, MakeCheckedNum(3LL), 4).ValueOrDie(); 1521 { // Synthetic scope to avoid variable naming collisions.
1171 EXPECT_EQ(static_cast<decltype(a)::type>(10), a); 1522 auto a = CheckAdd(1, 2UL, MakeCheckedNum(3LL), 4).ValueOrDie();
1172 auto b = CheckSub(MakeCheckedNum(20.0), 2UL, 4).ValueOrDie(); 1523 EXPECT_EQ(static_cast<decltype(a)::type>(10), a);
1173 EXPECT_EQ(static_cast<decltype(b)::type>(14.0), b); 1524 auto b = CheckSub(MakeCheckedNum(20.0), 2UL, 4).ValueOrDie();
1174 auto c = CheckMul(20.0, MakeCheckedNum(1), 5, 3UL).ValueOrDie(); 1525 EXPECT_EQ(static_cast<decltype(b)::type>(14.0), b);
1175 EXPECT_EQ(static_cast<decltype(c)::type>(300.0), c); 1526 auto c = CheckMul(20.0, MakeCheckedNum(1), 5, 3UL).ValueOrDie();
1176 auto d = CheckDiv(20.0, 2.0, MakeCheckedNum(5LL), -4).ValueOrDie(); 1527 EXPECT_EQ(static_cast<decltype(c)::type>(300.0), c);
1177 EXPECT_EQ(static_cast<decltype(d)::type>(-.5), d); 1528 auto d = CheckDiv(20.0, 2.0, MakeCheckedNum(5LL), -4).ValueOrDie();
1178 auto e = CheckMod(MakeCheckedNum(20), 3).ValueOrDie(); 1529 EXPECT_EQ(static_cast<decltype(d)::type>(-.5), d);
1179 EXPECT_EQ(static_cast<decltype(e)::type>(2), e); 1530 auto e = CheckMod(MakeCheckedNum(20), 3).ValueOrDie();
1180 auto f = CheckLsh(1, MakeCheckedNum(2)).ValueOrDie(); 1531 EXPECT_EQ(static_cast<decltype(e)::type>(2), e);
1181 EXPECT_EQ(static_cast<decltype(f)::type>(4), f); 1532 auto f = CheckLsh(1, MakeCheckedNum(2)).ValueOrDie();
1182 auto g = CheckRsh(4, MakeCheckedNum(2)).ValueOrDie(); 1533 EXPECT_EQ(static_cast<decltype(f)::type>(4), f);
1183 EXPECT_EQ(static_cast<decltype(g)::type>(1), g); 1534 auto g = CheckRsh(4, MakeCheckedNum(2)).ValueOrDie();
1184 auto h = CheckRsh(CheckAdd(1, 1, 1, 1), CheckSub(4, 2)).ValueOrDie(); 1535 EXPECT_EQ(static_cast<decltype(g)::type>(1), g);
1185 EXPECT_EQ(static_cast<decltype(h)::type>(1), h); 1536 auto h = CheckRsh(CheckAdd(1, 1, 1, 1), CheckSub(4, 2)).ValueOrDie();
1537 EXPECT_EQ(static_cast<decltype(h)::type>(1), h);
1538 }
1539
1540 {
1541 auto a = ClampAdd(1, 2UL, MakeClampedNum(3LL), 4);
1542 EXPECT_EQ(static_cast<decltype(a)::type>(10), a);
1543 auto b = ClampSub(MakeClampedNum(20.0), 2UL, 4);
1544 EXPECT_EQ(static_cast<decltype(b)::type>(14.0), b);
1545 auto c = ClampMul(20.0, MakeClampedNum(1), 5, 3UL);
1546 EXPECT_EQ(static_cast<decltype(c)::type>(300.0), c);
1547 auto d = ClampDiv(20.0, 2.0, MakeClampedNum(5LL), -4);
1548 EXPECT_EQ(static_cast<decltype(d)::type>(-.5), d);
1549 auto e = ClampMod(MakeClampedNum(20), 3);
1550 EXPECT_EQ(static_cast<decltype(e)::type>(2), e);
1551 auto f = ClampLsh(1, MakeClampedNum(2U));
dcheng 2017/06/28 07:25:06 How come this needs an explicit U while the checke
jschuh 2017/06/28 12:32:38 Conscious API decision. Negative shift is always w
1552 EXPECT_EQ(static_cast<decltype(f)::type>(4), f);
1553 auto g = ClampRsh(4, MakeClampedNum(2U));
1554 EXPECT_EQ(static_cast<decltype(g)::type>(1), g);
1555 auto h = ClampRsh(ClampAdd(1, 1, 1, 1), ClampSub(4U, 2));
1556 EXPECT_EQ(static_cast<decltype(h)::type>(1), h);
1557 }
1186 } 1558 }
OLDNEW
« base/numerics/safe_math_shared_impl.h ('K') | « base/numerics/safe_math_shared_impl.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698