| 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 88 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|    99  |    99  | 
|   100 // Helper macros to wrap displaying the conversion types and line numbers. |   100 // Helper macros to wrap displaying the conversion types and line numbers. | 
|   101 #define TEST_EXPECTED_VALIDITY(expected, actual)                           \ |   101 #define TEST_EXPECTED_VALIDITY(expected, actual)                           \ | 
|   102   EXPECT_EQ(expected, (actual).template Cast<Dst>().IsValid())             \ |   102   EXPECT_EQ(expected, (actual).template Cast<Dst>().IsValid())             \ | 
|   103       << "Result test: Value " << GetNumericValueForTest(actual) << " as " \ |   103       << "Result test: Value " << GetNumericValueForTest(actual) << " as " \ | 
|   104       << dst << " on line " << line |   104       << dst << " on line " << line | 
|   105  |   105  | 
|   106 #define TEST_EXPECTED_SUCCESS(actual) TEST_EXPECTED_VALIDITY(true, actual) |   106 #define TEST_EXPECTED_SUCCESS(actual) TEST_EXPECTED_VALIDITY(true, actual) | 
|   107 #define TEST_EXPECTED_FAILURE(actual) TEST_EXPECTED_VALIDITY(false, actual) |   107 #define TEST_EXPECTED_FAILURE(actual) TEST_EXPECTED_VALIDITY(false, actual) | 
|   108  |   108  | 
|   109 #define TEST_EXPECTED_VALUE(expected, actual)                              \ |   109 // We have to handle promotions, so infer the underlying type below from actual. | 
|   110   EXPECT_EQ(static_cast<Dst>(expected),                                    \ |   110 #define TEST_EXPECTED_VALUE(expected, actual)                               \ | 
|   111             ((actual)                                                      \ |   111   EXPECT_EQ(static_cast<typename std::decay<decltype(actual)>::type::type>( \ | 
|   112                  .template Cast<Dst>()                                     \ |   112                 expected),                                                  \ | 
|   113                  .template ValueOrDie<Dst, LogOnFailure>()))               \ |   113             ((actual)                                                       \ | 
|   114       << "Result test: Value " << GetNumericValueForTest(actual) << " as " \ |   114                  .template ValueOrDie<                                      \ | 
 |   115                      typename std::decay<decltype(actual)>::type::type,     \ | 
 |   116                      LogOnFailure>()))                                      \ | 
 |   117       << "Result test: Value " << GetNumericValueForTest(actual) << " as "  \ | 
|   115       << dst << " on line " << line |   118       << dst << " on line " << line | 
|   116  |   119  | 
|   117 // Test the simple pointer arithmetic overrides. |   120 // Test the simple pointer arithmetic overrides. | 
|   118 template <typename Dst> |   121 template <typename Dst> | 
|   119 void TestStrictPointerMath() { |   122 void TestStrictPointerMath() { | 
|   120   Dst dummy_value = 0; |   123   Dst dummy_value = 0; | 
|   121   Dst* dummy_ptr = &dummy_value; |   124   Dst* dummy_ptr = &dummy_value; | 
|   122   static const Dst kDummyOffset = 2;  // Don't want to go too far. |   125   static const Dst kDummyOffset = 2;  // Don't want to go too far. | 
|   123   EXPECT_EQ(dummy_ptr + kDummyOffset, |   126   EXPECT_EQ(dummy_ptr + kDummyOffset, | 
|   124             dummy_ptr + StrictNumeric<Dst>(kDummyOffset)); |   127             dummy_ptr + StrictNumeric<Dst>(kDummyOffset)); | 
| (...skipping 11 matching lines...) Expand all  Loading... | 
|   136 static void TestSpecializedArithmetic( |   139 static void TestSpecializedArithmetic( | 
|   137     const char* dst, |   140     const char* dst, | 
|   138     int line, |   141     int line, | 
|   139     typename std::enable_if<numeric_limits<Dst>::is_integer && |   142     typename std::enable_if<numeric_limits<Dst>::is_integer && | 
|   140                                 numeric_limits<Dst>::is_signed, |   143                                 numeric_limits<Dst>::is_signed, | 
|   141                             int>::type = 0) { |   144                             int>::type = 0) { | 
|   142   using DstLimits = numeric_limits<Dst>; |   145   using DstLimits = numeric_limits<Dst>; | 
|   143   TEST_EXPECTED_FAILURE(-CheckedNumeric<Dst>(DstLimits::lowest())); |   146   TEST_EXPECTED_FAILURE(-CheckedNumeric<Dst>(DstLimits::lowest())); | 
|   144   TEST_EXPECTED_FAILURE(CheckedNumeric<Dst>(DstLimits::lowest()).Abs()); |   147   TEST_EXPECTED_FAILURE(CheckedNumeric<Dst>(DstLimits::lowest()).Abs()); | 
|   145   TEST_EXPECTED_VALUE(1, CheckedNumeric<Dst>(-1).Abs()); |   148   TEST_EXPECTED_VALUE(1, CheckedNumeric<Dst>(-1).Abs()); | 
 |   149   TEST_EXPECTED_VALUE(DstLimits::max(), | 
 |   150                       MakeCheckedNum(-DstLimits::max()).Abs()); | 
|   146  |   151  | 
|   147   TEST_EXPECTED_SUCCESS(CheckedNumeric<Dst>(DstLimits::max()) + -1); |   152   TEST_EXPECTED_SUCCESS(CheckedNumeric<Dst>(DstLimits::max()) + -1); | 
|   148   TEST_EXPECTED_FAILURE(CheckedNumeric<Dst>(DstLimits::lowest()) + -1); |   153   TEST_EXPECTED_FAILURE(CheckedNumeric<Dst>(DstLimits::lowest()) + -1); | 
|   149   TEST_EXPECTED_FAILURE(CheckedNumeric<Dst>(DstLimits::lowest()) + |   154   TEST_EXPECTED_FAILURE(CheckedNumeric<Dst>(DstLimits::lowest()) + | 
|   150                         DstLimits::lowest()); |   155                         DstLimits::lowest()); | 
|   151  |   156  | 
|   152   TEST_EXPECTED_FAILURE(CheckedNumeric<Dst>(DstLimits::lowest()) - 1); |   157   TEST_EXPECTED_FAILURE(CheckedNumeric<Dst>(DstLimits::lowest()) - 1); | 
|   153   TEST_EXPECTED_SUCCESS(CheckedNumeric<Dst>(DstLimits::lowest()) - -1); |   158   TEST_EXPECTED_SUCCESS(CheckedNumeric<Dst>(DstLimits::lowest()) - -1); | 
|   154   TEST_EXPECTED_FAILURE(CheckedNumeric<Dst>(DstLimits::max()) - |   159   TEST_EXPECTED_FAILURE(CheckedNumeric<Dst>(DstLimits::max()) - | 
|   155                         DstLimits::lowest()); |   160                         DstLimits::lowest()); | 
|   156   TEST_EXPECTED_FAILURE(CheckedNumeric<Dst>(DstLimits::lowest()) - |   161   TEST_EXPECTED_FAILURE(CheckedNumeric<Dst>(DstLimits::lowest()) - | 
|   157                         DstLimits::max()); |   162                         DstLimits::max()); | 
|   158  |   163  | 
|   159   TEST_EXPECTED_FAILURE(CheckedNumeric<Dst>(DstLimits::lowest()) * 2); |   164   TEST_EXPECTED_FAILURE(CheckedNumeric<Dst>(DstLimits::lowest()) * 2); | 
|   160  |   165  | 
|   161   TEST_EXPECTED_FAILURE(CheckedNumeric<Dst>(DstLimits::lowest()) / -1); |   166   TEST_EXPECTED_FAILURE(CheckedNumeric<Dst>(DstLimits::lowest()) / -1); | 
|   162   TEST_EXPECTED_VALUE(0, CheckedNumeric<Dst>(-1) / 2); |   167   TEST_EXPECTED_VALUE(0, CheckedNumeric<Dst>(-1) / 2); | 
|   163   TEST_EXPECTED_FAILURE(CheckedNumeric<Dst>(DstLimits::lowest()) * -1); |   168   TEST_EXPECTED_FAILURE(CheckedNumeric<Dst>(DstLimits::lowest()) * -1); | 
 |   169   TEST_EXPECTED_VALUE(DstLimits::lowest(), | 
 |   170                       MakeCheckedNum(DstLimits::lowest()).UnsignedAbs()); | 
 |   171   TEST_EXPECTED_VALUE(DstLimits::max(), | 
 |   172                       MakeCheckedNum(DstLimits::max()).UnsignedAbs()); | 
 |   173   TEST_EXPECTED_VALUE(0, CheckedNumeric<Dst>(0).UnsignedAbs()); | 
 |   174   TEST_EXPECTED_VALUE(1, CheckedNumeric<Dst>(1).UnsignedAbs()); | 
 |   175   TEST_EXPECTED_VALUE(1, CheckedNumeric<Dst>(-1).UnsignedAbs()); | 
|   164  |   176  | 
|   165   // Modulus is legal only for integers. |   177   // Modulus is legal only for integers. | 
|   166   TEST_EXPECTED_VALUE(0, CheckedNumeric<Dst>() % 1); |   178   TEST_EXPECTED_VALUE(0, CheckedNumeric<Dst>() % 1); | 
|   167   TEST_EXPECTED_VALUE(0, CheckedNumeric<Dst>(1) % 1); |   179   TEST_EXPECTED_VALUE(0, CheckedNumeric<Dst>(1) % 1); | 
|   168   TEST_EXPECTED_VALUE(-1, CheckedNumeric<Dst>(-1) % 2); |   180   TEST_EXPECTED_VALUE(-1, CheckedNumeric<Dst>(-1) % 2); | 
|   169   TEST_EXPECTED_FAILURE(CheckedNumeric<Dst>(-1) % -2); |   181   TEST_EXPECTED_FAILURE(CheckedNumeric<Dst>(-1) % -2); | 
|   170   TEST_EXPECTED_VALUE(0, CheckedNumeric<Dst>(DstLimits::lowest()) % 2); |   182   TEST_EXPECTED_VALUE(0, CheckedNumeric<Dst>(DstLimits::lowest()) % 2); | 
|   171   TEST_EXPECTED_VALUE(1, CheckedNumeric<Dst>(DstLimits::max()) % 2); |   183   TEST_EXPECTED_VALUE(1, CheckedNumeric<Dst>(DstLimits::max()) % 2); | 
|   172   // Test all the different modulus combinations. |   184   // Test all the different modulus combinations. | 
|   173   TEST_EXPECTED_VALUE(0, CheckedNumeric<Dst>(1) % CheckedNumeric<Dst>(1)); |   185   TEST_EXPECTED_VALUE(0, CheckedNumeric<Dst>(1) % CheckedNumeric<Dst>(1)); | 
| (...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|   214   TEST_EXPECTED_SUCCESS(CheckedNumeric<Dst>(DstLimits::lowest()).Abs()); |   226   TEST_EXPECTED_SUCCESS(CheckedNumeric<Dst>(DstLimits::lowest()).Abs()); | 
|   215   TEST_EXPECTED_FAILURE(CheckedNumeric<Dst>(DstLimits::lowest()) + -1); |   227   TEST_EXPECTED_FAILURE(CheckedNumeric<Dst>(DstLimits::lowest()) + -1); | 
|   216   TEST_EXPECTED_FAILURE(CheckedNumeric<Dst>(DstLimits::lowest()) - 1); |   228   TEST_EXPECTED_FAILURE(CheckedNumeric<Dst>(DstLimits::lowest()) - 1); | 
|   217   TEST_EXPECTED_VALUE(0, CheckedNumeric<Dst>(DstLimits::lowest()) * 2); |   229   TEST_EXPECTED_VALUE(0, CheckedNumeric<Dst>(DstLimits::lowest()) * 2); | 
|   218   TEST_EXPECTED_VALUE(0, CheckedNumeric<Dst>(1) / 2); |   230   TEST_EXPECTED_VALUE(0, CheckedNumeric<Dst>(1) / 2); | 
|   219   TEST_EXPECTED_SUCCESS(CheckedNumeric<Dst>(DstLimits::lowest()).UnsignedAbs()); |   231   TEST_EXPECTED_SUCCESS(CheckedNumeric<Dst>(DstLimits::lowest()).UnsignedAbs()); | 
|   220   TEST_EXPECTED_SUCCESS( |   232   TEST_EXPECTED_SUCCESS( | 
|   221       CheckedNumeric<typename std::make_signed<Dst>::type>( |   233       CheckedNumeric<typename std::make_signed<Dst>::type>( | 
|   222           std::numeric_limits<typename std::make_signed<Dst>::type>::lowest()) |   234           std::numeric_limits<typename std::make_signed<Dst>::type>::lowest()) | 
|   223           .UnsignedAbs()); |   235           .UnsignedAbs()); | 
 |   236   TEST_EXPECTED_VALUE(DstLimits::lowest(), | 
 |   237                       MakeCheckedNum(DstLimits::lowest()).UnsignedAbs()); | 
 |   238   TEST_EXPECTED_VALUE(DstLimits::max(), | 
 |   239                       MakeCheckedNum(DstLimits::max()).UnsignedAbs()); | 
 |   240   TEST_EXPECTED_VALUE(0, CheckedNumeric<Dst>(0).UnsignedAbs()); | 
 |   241   TEST_EXPECTED_VALUE(1, CheckedNumeric<Dst>(1).UnsignedAbs()); | 
|   224  |   242  | 
|   225   // Modulus is legal only for integers. |   243   // Modulus is legal only for integers. | 
|   226   TEST_EXPECTED_VALUE(0, CheckedNumeric<Dst>() % 1); |   244   TEST_EXPECTED_VALUE(0, CheckedNumeric<Dst>() % 1); | 
|   227   TEST_EXPECTED_VALUE(0, CheckedNumeric<Dst>(1) % 1); |   245   TEST_EXPECTED_VALUE(0, CheckedNumeric<Dst>(1) % 1); | 
|   228   TEST_EXPECTED_VALUE(1, CheckedNumeric<Dst>(1) % 2); |   246   TEST_EXPECTED_VALUE(1, CheckedNumeric<Dst>(1) % 2); | 
|   229   TEST_EXPECTED_VALUE(0, CheckedNumeric<Dst>(DstLimits::lowest()) % 2); |   247   TEST_EXPECTED_VALUE(0, CheckedNumeric<Dst>(DstLimits::lowest()) % 2); | 
|   230   TEST_EXPECTED_VALUE(1, CheckedNumeric<Dst>(DstLimits::max()) % 2); |   248   TEST_EXPECTED_VALUE(1, CheckedNumeric<Dst>(DstLimits::max()) % 2); | 
|   231   // Test all the different modulus combinations. |   249   // Test all the different modulus combinations. | 
|   232   TEST_EXPECTED_VALUE(0, CheckedNumeric<Dst>(1) % CheckedNumeric<Dst>(1)); |   250   TEST_EXPECTED_VALUE(0, CheckedNumeric<Dst>(1) % CheckedNumeric<Dst>(1)); | 
|   233   TEST_EXPECTED_VALUE(0, 1 % CheckedNumeric<Dst>(1)); |   251   TEST_EXPECTED_VALUE(0, 1 % CheckedNumeric<Dst>(1)); | 
| (...skipping 804 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|  1038   EXPECT_EQ(static_cast<decltype(d)::type>(-.5), d); |  1056   EXPECT_EQ(static_cast<decltype(d)::type>(-.5), d); | 
|  1039   auto e = CheckMod(MakeCheckedNum(20), 3).ValueOrDie(); |  1057   auto e = CheckMod(MakeCheckedNum(20), 3).ValueOrDie(); | 
|  1040   EXPECT_EQ(static_cast<decltype(e)::type>(2), e); |  1058   EXPECT_EQ(static_cast<decltype(e)::type>(2), e); | 
|  1041   auto f = CheckLsh(1, MakeCheckedNum(2)).ValueOrDie(); |  1059   auto f = CheckLsh(1, MakeCheckedNum(2)).ValueOrDie(); | 
|  1042   EXPECT_EQ(static_cast<decltype(f)::type>(4), f); |  1060   EXPECT_EQ(static_cast<decltype(f)::type>(4), f); | 
|  1043   auto g = CheckRsh(4, MakeCheckedNum(2)).ValueOrDie(); |  1061   auto g = CheckRsh(4, MakeCheckedNum(2)).ValueOrDie(); | 
|  1044   EXPECT_EQ(static_cast<decltype(g)::type>(1), g); |  1062   EXPECT_EQ(static_cast<decltype(g)::type>(1), g); | 
|  1045   auto h = CheckRsh(CheckAdd(1, 1, 1, 1), CheckSub(4, 2)).ValueOrDie(); |  1063   auto h = CheckRsh(CheckAdd(1, 1, 1, 1), CheckSub(4, 2)).ValueOrDie(); | 
|  1046   EXPECT_EQ(static_cast<decltype(h)::type>(1), h); |  1064   EXPECT_EQ(static_cast<decltype(h)::type>(1), h); | 
|  1047 } |  1065 } | 
| OLD | NEW |