| 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 <stdint.h> | 8 #include <stdint.h> |
| 9 | 9 |
| 10 #include <limits> | 10 #include <limits> |
| (...skipping 520 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 531 struct ArithmeticOrUnderlyingEnum<T, false> { | 531 struct ArithmeticOrUnderlyingEnum<T, false> { |
| 532 using type = T; | 532 using type = T; |
| 533 static const bool value = std::is_arithmetic<type>::value; | 533 static const bool value = std::is_arithmetic<type>::value; |
| 534 }; | 534 }; |
| 535 | 535 |
| 536 // The following are helper templates used in the CheckedNumeric class. | 536 // The following are helper templates used in the CheckedNumeric class. |
| 537 template <typename T> | 537 template <typename T> |
| 538 class CheckedNumeric; | 538 class CheckedNumeric; |
| 539 | 539 |
| 540 template <typename T> | 540 template <typename T> |
| 541 class ClampedNumeric; |
| 542 |
| 543 template <typename T> |
| 541 class StrictNumeric; | 544 class StrictNumeric; |
| 542 | 545 |
| 543 // Used to treat CheckedNumeric and arithmetic underlying types the same. | 546 // Used to treat CheckedNumeric and arithmetic underlying types the same. |
| 544 template <typename T> | 547 template <typename T> |
| 545 struct UnderlyingType { | 548 struct UnderlyingType { |
| 546 using type = typename ArithmeticOrUnderlyingEnum<T>::type; | 549 using type = typename ArithmeticOrUnderlyingEnum<T>::type; |
| 547 static const bool is_numeric = std::is_arithmetic<type>::value; | 550 static const bool is_numeric = std::is_arithmetic<type>::value; |
| 548 static const bool is_checked = false; | 551 static const bool is_checked = false; |
| 549 static const bool is_strict = false; | 552 static const bool is_strict = false; |
| 550 }; | 553 }; |
| 551 | 554 |
| 552 template <typename T> | 555 template <typename T> |
| 553 struct UnderlyingType<CheckedNumeric<T>> { | 556 struct UnderlyingType<CheckedNumeric<T>> { |
| 554 using type = T; | 557 using type = T; |
| 555 static const bool is_numeric = true; | 558 static const bool is_numeric = true; |
| 556 static const bool is_checked = true; | 559 static const bool is_checked = true; |
| 560 static const bool is_clamped = false; |
| 557 static const bool is_strict = false; | 561 static const bool is_strict = false; |
| 558 }; | 562 }; |
| 559 | 563 |
| 564 template <typename T> |
| 565 struct UnderlyingType<ClampedNumeric<T>> { |
| 566 using type = T; |
| 567 static const bool is_numeric = true; |
| 568 static const bool is_checked = false; |
| 569 static const bool is_clamped = true; |
| 570 static const bool is_strict = false; |
| 571 }; |
| 572 |
| 560 template <typename T> | 573 template <typename T> |
| 561 struct UnderlyingType<StrictNumeric<T>> { | 574 struct UnderlyingType<StrictNumeric<T>> { |
| 562 using type = T; | 575 using type = T; |
| 563 static const bool is_numeric = true; | 576 static const bool is_numeric = true; |
| 564 static const bool is_checked = false; | 577 static const bool is_checked = false; |
| 578 static const bool is_clamped = false; |
| 565 static const bool is_strict = true; | 579 static const bool is_strict = true; |
| 566 }; | 580 }; |
| 567 | 581 |
| 568 template <typename L, typename R> | 582 template <typename L, typename R> |
| 569 struct IsCheckedOp { | 583 struct IsCheckedOp { |
| 570 static const bool value = | 584 static const bool value = |
| 571 UnderlyingType<L>::is_numeric && UnderlyingType<R>::is_numeric && | 585 UnderlyingType<L>::is_numeric && UnderlyingType<R>::is_numeric && |
| 572 (UnderlyingType<L>::is_checked || UnderlyingType<R>::is_checked); | 586 (UnderlyingType<L>::is_checked || UnderlyingType<R>::is_checked); |
| 573 }; | 587 }; |
| 574 | 588 |
| 575 template <typename L, typename R> | 589 template <typename L, typename R> |
| 590 struct IsClampedOp { |
| 591 static const bool value = |
| 592 UnderlyingType<L>::is_numeric && UnderlyingType<R>::is_numeric && |
| 593 (UnderlyingType<L>::is_clamped || UnderlyingType<R>::is_clamped); |
| 594 }; |
| 595 |
| 596 template <typename L, typename R> |
| 576 struct IsStrictOp { | 597 struct IsStrictOp { |
| 577 static const bool value = | 598 static const bool value = |
| 578 UnderlyingType<L>::is_numeric && UnderlyingType<R>::is_numeric && | 599 UnderlyingType<L>::is_numeric && UnderlyingType<R>::is_numeric && |
| 579 (UnderlyingType<L>::is_strict || UnderlyingType<R>::is_strict); | 600 (UnderlyingType<L>::is_strict || UnderlyingType<R>::is_strict); |
| 580 }; | 601 }; |
| 581 | 602 |
| 582 template <typename L, typename R> | 603 template <typename L, typename R> |
| 583 constexpr bool IsLessImpl(const L lhs, | 604 constexpr bool IsLessImpl(const L lhs, |
| 584 const R rhs, | 605 const R rhs, |
| 585 const RangeCheck l_range, | 606 const RangeCheck l_range, |
| (...skipping 109 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 695 "Types must be numeric."); | 716 "Types must be numeric."); |
| 696 using Promotion = BigEnoughPromotion<L, R>; | 717 using Promotion = BigEnoughPromotion<L, R>; |
| 697 using BigType = typename Promotion::type; | 718 using BigType = typename Promotion::type; |
| 698 return Promotion::is_contained | 719 return Promotion::is_contained |
| 699 // Force to a larger type for speed if both are contained. | 720 // Force to a larger type for speed if both are contained. |
| 700 ? C<BigType, BigType>::Test( | 721 ? C<BigType, BigType>::Test( |
| 701 static_cast<BigType>(static_cast<L>(lhs)), | 722 static_cast<BigType>(static_cast<L>(lhs)), |
| 702 static_cast<BigType>(static_cast<R>(rhs))) | 723 static_cast<BigType>(static_cast<R>(rhs))) |
| 703 // Let the template functions figure it out for mixed types. | 724 // Let the template functions figure it out for mixed types. |
| 704 : C<L, R>::Test(lhs, rhs); | 725 : C<L, R>::Test(lhs, rhs); |
| 705 }; | 726 } |
| 706 | 727 |
| 707 } // namespace internal | 728 } // namespace internal |
| 708 } // namespace base | 729 } // namespace base |
| 709 | 730 |
| 710 #endif // BASE_NUMERICS_SAFE_CONVERSIONS_IMPL_H_ | 731 #endif // BASE_NUMERICS_SAFE_CONVERSIONS_IMPL_H_ |
| OLD | NEW |