| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright (c) 2012, Google Inc. All rights reserved. | 2 * Copyright (c) 2012, Google Inc. All rights reserved. |
| 3 * | 3 * |
| 4 * Redistribution and use in source and binary forms, with or without | 4 * Redistribution and use in source and binary forms, with or without |
| 5 * modification, are permitted provided that the following conditions are | 5 * modification, are permitted provided that the following conditions are |
| 6 * met: | 6 * met: |
| 7 * | 7 * |
| 8 * * Redistributions of source code must retain the above copyright | 8 * * Redistributions of source code must retain the above copyright |
| 9 * notice, this list of conditions and the following disclaimer. | 9 * notice, this list of conditions and the following disclaimer. |
| 10 * * Redistributions in binary form must reproduce the above | 10 * * Redistributions in binary form must reproduce the above |
| (...skipping 17 matching lines...) Expand all Loading... |
| 28 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | 28 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
| 29 */ | 29 */ |
| 30 | 30 |
| 31 #include "wtf/SaturatedArithmetic.h" | 31 #include "wtf/SaturatedArithmetic.h" |
| 32 | 32 |
| 33 #include "testing/gtest/include/gtest/gtest.h" | 33 #include "testing/gtest/include/gtest/gtest.h" |
| 34 #include <limits.h> | 34 #include <limits.h> |
| 35 | 35 |
| 36 namespace WTF { | 36 namespace WTF { |
| 37 | 37 |
| 38 TEST(SaturatedArithmeticTest, Addition) | 38 TEST(SaturatedArithmeticTest, Addition) { |
| 39 { | 39 EXPECT_EQ(0, saturatedAddition(0, 0)); |
| 40 EXPECT_EQ(0, saturatedAddition(0, 0)); | 40 EXPECT_EQ(1, saturatedAddition(0, 1)); |
| 41 EXPECT_EQ(1, saturatedAddition(0, 1)); | 41 EXPECT_EQ(100, saturatedAddition(0, 100)); |
| 42 EXPECT_EQ(100, saturatedAddition(0, 100)); | 42 EXPECT_EQ(150, saturatedAddition(100, 50)); |
| 43 EXPECT_EQ(150, saturatedAddition(100, 50)); | |
| 44 | 43 |
| 45 EXPECT_EQ(-1, saturatedAddition(0, -1)); | 44 EXPECT_EQ(-1, saturatedAddition(0, -1)); |
| 46 EXPECT_EQ(0, saturatedAddition(1, -1)); | 45 EXPECT_EQ(0, saturatedAddition(1, -1)); |
| 47 EXPECT_EQ(50, saturatedAddition(100, -50)); | 46 EXPECT_EQ(50, saturatedAddition(100, -50)); |
| 48 EXPECT_EQ(-50, saturatedAddition(50, -100)); | 47 EXPECT_EQ(-50, saturatedAddition(50, -100)); |
| 49 | 48 |
| 50 EXPECT_EQ(INT_MAX - 1, saturatedAddition(INT_MAX - 1, 0)); | 49 EXPECT_EQ(INT_MAX - 1, saturatedAddition(INT_MAX - 1, 0)); |
| 51 EXPECT_EQ(INT_MAX, saturatedAddition(INT_MAX - 1, 1)); | 50 EXPECT_EQ(INT_MAX, saturatedAddition(INT_MAX - 1, 1)); |
| 52 EXPECT_EQ(INT_MAX, saturatedAddition(INT_MAX - 1, 2)); | 51 EXPECT_EQ(INT_MAX, saturatedAddition(INT_MAX - 1, 2)); |
| 53 EXPECT_EQ(INT_MAX - 1, saturatedAddition(0, INT_MAX - 1)); | 52 EXPECT_EQ(INT_MAX - 1, saturatedAddition(0, INT_MAX - 1)); |
| 54 EXPECT_EQ(INT_MAX, saturatedAddition(1, INT_MAX - 1)); | 53 EXPECT_EQ(INT_MAX, saturatedAddition(1, INT_MAX - 1)); |
| 55 EXPECT_EQ(INT_MAX, saturatedAddition(2, INT_MAX - 1)); | 54 EXPECT_EQ(INT_MAX, saturatedAddition(2, INT_MAX - 1)); |
| 56 EXPECT_EQ(INT_MAX, saturatedAddition(INT_MAX - 1, INT_MAX - 1)); | 55 EXPECT_EQ(INT_MAX, saturatedAddition(INT_MAX - 1, INT_MAX - 1)); |
| 57 EXPECT_EQ(INT_MAX, saturatedAddition(INT_MAX, INT_MAX)); | 56 EXPECT_EQ(INT_MAX, saturatedAddition(INT_MAX, INT_MAX)); |
| 58 | 57 |
| 59 EXPECT_EQ(INT_MIN, saturatedAddition(INT_MIN, 0)); | 58 EXPECT_EQ(INT_MIN, saturatedAddition(INT_MIN, 0)); |
| 60 EXPECT_EQ(INT_MIN + 1, saturatedAddition(INT_MIN + 1, 0)); | 59 EXPECT_EQ(INT_MIN + 1, saturatedAddition(INT_MIN + 1, 0)); |
| 61 EXPECT_EQ(INT_MIN + 2, saturatedAddition(INT_MIN + 1, 1)); | 60 EXPECT_EQ(INT_MIN + 2, saturatedAddition(INT_MIN + 1, 1)); |
| 62 EXPECT_EQ(INT_MIN + 3, saturatedAddition(INT_MIN + 1, 2)); | 61 EXPECT_EQ(INT_MIN + 3, saturatedAddition(INT_MIN + 1, 2)); |
| 63 EXPECT_EQ(INT_MIN, saturatedAddition(INT_MIN + 1, -1)); | 62 EXPECT_EQ(INT_MIN, saturatedAddition(INT_MIN + 1, -1)); |
| 64 EXPECT_EQ(INT_MIN, saturatedAddition(INT_MIN + 1, -2)); | 63 EXPECT_EQ(INT_MIN, saturatedAddition(INT_MIN + 1, -2)); |
| 65 EXPECT_EQ(INT_MIN + 1, saturatedAddition(0, INT_MIN + 1)); | 64 EXPECT_EQ(INT_MIN + 1, saturatedAddition(0, INT_MIN + 1)); |
| 66 EXPECT_EQ(INT_MIN, saturatedAddition(-1, INT_MIN + 1)); | 65 EXPECT_EQ(INT_MIN, saturatedAddition(-1, INT_MIN + 1)); |
| 67 EXPECT_EQ(INT_MIN, saturatedAddition(-2, INT_MIN + 1)); | 66 EXPECT_EQ(INT_MIN, saturatedAddition(-2, INT_MIN + 1)); |
| 68 | 67 |
| 69 EXPECT_EQ(INT_MAX / 2 + 10000, saturatedAddition(INT_MAX / 2, 10000)); | 68 EXPECT_EQ(INT_MAX / 2 + 10000, saturatedAddition(INT_MAX / 2, 10000)); |
| 70 EXPECT_EQ(INT_MAX, saturatedAddition(INT_MAX / 2 + 1, INT_MAX / 2 + 1)); | 69 EXPECT_EQ(INT_MAX, saturatedAddition(INT_MAX / 2 + 1, INT_MAX / 2 + 1)); |
| 71 EXPECT_EQ(-1, saturatedAddition(INT_MIN, INT_MAX)); | 70 EXPECT_EQ(-1, saturatedAddition(INT_MIN, INT_MAX)); |
| 72 } | 71 } |
| 73 | 72 |
| 74 TEST(SaturatedArithmeticTest, Subtraction) | 73 TEST(SaturatedArithmeticTest, Subtraction) { |
| 75 { | 74 EXPECT_EQ(0, saturatedSubtraction(0, 0)); |
| 76 EXPECT_EQ(0, saturatedSubtraction(0, 0)); | 75 EXPECT_EQ(-1, saturatedSubtraction(0, 1)); |
| 77 EXPECT_EQ(-1, saturatedSubtraction(0, 1)); | 76 EXPECT_EQ(-100, saturatedSubtraction(0, 100)); |
| 78 EXPECT_EQ(-100, saturatedSubtraction(0, 100)); | 77 EXPECT_EQ(50, saturatedSubtraction(100, 50)); |
| 79 EXPECT_EQ(50, saturatedSubtraction(100, 50)); | |
| 80 | 78 |
| 81 EXPECT_EQ(1, saturatedSubtraction(0, -1)); | 79 EXPECT_EQ(1, saturatedSubtraction(0, -1)); |
| 82 EXPECT_EQ(2, saturatedSubtraction(1, -1)); | 80 EXPECT_EQ(2, saturatedSubtraction(1, -1)); |
| 83 EXPECT_EQ(150, saturatedSubtraction(100, -50)); | 81 EXPECT_EQ(150, saturatedSubtraction(100, -50)); |
| 84 EXPECT_EQ(150, saturatedSubtraction(50, -100)); | 82 EXPECT_EQ(150, saturatedSubtraction(50, -100)); |
| 85 | 83 |
| 86 EXPECT_EQ(INT_MAX, saturatedSubtraction(INT_MAX, 0)); | 84 EXPECT_EQ(INT_MAX, saturatedSubtraction(INT_MAX, 0)); |
| 87 EXPECT_EQ(INT_MAX - 1, saturatedSubtraction(INT_MAX, 1)); | 85 EXPECT_EQ(INT_MAX - 1, saturatedSubtraction(INT_MAX, 1)); |
| 88 EXPECT_EQ(INT_MAX - 1, saturatedSubtraction(INT_MAX - 1, 0)); | 86 EXPECT_EQ(INT_MAX - 1, saturatedSubtraction(INT_MAX - 1, 0)); |
| 89 EXPECT_EQ(INT_MAX, saturatedSubtraction(INT_MAX - 1, -1)); | 87 EXPECT_EQ(INT_MAX, saturatedSubtraction(INT_MAX - 1, -1)); |
| 90 EXPECT_EQ(INT_MAX, saturatedSubtraction(INT_MAX - 1, -2)); | 88 EXPECT_EQ(INT_MAX, saturatedSubtraction(INT_MAX - 1, -2)); |
| 91 EXPECT_EQ(-INT_MAX + 1, saturatedSubtraction(0, INT_MAX - 1)); | 89 EXPECT_EQ(-INT_MAX + 1, saturatedSubtraction(0, INT_MAX - 1)); |
| 92 EXPECT_EQ(-INT_MAX, saturatedSubtraction(-1, INT_MAX - 1)); | 90 EXPECT_EQ(-INT_MAX, saturatedSubtraction(-1, INT_MAX - 1)); |
| 93 EXPECT_EQ(-INT_MAX - 1, saturatedSubtraction(-2, INT_MAX - 1)); | 91 EXPECT_EQ(-INT_MAX - 1, saturatedSubtraction(-2, INT_MAX - 1)); |
| 94 EXPECT_EQ(-INT_MAX - 1, saturatedSubtraction(-3, INT_MAX - 1)); | 92 EXPECT_EQ(-INT_MAX - 1, saturatedSubtraction(-3, INT_MAX - 1)); |
| 95 | 93 |
| 96 EXPECT_EQ(INT_MIN, saturatedSubtraction(INT_MIN, 0)); | 94 EXPECT_EQ(INT_MIN, saturatedSubtraction(INT_MIN, 0)); |
| 97 EXPECT_EQ(INT_MIN + 1, saturatedSubtraction(INT_MIN + 1, 0)); | 95 EXPECT_EQ(INT_MIN + 1, saturatedSubtraction(INT_MIN + 1, 0)); |
| 98 EXPECT_EQ(INT_MIN, saturatedSubtraction(INT_MIN + 1, 1)); | 96 EXPECT_EQ(INT_MIN, saturatedSubtraction(INT_MIN + 1, 1)); |
| 99 EXPECT_EQ(INT_MIN, saturatedSubtraction(INT_MIN + 1, 2)); | 97 EXPECT_EQ(INT_MIN, saturatedSubtraction(INT_MIN + 1, 2)); |
| 100 | 98 |
| 101 EXPECT_EQ(0, saturatedSubtraction(INT_MIN, INT_MIN)); | 99 EXPECT_EQ(0, saturatedSubtraction(INT_MIN, INT_MIN)); |
| 102 EXPECT_EQ(0, saturatedSubtraction(INT_MAX, INT_MAX)); | 100 EXPECT_EQ(0, saturatedSubtraction(INT_MAX, INT_MAX)); |
| 103 EXPECT_EQ(INT_MAX, saturatedSubtraction(INT_MAX, INT_MIN)); | 101 EXPECT_EQ(INT_MAX, saturatedSubtraction(INT_MAX, INT_MIN)); |
| 104 } | 102 } |
| 105 | 103 |
| 106 TEST(SaturatedArithmeticTest, SetSigned) | 104 TEST(SaturatedArithmeticTest, SetSigned) { |
| 107 { | 105 const int kFractionBits = 6; |
| 108 const int kFractionBits = 6; | 106 const int intMaxForLayoutUnit = INT_MAX >> kFractionBits; |
| 109 const int intMaxForLayoutUnit = INT_MAX >> kFractionBits; | 107 const int intMinForLayoutUnit = INT_MIN >> kFractionBits; |
| 110 const int intMinForLayoutUnit = INT_MIN >> kFractionBits; | |
| 111 | 108 |
| 112 EXPECT_EQ(0, saturatedSet<kFractionBits>(0)); | 109 EXPECT_EQ(0, saturatedSet<kFractionBits>(0)); |
| 113 | 110 |
| 114 // Internally the max number we can represent (without saturating) | 111 // Internally the max number we can represent (without saturating) |
| 115 // is all the (non-sign) bits set except for the bottom n fraction bits | 112 // is all the (non-sign) bits set except for the bottom n fraction bits |
| 116 const int maxInternalRepresentation = INT_MAX ^ ((1 << kFractionBits)-1); | 113 const int maxInternalRepresentation = INT_MAX ^ ((1 << kFractionBits) - 1); |
| 117 EXPECT_EQ(maxInternalRepresentation, | 114 EXPECT_EQ(maxInternalRepresentation, |
| 118 saturatedSet<kFractionBits>(intMaxForLayoutUnit)); | 115 saturatedSet<kFractionBits>(intMaxForLayoutUnit)); |
| 119 | 116 |
| 120 EXPECT_EQ(getMaxSaturatedSetResultForTesting(kFractionBits), | 117 EXPECT_EQ(getMaxSaturatedSetResultForTesting(kFractionBits), |
| 121 saturatedSet<kFractionBits>(intMaxForLayoutUnit + 100)); | 118 saturatedSet<kFractionBits>(intMaxForLayoutUnit + 100)); |
| 122 | 119 |
| 123 EXPECT_EQ((intMaxForLayoutUnit - 100) << kFractionBits, | 120 EXPECT_EQ((intMaxForLayoutUnit - 100) << kFractionBits, |
| 124 saturatedSet<kFractionBits>(intMaxForLayoutUnit - 100)); | 121 saturatedSet<kFractionBits>(intMaxForLayoutUnit - 100)); |
| 125 | 122 |
| 126 EXPECT_EQ(getMinSaturatedSetResultForTesting(kFractionBits), | 123 EXPECT_EQ(getMinSaturatedSetResultForTesting(kFractionBits), |
| 127 saturatedSet<kFractionBits>(intMinForLayoutUnit)); | 124 saturatedSet<kFractionBits>(intMinForLayoutUnit)); |
| 128 | 125 |
| 129 EXPECT_EQ(getMinSaturatedSetResultForTesting(kFractionBits), | 126 EXPECT_EQ(getMinSaturatedSetResultForTesting(kFractionBits), |
| 130 saturatedSet<kFractionBits>(intMinForLayoutUnit - 100)); | 127 saturatedSet<kFractionBits>(intMinForLayoutUnit - 100)); |
| 131 | 128 |
| 132 // Shifting negative numbers left has undefined behavior, so use | 129 // Shifting negative numbers left has undefined behavior, so use |
| 133 // multiplication instead of direct shifting here. | 130 // multiplication instead of direct shifting here. |
| 134 EXPECT_EQ((intMinForLayoutUnit + 100) * (1 << kFractionBits), | 131 EXPECT_EQ((intMinForLayoutUnit + 100) * (1 << kFractionBits), |
| 135 saturatedSet<kFractionBits>(intMinForLayoutUnit + 100)); | 132 saturatedSet<kFractionBits>(intMinForLayoutUnit + 100)); |
| 136 } | 133 } |
| 137 | 134 |
| 138 TEST(SaturatedArithmeticTest, SetUnsigned) | 135 TEST(SaturatedArithmeticTest, SetUnsigned) { |
| 139 { | 136 const int kFractionBits = 6; |
| 140 const int kFractionBits = 6; | 137 const int intMaxForLayoutUnit = INT_MAX >> kFractionBits; |
| 141 const int intMaxForLayoutUnit = INT_MAX >> kFractionBits; | |
| 142 | 138 |
| 143 EXPECT_EQ(0, saturatedSet<kFractionBits>((unsigned)0)); | 139 EXPECT_EQ(0, saturatedSet<kFractionBits>((unsigned)0)); |
| 144 | 140 |
| 145 EXPECT_EQ(getMaxSaturatedSetResultForTesting(kFractionBits), | 141 EXPECT_EQ(getMaxSaturatedSetResultForTesting(kFractionBits), |
| 146 saturatedSet<kFractionBits>((unsigned)intMaxForLayoutUnit)); | 142 saturatedSet<kFractionBits>((unsigned)intMaxForLayoutUnit)); |
| 147 | 143 |
| 148 const unsigned kOverflowed = intMaxForLayoutUnit + 100; | 144 const unsigned kOverflowed = intMaxForLayoutUnit + 100; |
| 149 EXPECT_EQ(getMaxSaturatedSetResultForTesting(kFractionBits), | 145 EXPECT_EQ(getMaxSaturatedSetResultForTesting(kFractionBits), |
| 150 saturatedSet<kFractionBits>(kOverflowed)); | 146 saturatedSet<kFractionBits>(kOverflowed)); |
| 151 | 147 |
| 152 const unsigned kNotOverflowed = intMaxForLayoutUnit - 100; | 148 const unsigned kNotOverflowed = intMaxForLayoutUnit - 100; |
| 153 EXPECT_EQ((intMaxForLayoutUnit - 100) << kFractionBits, | 149 EXPECT_EQ((intMaxForLayoutUnit - 100) << kFractionBits, |
| 154 saturatedSet<kFractionBits>(kNotOverflowed)); | 150 saturatedSet<kFractionBits>(kNotOverflowed)); |
| 155 } | 151 } |
| 156 | 152 |
| 157 } // namespace WTF | 153 } // namespace WTF |
| OLD | NEW |