OLD | NEW |
1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 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 #ifndef BASE_NUMERICS_SAFE_CONVERSIONS_IMPL_H_ | 5 #ifndef BASE_NUMERICS_SAFE_CONVERSIONS_IMPL_H_ |
6 #define BASE_NUMERICS_SAFE_CONVERSIONS_IMPL_H_ | 6 #define BASE_NUMERICS_SAFE_CONVERSIONS_IMPL_H_ |
7 | 7 |
8 #include <limits.h> | 8 #include <limits.h> |
9 #include <stdint.h> | 9 #include <stdint.h> |
10 | 10 |
(...skipping 272 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
283 static_assert(IntegerBitsPlusSign<intmax_t>::value == 64, | 283 static_assert(IntegerBitsPlusSign<intmax_t>::value == 64, |
284 "Max integer size not supported for this toolchain."); | 284 "Max integer size not supported for this toolchain."); |
285 | 285 |
286 template <typename Integer, bool IsSigned = std::is_signed<Integer>::value> | 286 template <typename Integer, bool IsSigned = std::is_signed<Integer>::value> |
287 struct TwiceWiderInteger { | 287 struct TwiceWiderInteger { |
288 using type = | 288 using type = |
289 typename IntegerForDigitsAndSign<IntegerBitsPlusSign<Integer>::value * 2, | 289 typename IntegerForDigitsAndSign<IntegerBitsPlusSign<Integer>::value * 2, |
290 IsSigned>::type; | 290 IsSigned>::type; |
291 }; | 291 }; |
292 | 292 |
293 template <typename Integer> | |
294 struct PositionOfSignBit { | |
295 static const size_t value = IntegerBitsPlusSign<Integer>::value - 1; | |
296 }; | |
297 | |
298 enum ArithmeticPromotionCategory { | 293 enum ArithmeticPromotionCategory { |
299 LEFT_PROMOTION, // Use the type of the left-hand argument. | 294 LEFT_PROMOTION, // Use the type of the left-hand argument. |
300 RIGHT_PROMOTION // Use the type of the right-hand argument. | 295 RIGHT_PROMOTION // Use the type of the right-hand argument. |
301 }; | 296 }; |
302 | 297 |
303 // Determines the type that can represent the largest positive value. | 298 // Determines the type that can represent the largest positive value. |
304 template <typename Lhs, | 299 template <typename Lhs, |
305 typename Rhs, | 300 typename Rhs, |
306 ArithmeticPromotionCategory Promotion = | 301 ArithmeticPromotionCategory Promotion = |
307 (MaxExponent<Lhs>::value > MaxExponent<Rhs>::value) | 302 (MaxExponent<Lhs>::value > MaxExponent<Rhs>::value) |
(...skipping 301 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
609 static_cast<BigType>(static_cast<L>(lhs)), | 604 static_cast<BigType>(static_cast<L>(lhs)), |
610 static_cast<BigType>(static_cast<R>(rhs))) | 605 static_cast<BigType>(static_cast<R>(rhs))) |
611 // Let the template functions figure it out for mixed types. | 606 // Let the template functions figure it out for mixed types. |
612 : C<L, R>::Test(lhs, rhs); | 607 : C<L, R>::Test(lhs, rhs); |
613 }; | 608 }; |
614 | 609 |
615 } // namespace internal | 610 } // namespace internal |
616 } // namespace base | 611 } // namespace base |
617 | 612 |
618 #endif // BASE_NUMERICS_SAFE_CONVERSIONS_IMPL_H_ | 613 #endif // BASE_NUMERICS_SAFE_CONVERSIONS_IMPL_H_ |
OLD | NEW |