Index: base/numerics/safe_conversions.h |
diff --git a/base/numerics/safe_conversions.h b/base/numerics/safe_conversions.h |
index baac188fd2a71288dc5577be63e23798618e4bc7..42232c6707f38127601b5b1875ea45c4d80ee4d3 100644 |
--- a/base/numerics/safe_conversions.h |
+++ b/base/numerics/safe_conversions.h |
@@ -18,7 +18,7 @@ namespace base { |
// Convenience function that returns true if the supplied value is in range |
// for the destination type. |
template <typename Dst, typename Src> |
-inline bool IsValueInRangeForNumericType(Src value) { |
+inline constexpr bool IsValueInRangeForNumericType(Src value) { |
return internal::DstRangeRelationToSrcRange<Dst>(value) == |
internal::RANGE_VALID; |
} |
@@ -26,7 +26,7 @@ inline bool IsValueInRangeForNumericType(Src value) { |
// Convenience function for determining if a numeric value is negative without |
// throwing compiler warnings on: unsigned(value) < 0. |
template <typename T> |
-typename std::enable_if<std::numeric_limits<T>::is_signed, bool>::type |
+constexpr typename std::enable_if<std::numeric_limits<T>::is_signed, bool>::type |
IsValueNegative(T value) { |
static_assert(std::numeric_limits<T>::is_specialized, |
"Argument must be numeric."); |
@@ -34,8 +34,8 @@ IsValueNegative(T value) { |
} |
template <typename T> |
-typename std::enable_if<!std::numeric_limits<T>::is_signed, bool>::type |
- IsValueNegative(T) { |
+constexpr typename std::enable_if<!std::numeric_limits<T>::is_signed, |
+ bool>::type IsValueNegative(T) { |
static_assert(std::numeric_limits<T>::is_specialized, |
"Argument must be numeric."); |
return false; |
@@ -62,7 +62,7 @@ struct SaturatedCastNaNBehaviorCheck { |
// HandleNaN will return 0 in this case. |
struct SaturatedCastNaNBehaviorReturnZero { |
template <typename T> |
- static T HandleNaN() { |
+ static constexpr T HandleNaN() { |
return T(); |
} |
}; |
@@ -102,7 +102,7 @@ inline Dst saturated_cast(Src value) { |
// it will cause a compile failure if the destination type is not large enough |
// to contain any value in the source type. It performs no runtime checking. |
template <typename Dst, typename Src> |
-inline Dst strict_cast(Src value) { |
+inline constexpr Dst strict_cast(Src value) { |
static_assert(std::numeric_limits<Src>::is_specialized, |
"Argument must be numeric."); |
static_assert(std::numeric_limits<Dst>::is_specialized, |
@@ -128,33 +128,33 @@ inline Dst strict_cast(Src value) { |
// compiles cleanly with truncation warnings enabled. |
// This template should introduce no runtime overhead, but it also provides no |
// runtime checking of any of the associated mathematical operations. Use |
-// CheckedNumeric for runtime range checks of tha actual value being assigned. |
+// CheckedNumeric for runtime range checks of the actual value being assigned. |
template <typename T> |
class StrictNumeric { |
public: |
typedef T type; |
- StrictNumeric() : value_(0) {} |
+ constexpr StrictNumeric() : value_(0) {} |
// Copy constructor. |
template <typename Src> |
- StrictNumeric(const StrictNumeric<Src>& rhs) |
+ constexpr StrictNumeric(const StrictNumeric<Src>& rhs) |
: value_(strict_cast<T>(rhs.value_)) {} |
// This is not an explicit constructor because we implicitly upgrade regular |
// numerics to StrictNumerics to make them easier to use. |
template <typename Src> |
- StrictNumeric(Src value) |
+ constexpr StrictNumeric(Src value) |
: value_(strict_cast<T>(value)) {} |
// The numeric cast operator basically handles all the magic. |
template <typename Dst> |
- operator Dst() const { |
+ constexpr operator Dst() const { |
return strict_cast<Dst>(value_); |
} |
private: |
- T value_; |
+ const T value_; |
}; |
// Explicitly make a shorter size_t typedef for convenience. |