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

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

Issue 2585043002: Improve saturated_cast performance (Closed)
Patch Set: fix comment 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
« no previous file with comments | « base/numerics/safe_conversions_impl.h ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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 653 matching lines...) Expand 10 before | Expand all | Expand 10 after
664 664
665 const CheckedNumeric<Dst> checked_dst; 665 const CheckedNumeric<Dst> checked_dst;
666 TEST_EXPECTED_VALUE(1, checked_dst + static_cast<Src>(1)); 666 TEST_EXPECTED_VALUE(1, checked_dst + static_cast<Src>(1));
667 TEST_EXPECTED_FAILURE(checked_dst + SrcLimits::max()); 667 TEST_EXPECTED_FAILURE(checked_dst + SrcLimits::max());
668 TEST_EXPECTED_FAILURE(checked_dst + static_cast<Src>(-1)); 668 TEST_EXPECTED_FAILURE(checked_dst + static_cast<Src>(-1));
669 TEST_EXPECTED_FAILURE(checked_dst + SrcLimits::lowest()); 669 TEST_EXPECTED_FAILURE(checked_dst + SrcLimits::lowest());
670 670
671 TEST_EXPECTED_RANGE(RANGE_OVERFLOW, SrcLimits::max()); 671 TEST_EXPECTED_RANGE(RANGE_OVERFLOW, SrcLimits::max());
672 TEST_EXPECTED_RANGE(RANGE_VALID, static_cast<Src>(1)); 672 TEST_EXPECTED_RANGE(RANGE_VALID, static_cast<Src>(1));
673 TEST_EXPECTED_RANGE(RANGE_UNDERFLOW, static_cast<Src>(-1)); 673 TEST_EXPECTED_RANGE(RANGE_UNDERFLOW, static_cast<Src>(-1));
674
675 // Additional saturation tests.
676 EXPECT_EQ(DstLimits::max(), saturated_cast<Dst>(SrcLimits::max()));
677 EXPECT_EQ(DstLimits::lowest(), saturated_cast<Dst>(SrcLimits::lowest()));
678
674 if (SrcLimits::is_iec559) { 679 if (SrcLimits::is_iec559) {
680 EXPECT_EQ(Dst(0), saturated_cast<Dst>(SrcLimits::quiet_NaN()));
681
675 TEST_EXPECTED_RANGE(RANGE_UNDERFLOW, SrcLimits::max() * -1); 682 TEST_EXPECTED_RANGE(RANGE_UNDERFLOW, SrcLimits::max() * -1);
676 TEST_EXPECTED_RANGE(RANGE_OVERFLOW, SrcLimits::infinity()); 683 TEST_EXPECTED_RANGE(RANGE_OVERFLOW, SrcLimits::infinity());
677 TEST_EXPECTED_RANGE(RANGE_UNDERFLOW, SrcLimits::infinity() * -1); 684 TEST_EXPECTED_RANGE(RANGE_UNDERFLOW, SrcLimits::infinity() * -1);
678 TEST_EXPECTED_RANGE(RANGE_INVALID, SrcLimits::quiet_NaN()); 685 TEST_EXPECTED_RANGE(RANGE_INVALID, SrcLimits::quiet_NaN());
679 if (DstLimits::is_integer) { 686 if (DstLimits::is_integer) {
680 if (SrcLimits::digits < DstLimits::digits) { 687 if (SrcLimits::digits < DstLimits::digits) {
681 TEST_EXPECTED_RANGE(RANGE_OVERFLOW, 688 TEST_EXPECTED_RANGE(RANGE_OVERFLOW,
682 static_cast<Src>(DstLimits::max())); 689 static_cast<Src>(DstLimits::max()));
683 } else { 690 } else {
684 TEST_EXPECTED_RANGE(RANGE_VALID, static_cast<Src>(DstLimits::max())); 691 TEST_EXPECTED_RANGE(RANGE_VALID, static_cast<Src>(DstLimits::max()));
(...skipping 22 matching lines...) Expand all
707 TestStrictComparison<Dst, Src>(); 714 TestStrictComparison<Dst, Src>();
708 715
709 const CheckedNumeric<Dst> checked_dst; 716 const CheckedNumeric<Dst> checked_dst;
710 TEST_EXPECTED_VALUE(1, checked_dst + static_cast<Src>(1)); 717 TEST_EXPECTED_VALUE(1, checked_dst + static_cast<Src>(1));
711 TEST_EXPECTED_FAILURE(checked_dst + SrcLimits::max()); 718 TEST_EXPECTED_FAILURE(checked_dst + SrcLimits::max());
712 TEST_EXPECTED_VALUE(SrcLimits::lowest(), checked_dst + SrcLimits::lowest()); 719 TEST_EXPECTED_VALUE(SrcLimits::lowest(), checked_dst + SrcLimits::lowest());
713 720
714 TEST_EXPECTED_RANGE(RANGE_VALID, SrcLimits::lowest()); 721 TEST_EXPECTED_RANGE(RANGE_VALID, SrcLimits::lowest());
715 TEST_EXPECTED_RANGE(RANGE_OVERFLOW, SrcLimits::max()); 722 TEST_EXPECTED_RANGE(RANGE_OVERFLOW, SrcLimits::max());
716 TEST_EXPECTED_RANGE(RANGE_VALID, static_cast<Src>(1)); 723 TEST_EXPECTED_RANGE(RANGE_VALID, static_cast<Src>(1));
724
725 // Additional saturation tests.
726 EXPECT_EQ(DstLimits::max(), saturated_cast<Dst>(SrcLimits::max()));
727 EXPECT_EQ(Dst(0), saturated_cast<Dst>(SrcLimits::lowest()));
717 } 728 }
718 }; 729 };
719 730
720 // Helper macro to wrap displaying the conversion types and line numbers 731 // Helper macro to wrap displaying the conversion types and line numbers
721 #define TEST_NUMERIC_CONVERSION(d, s, t) \ 732 #define TEST_NUMERIC_CONVERSION(d, s, t) \
722 TestNumericConversion<d, s, t>::Test(#d, #s, __LINE__) 733 TestNumericConversion<d, s, t>::Test(#d, #s, __LINE__)
723 734
724 TEST(SafeNumerics, IntMinOperations) { 735 TEST(SafeNumerics, IntMinOperations) {
725 TEST_NUMERIC_CONVERSION(int8_t, int8_t, SIGN_PRESERVING_VALUE_PRESERVING); 736 TEST_NUMERIC_CONVERSION(int8_t, int8_t, SIGN_PRESERVING_VALUE_PRESERVING);
726 TEST_NUMERIC_CONVERSION(uint8_t, uint8_t, SIGN_PRESERVING_VALUE_PRESERVING); 737 TEST_NUMERIC_CONVERSION(uint8_t, uint8_t, SIGN_PRESERVING_VALUE_PRESERVING);
(...skipping 367 matching lines...) Expand 10 before | Expand all | Expand 10 after
1094 EXPECT_EQ(static_cast<decltype(d)::type>(-.5), d); 1105 EXPECT_EQ(static_cast<decltype(d)::type>(-.5), d);
1095 auto e = CheckMod(MakeCheckedNum(20), 3).ValueOrDie(); 1106 auto e = CheckMod(MakeCheckedNum(20), 3).ValueOrDie();
1096 EXPECT_EQ(static_cast<decltype(e)::type>(2), e); 1107 EXPECT_EQ(static_cast<decltype(e)::type>(2), e);
1097 auto f = CheckLsh(1, MakeCheckedNum(2)).ValueOrDie(); 1108 auto f = CheckLsh(1, MakeCheckedNum(2)).ValueOrDie();
1098 EXPECT_EQ(static_cast<decltype(f)::type>(4), f); 1109 EXPECT_EQ(static_cast<decltype(f)::type>(4), f);
1099 auto g = CheckRsh(4, MakeCheckedNum(2)).ValueOrDie(); 1110 auto g = CheckRsh(4, MakeCheckedNum(2)).ValueOrDie();
1100 EXPECT_EQ(static_cast<decltype(g)::type>(1), g); 1111 EXPECT_EQ(static_cast<decltype(g)::type>(1), g);
1101 auto h = CheckRsh(CheckAdd(1, 1, 1, 1), CheckSub(4, 2)).ValueOrDie(); 1112 auto h = CheckRsh(CheckAdd(1, 1, 1, 1), CheckSub(4, 2)).ValueOrDie();
1102 EXPECT_EQ(static_cast<decltype(h)::type>(1), h); 1113 EXPECT_EQ(static_cast<decltype(h)::type>(1), h);
1103 } 1114 }
OLDNEW
« no previous file with comments | « base/numerics/safe_conversions_impl.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698