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

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

Issue 2566733002: Performance optimizations for base/numerics absolute value and multiply (Closed)
Patch Set: one more nit Created 4 years 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
(...skipping 88 matching lines...) Expand 10 before | Expand all | Expand 10 after
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
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
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
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 }
OLDNEW
« base/numerics/safe_math_impl.h ('K') | « base/numerics/safe_math_impl.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698