| OLD | NEW |
| 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 |
| (...skipping 204 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 215 TEST_EXPECTED_FAILURE(CheckedNumeric<Dst>(0) << (sizeof(Dst) * CHAR_BIT)); | 215 TEST_EXPECTED_FAILURE(CheckedNumeric<Dst>(0) << (sizeof(Dst) * CHAR_BIT)); |
| 216 TEST_EXPECTED_FAILURE(CheckedNumeric<Dst>(DstLimits::max()) << 1); | 216 TEST_EXPECTED_FAILURE(CheckedNumeric<Dst>(DstLimits::max()) << 1); |
| 217 TEST_EXPECTED_VALUE(static_cast<Dst>(1) << (sizeof(Dst) * CHAR_BIT - 1), | 217 TEST_EXPECTED_VALUE(static_cast<Dst>(1) << (sizeof(Dst) * CHAR_BIT - 1), |
| 218 CheckedNumeric<Dst>(1) << (sizeof(Dst) * CHAR_BIT - 1)); | 218 CheckedNumeric<Dst>(1) << (sizeof(Dst) * CHAR_BIT - 1)); |
| 219 TEST_EXPECTED_VALUE(1, CheckedNumeric<Dst>(1) << 0); | 219 TEST_EXPECTED_VALUE(1, CheckedNumeric<Dst>(1) << 0); |
| 220 TEST_EXPECTED_VALUE(2, CheckedNumeric<Dst>(1) << 1); | 220 TEST_EXPECTED_VALUE(2, CheckedNumeric<Dst>(1) << 1); |
| 221 TEST_EXPECTED_FAILURE(CheckedNumeric<Dst>(1) >> (sizeof(Dst) * CHAR_BIT)); | 221 TEST_EXPECTED_FAILURE(CheckedNumeric<Dst>(1) >> (sizeof(Dst) * CHAR_BIT)); |
| 222 TEST_EXPECTED_VALUE(0, | 222 TEST_EXPECTED_VALUE(0, |
| 223 CheckedNumeric<Dst>(1) >> (sizeof(Dst) * CHAR_BIT - 1)); | 223 CheckedNumeric<Dst>(1) >> (sizeof(Dst) * CHAR_BIT - 1)); |
| 224 TEST_EXPECTED_FAILURE(CheckedNumeric<Dst>(1) >> negative_one); | 224 TEST_EXPECTED_FAILURE(CheckedNumeric<Dst>(1) >> negative_one); |
| 225 TEST_EXPECTED_VALUE(1, CheckedNumeric<Dst>(1) & static_cast<Dst>(1)); | 225 TEST_EXPECTED_VALUE(1, CheckedNumeric<Dst>(1) & 1); |
| 226 TEST_EXPECTED_VALUE(0, CheckedNumeric<Dst>(1) & static_cast<Dst>(0)); | 226 TEST_EXPECTED_VALUE(0, CheckedNumeric<Dst>(1) & 0); |
| 227 TEST_EXPECTED_VALUE(0, CheckedNumeric<Dst>(0) & static_cast<Dst>(1)); | 227 TEST_EXPECTED_VALUE(0, CheckedNumeric<Dst>(0) & 1); |
| 228 TEST_EXPECTED_VALUE(0, CheckedNumeric<Dst>(1) & static_cast<Dst>(0)); | 228 TEST_EXPECTED_VALUE(0, CheckedNumeric<Dst>(1) & 0); |
| 229 TEST_EXPECTED_VALUE(1, CheckedNumeric<Dst>(1) | static_cast<Dst>(1)); | 229 TEST_EXPECTED_VALUE(std::numeric_limits<Dst>::max(), |
| 230 TEST_EXPECTED_VALUE(1, CheckedNumeric<Dst>(1) | static_cast<Dst>(0)); | 230 CheckNum(DstLimits::max()) & -1); |
| 231 TEST_EXPECTED_VALUE(1, CheckedNumeric<Dst>(0) | static_cast<Dst>(1)); | 231 TEST_EXPECTED_VALUE(1, CheckedNumeric<Dst>(1) | 1); |
| 232 TEST_EXPECTED_VALUE(0, CheckedNumeric<Dst>(0) | static_cast<Dst>(0)); | 232 TEST_EXPECTED_VALUE(1, CheckedNumeric<Dst>(1) | 0); |
| 233 TEST_EXPECTED_VALUE(0, CheckedNumeric<Dst>(1) ^ static_cast<Dst>(1)); | 233 TEST_EXPECTED_VALUE(1, CheckedNumeric<Dst>(0) | 1); |
| 234 TEST_EXPECTED_VALUE(1, CheckedNumeric<Dst>(1) ^ static_cast<Dst>(0)); | 234 TEST_EXPECTED_VALUE(0, CheckedNumeric<Dst>(0) | 0); |
| 235 TEST_EXPECTED_VALUE(1, CheckedNumeric<Dst>(0) ^ static_cast<Dst>(1)); | 235 TEST_EXPECTED_VALUE(std::numeric_limits<Dst>::max(), |
| 236 TEST_EXPECTED_VALUE(0, CheckedNumeric<Dst>(0) ^ static_cast<Dst>(0)); | 236 CheckedNumeric<Dst>(0) | static_cast<Dst>(-1)); |
| 237 TEST_EXPECTED_VALUE(0, CheckedNumeric<Dst>(1) ^ 1); |
| 238 TEST_EXPECTED_VALUE(1, CheckedNumeric<Dst>(1) ^ 0); |
| 239 TEST_EXPECTED_VALUE(1, CheckedNumeric<Dst>(0) ^ 1); |
| 240 TEST_EXPECTED_VALUE(0, CheckedNumeric<Dst>(0) ^ 0); |
| 241 TEST_EXPECTED_VALUE(std::numeric_limits<Dst>::max(), |
| 242 CheckedNumeric<Dst>(0) ^ static_cast<Dst>(-1)); |
| 237 TEST_EXPECTED_VALUE(DstLimits::max(), ~CheckedNumeric<Dst>(0)); | 243 TEST_EXPECTED_VALUE(DstLimits::max(), ~CheckedNumeric<Dst>(0)); |
| 238 } | 244 } |
| 239 | 245 |
| 240 // Floating point arithmetic. | 246 // Floating point arithmetic. |
| 241 template <typename Dst> | 247 template <typename Dst> |
| 242 void TestSpecializedArithmetic( | 248 void TestSpecializedArithmetic( |
| 243 const char* dst, | 249 const char* dst, |
| 244 int line, | 250 int line, |
| 245 typename std::enable_if<numeric_limits<Dst>::is_iec559, int>::type = 0) { | 251 typename std::enable_if<numeric_limits<Dst>::is_iec559, int>::type = 0) { |
| 246 typedef numeric_limits<Dst> DstLimits; | 252 typedef numeric_limits<Dst> DstLimits; |
| (...skipping 652 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 899 EXPECT_EQ(static_cast<decltype(d)>(-.5), d); | 905 EXPECT_EQ(static_cast<decltype(d)>(-.5), d); |
| 900 auto e = CheckMod(CheckNum(20), 3).ValueOrDie(); | 906 auto e = CheckMod(CheckNum(20), 3).ValueOrDie(); |
| 901 EXPECT_EQ(static_cast<decltype(e)>(2), e); | 907 EXPECT_EQ(static_cast<decltype(e)>(2), e); |
| 902 auto f = CheckLsh(1, CheckNum(2)).ValueOrDie(); | 908 auto f = CheckLsh(1, CheckNum(2)).ValueOrDie(); |
| 903 EXPECT_EQ(static_cast<decltype(f)>(4), f); | 909 EXPECT_EQ(static_cast<decltype(f)>(4), f); |
| 904 auto g = CheckRsh(4, CheckNum(2)).ValueOrDie(); | 910 auto g = CheckRsh(4, CheckNum(2)).ValueOrDie(); |
| 905 EXPECT_EQ(static_cast<decltype(g)>(1), g); | 911 EXPECT_EQ(static_cast<decltype(g)>(1), g); |
| 906 auto h = CheckRsh(CheckAdd(1, 1, 1, 1), CheckSub(4, 2)).ValueOrDie(); | 912 auto h = CheckRsh(CheckAdd(1, 1, 1, 1), CheckSub(4, 2)).ValueOrDie(); |
| 907 EXPECT_EQ(static_cast<decltype(h)>(1), h); | 913 EXPECT_EQ(static_cast<decltype(h)>(1), h); |
| 908 } | 914 } |
| OLD | NEW |