| Index: third_party/base/numerics/safe_math_impl.h
|
| diff --git a/third_party/base/numerics/safe_math_impl.h b/third_party/base/numerics/safe_math_impl.h
|
| index 420944669431732470cc5511310bf309f87fb316..f219cf52bb34cd21cd44f2744937308f8378516a 100644
|
| --- a/third_party/base/numerics/safe_math_impl.h
|
| +++ b/third_party/base/numerics/safe_math_impl.h
|
| @@ -10,10 +10,10 @@
|
| #include <cmath>
|
| #include <cstdlib>
|
| #include <limits>
|
| +#include <type_traits>
|
|
|
| #include "safe_conversions.h"
|
| #include "third_party/base/macros.h"
|
| -#include "third_party/base/template_util.h"
|
|
|
| namespace pdfium {
|
| namespace base {
|
| @@ -65,21 +65,21 @@ struct IntegerForSizeAndSign<8, false> {
|
|
|
| template <typename Integer>
|
| struct UnsignedIntegerForSize {
|
| - typedef typename enable_if<
|
| + typedef typename std::enable_if<
|
| std::numeric_limits<Integer>::is_integer,
|
| typename IntegerForSizeAndSign<sizeof(Integer), false>::type>::type type;
|
| };
|
|
|
| template <typename Integer>
|
| struct SignedIntegerForSize {
|
| - typedef typename enable_if<
|
| + typedef typename std::enable_if<
|
| std::numeric_limits<Integer>::is_integer,
|
| typename IntegerForSizeAndSign<sizeof(Integer), true>::type>::type type;
|
| };
|
|
|
| template <typename Integer>
|
| struct TwiceWiderInteger {
|
| - typedef typename enable_if<
|
| + typedef typename std::enable_if<
|
| std::numeric_limits<Integer>::is_integer,
|
| typename IntegerForSizeAndSign<
|
| sizeof(Integer) * 2,
|
| @@ -88,8 +88,9 @@ struct TwiceWiderInteger {
|
|
|
| template <typename Integer>
|
| struct PositionOfSignBit {
|
| - static const typename enable_if<std::numeric_limits<Integer>::is_integer,
|
| - size_t>::type value = 8 * sizeof(Integer) - 1;
|
| + static const typename std::enable_if<std::numeric_limits<Integer>::is_integer,
|
| + size_t>::type value =
|
| + 8 * sizeof(Integer) - 1;
|
| };
|
|
|
| // Helper templates for integer manipulations.
|
| @@ -112,7 +113,7 @@ T BinaryComplement(T x) {
|
| // way to coalesce things into the CheckedNumericState specializations below.
|
|
|
| template <typename T>
|
| -typename enable_if<std::numeric_limits<T>::is_integer, T>::type
|
| +typename std::enable_if<std::numeric_limits<T>::is_integer, T>::type
|
| CheckedAdd(T x, T y, RangeConstraint* validity) {
|
| // Since the value of x+y is undefined if we have a signed type, we compute
|
| // it using the unsigned type of the same size.
|
| @@ -135,7 +136,7 @@ CheckedAdd(T x, T y, RangeConstraint* validity) {
|
| }
|
|
|
| template <typename T>
|
| -typename enable_if<std::numeric_limits<T>::is_integer, T>::type
|
| +typename std::enable_if<std::numeric_limits<T>::is_integer, T>::type
|
| CheckedSub(T x, T y, RangeConstraint* validity) {
|
| // Since the value of x+y is undefined if we have a signed type, we compute
|
| // it using the unsigned type of the same size.
|
| @@ -162,9 +163,9 @@ CheckedSub(T x, T y, RangeConstraint* validity) {
|
| // slow case we need to manually check that the result won't be truncated by
|
| // checking with division against the appropriate bound.
|
| template <typename T>
|
| -typename enable_if<
|
| - std::numeric_limits<T>::is_integer && sizeof(T) * 2 <= sizeof(uintmax_t),
|
| - T>::type
|
| +typename std::enable_if<std::numeric_limits<T>::is_integer &&
|
| + sizeof(T) * 2 <= sizeof(uintmax_t),
|
| + T>::type
|
| CheckedMul(T x, T y, RangeConstraint* validity) {
|
| typedef typename TwiceWiderInteger<T>::type IntermediateType;
|
| IntermediateType tmp =
|
| @@ -174,9 +175,10 @@ CheckedMul(T x, T y, RangeConstraint* validity) {
|
| }
|
|
|
| template <typename T>
|
| -typename enable_if<std::numeric_limits<T>::is_integer&& std::numeric_limits<
|
| - T>::is_signed&&(sizeof(T) * 2 > sizeof(uintmax_t)),
|
| - T>::type
|
| +typename std::enable_if<std::numeric_limits<T>::is_integer &&
|
| + std::numeric_limits<T>::is_signed &&
|
| + (sizeof(T) * 2 > sizeof(uintmax_t)),
|
| + T>::type
|
| CheckedMul(T x, T y, RangeConstraint* validity) {
|
| // If either side is zero then the result will be zero.
|
| if (!x || !y) {
|
| @@ -203,10 +205,10 @@ CheckedMul(T x, T y, RangeConstraint* validity) {
|
| }
|
|
|
| template <typename T>
|
| -typename enable_if<std::numeric_limits<T>::is_integer &&
|
| - !std::numeric_limits<T>::is_signed &&
|
| - (sizeof(T) * 2 > sizeof(uintmax_t)),
|
| - T>::type
|
| +typename std::enable_if<std::numeric_limits<T>::is_integer &&
|
| + !std::numeric_limits<T>::is_signed &&
|
| + (sizeof(T) * 2 > sizeof(uintmax_t)),
|
| + T>::type
|
| CheckedMul(T x, T y, RangeConstraint* validity) {
|
| *validity = (y == 0 || x <= std::numeric_limits<T>::max() / y)
|
| ? RANGE_VALID
|
| @@ -216,11 +218,11 @@ CheckedMul(T x, T y, RangeConstraint* validity) {
|
|
|
| // Division just requires a check for an invalid negation on signed min/-1.
|
| template <typename T>
|
| -T CheckedDiv(
|
| - T x,
|
| - T y,
|
| - RangeConstraint* validity,
|
| - typename enable_if<std::numeric_limits<T>::is_integer, int>::type = 0) {
|
| +T CheckedDiv(T x,
|
| + T y,
|
| + RangeConstraint* validity,
|
| + typename std::enable_if<std::numeric_limits<T>::is_integer,
|
| + int>::type = 0) {
|
| if (std::numeric_limits<T>::is_signed && x == std::numeric_limits<T>::min() &&
|
| y == static_cast<T>(-1)) {
|
| *validity = RANGE_OVERFLOW;
|
| @@ -232,27 +234,27 @@ T CheckedDiv(
|
| }
|
|
|
| template <typename T>
|
| -typename enable_if<
|
| - std::numeric_limits<T>::is_integer&& std::numeric_limits<T>::is_signed,
|
| - T>::type
|
| +typename std::enable_if<std::numeric_limits<T>::is_integer &&
|
| + std::numeric_limits<T>::is_signed,
|
| + T>::type
|
| CheckedMod(T x, T y, RangeConstraint* validity) {
|
| *validity = y > 0 ? RANGE_VALID : RANGE_INVALID;
|
| return x % y;
|
| }
|
|
|
| template <typename T>
|
| -typename enable_if<
|
| - std::numeric_limits<T>::is_integer && !std::numeric_limits<T>::is_signed,
|
| - T>::type
|
| +typename std::enable_if<std::numeric_limits<T>::is_integer &&
|
| + !std::numeric_limits<T>::is_signed,
|
| + T>::type
|
| CheckedMod(T x, T y, RangeConstraint* validity) {
|
| *validity = RANGE_VALID;
|
| return x % y;
|
| }
|
|
|
| template <typename T>
|
| -typename enable_if<
|
| - std::numeric_limits<T>::is_integer&& std::numeric_limits<T>::is_signed,
|
| - T>::type
|
| +typename std::enable_if<std::numeric_limits<T>::is_integer &&
|
| + std::numeric_limits<T>::is_signed,
|
| + T>::type
|
| CheckedNeg(T value, RangeConstraint* validity) {
|
| *validity =
|
| value != std::numeric_limits<T>::min() ? RANGE_VALID : RANGE_OVERFLOW;
|
| @@ -261,9 +263,9 @@ CheckedNeg(T value, RangeConstraint* validity) {
|
| }
|
|
|
| template <typename T>
|
| -typename enable_if<
|
| - std::numeric_limits<T>::is_integer && !std::numeric_limits<T>::is_signed,
|
| - T>::type
|
| +typename std::enable_if<std::numeric_limits<T>::is_integer &&
|
| + !std::numeric_limits<T>::is_signed,
|
| + T>::type
|
| CheckedNeg(T value, RangeConstraint* validity) {
|
| // The only legal unsigned negation is zero.
|
| *validity = value ? RANGE_UNDERFLOW : RANGE_VALID;
|
| @@ -272,9 +274,9 @@ CheckedNeg(T value, RangeConstraint* validity) {
|
| }
|
|
|
| template <typename T>
|
| -typename enable_if<
|
| - std::numeric_limits<T>::is_integer&& std::numeric_limits<T>::is_signed,
|
| - T>::type
|
| +typename std::enable_if<std::numeric_limits<T>::is_integer &&
|
| + std::numeric_limits<T>::is_signed,
|
| + T>::type
|
| CheckedAbs(T value, RangeConstraint* validity) {
|
| *validity =
|
| value != std::numeric_limits<T>::min() ? RANGE_VALID : RANGE_OVERFLOW;
|
| @@ -282,9 +284,9 @@ CheckedAbs(T value, RangeConstraint* validity) {
|
| }
|
|
|
| template <typename T>
|
| -typename enable_if<
|
| - std::numeric_limits<T>::is_integer && !std::numeric_limits<T>::is_signed,
|
| - T>::type
|
| +typename std::enable_if<std::numeric_limits<T>::is_integer &&
|
| + !std::numeric_limits<T>::is_signed,
|
| + T>::type
|
| CheckedAbs(T value, RangeConstraint* validity) {
|
| // Absolute value of a positive is just its identiy.
|
| *validity = RANGE_VALID;
|
| @@ -293,12 +295,12 @@ CheckedAbs(T value, RangeConstraint* validity) {
|
|
|
| // These are the floating point stubs that the compiler needs to see. Only the
|
| // negation operation is ever called.
|
| -#define BASE_FLOAT_ARITHMETIC_STUBS(NAME) \
|
| - template <typename T> \
|
| - typename enable_if<std::numeric_limits<T>::is_iec559, T>::type \
|
| - Checked##NAME(T, T, RangeConstraint*) { \
|
| - NOTREACHED(); \
|
| - return 0; \
|
| +#define BASE_FLOAT_ARITHMETIC_STUBS(NAME) \
|
| + template <typename T> \
|
| + typename std::enable_if<std::numeric_limits<T>::is_iec559, T>::type \
|
| + Checked##NAME(T, T, RangeConstraint*) { \
|
| + NOTREACHED(); \
|
| + return 0; \
|
| }
|
|
|
| BASE_FLOAT_ARITHMETIC_STUBS(Add)
|
| @@ -310,14 +312,14 @@ BASE_FLOAT_ARITHMETIC_STUBS(Mod)
|
| #undef BASE_FLOAT_ARITHMETIC_STUBS
|
|
|
| template <typename T>
|
| -typename enable_if<std::numeric_limits<T>::is_iec559, T>::type CheckedNeg(
|
| +typename std::enable_if<std::numeric_limits<T>::is_iec559, T>::type CheckedNeg(
|
| T value,
|
| RangeConstraint*) {
|
| return -value;
|
| }
|
|
|
| template <typename T>
|
| -typename enable_if<std::numeric_limits<T>::is_iec559, T>::type CheckedAbs(
|
| +typename std::enable_if<std::numeric_limits<T>::is_iec559, T>::type CheckedAbs(
|
| T value,
|
| RangeConstraint*) {
|
| return std::abs(value);
|
| @@ -377,8 +379,8 @@ class CheckedNumericState<T, NUMERIC_INTEGER> {
|
| template <typename Src>
|
| explicit CheckedNumericState(
|
| Src value,
|
| - typename enable_if<std::numeric_limits<Src>::is_specialized, int>::type =
|
| - 0)
|
| + typename std::enable_if<std::numeric_limits<Src>::is_specialized,
|
| + int>::type = 0)
|
| : value_(static_cast<T>(value)),
|
| validity_(DstRangeRelationToSrcRange<T>(value)) {}
|
|
|
| @@ -402,7 +404,8 @@ class CheckedNumericState<T, NUMERIC_FLOATING> {
|
| CheckedNumericState(
|
| Src value,
|
| RangeConstraint validity,
|
| - typename enable_if<std::numeric_limits<Src>::is_integer, int>::type = 0) {
|
| + typename std::enable_if<std::numeric_limits<Src>::is_integer, int>::type =
|
| + 0) {
|
| switch (DstRangeRelationToSrcRange<T>(value)) {
|
| case RANGE_VALID:
|
| value_ = static_cast<T>(value);
|
| @@ -428,8 +431,8 @@ class CheckedNumericState<T, NUMERIC_FLOATING> {
|
| template <typename Src>
|
| explicit CheckedNumericState(
|
| Src value,
|
| - typename enable_if<std::numeric_limits<Src>::is_specialized, int>::type =
|
| - 0)
|
| + typename std::enable_if<std::numeric_limits<Src>::is_specialized,
|
| + int>::type = 0)
|
| : value_(static_cast<T>(value)) {}
|
|
|
| // Copy constructor.
|
|
|