8 #ifndef V8_BASE_SAFE_MATH_IMPL_H_
9 #define V8_BASE_SAFE_MATH_IMPL_H_
27 template<
class T, T v>
42 template<
bool B,
class T =
void>
56 template <
size_t Size,
bool IsSigned>
95 template <
typename Integer>
98 std::numeric_limits<Integer>::is_integer,
102 template <
typename Integer>
105 std::numeric_limits<Integer>::is_integer,
109 template <
typename Integer>
112 std::numeric_limits<Integer>::is_integer,
118 template <
typename Integer>
126 template <
typename T>
134 template <
typename T>
143 template <
typename T>
144 typename enable_if<std::numeric_limits<T>::is_integer,
T>::type
149 UnsignedDst ux =
static_cast<UnsignedDst
>(x);
150 UnsignedDst uy =
static_cast<UnsignedDst
>(
y);
151 UnsignedDst uresult = ux + uy;
154 if (std::numeric_limits<T>::is_signed) {
163 return static_cast<T>(uresult);
166 template <
typename T>
167 typename enable_if<std::numeric_limits<T>::is_integer,
T>::type
172 UnsignedDst ux =
static_cast<UnsignedDst
>(x);
173 UnsignedDst uy =
static_cast<UnsignedDst
>(
y);
174 UnsignedDst uresult = ux - uy;
177 if (std::numeric_limits<T>::is_signed) {
186 return static_cast<T>(uresult);
193 template <
typename T>
195 std::numeric_limits<T>::is_integer &&
sizeof(
T) * 2 <=
sizeof(uintmax_t),
199 IntermediateType tmp =
200 static_cast<IntermediateType
>(x) *
static_cast<IntermediateType
>(
y);
201 *
validity = DstRangeRelationToSrcRange<T>(tmp);
202 return static_cast<T>(tmp);
205 template <
typename T>
206 typename enable_if<std::numeric_limits<T>::is_integer &&
207 std::numeric_limits<T>::is_signed &&
208 (
sizeof(
T) * 2 >
sizeof(uintmax_t)),
235 template <
typename T>
236 typename enable_if<std::numeric_limits<T>::is_integer &&
237 !std::numeric_limits<T>::is_signed &&
238 (
sizeof(
T) * 2 >
sizeof(uintmax_t)),
241 *
validity = (
y == 0 || x <= std::numeric_limits<T>::max() /
y)
248 template <
typename T>
253 typename enable_if<std::numeric_limits<T>::is_integer,
int>::type = 0) {
255 y ==
static_cast<T>(-1)) {
264 template <
typename T>
266 std::numeric_limits<T>::is_integer && std::numeric_limits<T>::is_signed,
273 template <
typename T>
275 std::numeric_limits<T>::is_integer && !std::numeric_limits<T>::is_signed,
282 template <
typename T>
284 std::numeric_limits<T>::is_integer && std::numeric_limits<T>::is_signed,
293 template <
typename T>
295 std::numeric_limits<T>::is_integer && !std::numeric_limits<T>::is_signed,
300 return static_cast<T>(
304 template <
typename T>
306 std::numeric_limits<T>::is_integer && std::numeric_limits<T>::is_signed,
311 return std::abs(value);
314 template <
typename T>
316 std::numeric_limits<T>::is_integer && !std::numeric_limits<T>::is_signed,
326 #define BASE_FLOAT_ARITHMETIC_STUBS(NAME) \
327 template <typename T> \
328 typename enable_if<std::numeric_limits<T>::is_iec559, T>::type \
329 Checked##NAME(T, T, RangeConstraint*) { \
340 #undef BASE_FLOAT_ARITHMETIC_STUBS
342 template <
typename T>
349 template <
typename T>
353 return std::abs(value);
365 template <
typename NumericType>
368 std::numeric_limits<NumericType>::is_integer
379 template <
typename T>
386 template <
typename Src, NumericRepresentation type>
391 template <
typename Src>
401 template <
typename Src>
403 : value_(static_cast<
T>(rhs.value())),
407 template <
typename Src>
410 typename enable_if<std::numeric_limits<Src>::is_specialized,
int>::type =
412 : value_(static_cast<
T>(value)),
420 template <
typename T>
426 template <
typename Src, NumericRepresentation type>
431 template <
typename Src>
435 typename enable_if<std::numeric_limits<Src>::is_integer,
int>::type = 0) {
436 switch (DstRangeRelationToSrcRange<T>(value)) {
438 value_ =
static_cast<T>(value);
442 value_ = -std::numeric_limits<T>::infinity();
446 value_ = std::numeric_limits<T>::infinity();
450 value_ = std::numeric_limits<T>::quiet_NaN();
455 template <
typename Src>
458 typename enable_if<std::numeric_limits<Src>::is_specialized,
int>::type =
460 : value_(static_cast<
T>(value)) {}
463 template <
typename Src>
465 : value_(static_cast<
T>(rhs.value())) {}
469 value_ >= -std::numeric_limits<T>::max());
485 template <
typename Lhs,
497 template <
typename Lhs,
typename Rhs>
502 template <
typename Lhs,
typename Rhs>
507 template <
typename Lhs,
typename Rhs>
516 template <
typename T,
typename Lhs,
typename Rhs>
518 static const bool value = !std::numeric_limits<T>::is_iec559 &&
521 sizeof(
T) >= (2 *
sizeof(Lhs)) &&
524 sizeof(
T) >= (2 *
sizeof(Rhs));
A JavaScript value representing a signed integer.
CheckedNumericState(const CheckedNumericState< Src > &rhs)
CheckedNumericState(Src value, RangeConstraint validity, typename enable_if< std::numeric_limits< Src >::is_integer, int >::type=0)
CheckedNumericState(Src value, typename enable_if< std::numeric_limits< Src >::is_specialized, int >::type=0)
RangeConstraint validity() const
CheckedNumericState(const CheckedNumericState< Src > &rhs)
CheckedNumericState(Src value, typename enable_if< std::numeric_limits< Src >::is_specialized, int >::type=0)
RangeConstraint validity_
RangeConstraint validity() const
CheckedNumericState(Src value, RangeConstraint validity)
enable harmony numeric enable harmony object literal extensions true
#define STATIC_ASSERT(test)
enable_if< std::numeric_limits< T >::is_integer &&std::numeric_limits< T >::is_signed, T >::type CheckedAbs(T value, RangeConstraint *validity)
integral_constant< bool, false > false_type
enable_if< std::numeric_limits< T >::is_integer, T >::type CheckedSub(T x, T y, RangeConstraint *validity)
ArithmeticPromotionCategory
enable_if< std::numeric_limits< T >::is_integer, T >::type CheckedAdd(T x, T y, RangeConstraint *validity)
RangeConstraint GetRangeConstraint(int integer_range_constraint)
RangeConstraint DstRangeRelationToSrcRange(Src value)
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)
integral_constant< bool, true > true_type
T CheckedDiv(T x, T y, RangeConstraint *validity, typename enable_if< std::numeric_limits< T >::is_integer, int >::type=0)
enable_if< std::numeric_limits< T >::is_integer &&std::numeric_limits< T >::is_signed, T >::type CheckedNeg(T value, RangeConstraint *validity)
enable_if< std::numeric_limits< T >::is_integer &&std::numeric_limits< T >::is_signed, T >::type CheckedMod(T x, T y, RangeConstraint *validity)
@ NUMERIC_RANGE_CONTAINED
static int min(int a, int b)
Debugger support for the V8 JavaScript engine.
#define BASE_FLOAT_ARITHMETIC_STUBS(NAME)
static const NumericRepresentation value
static const enable_if< std::numeric_limits< Integer >::is_integer, size_t >::type value
enable_if< std::numeric_limits< Integer >::is_integer, typename IntegerForSizeAndSign< sizeof(Integer), true >::type >::type type
enable_if< std::numeric_limits< Integer >::is_integer, typename IntegerForSizeAndSign< sizeof(Integer) *2, std::numeric_limits< Integer >::is_signed >::type >::type type
enable_if< std::numeric_limits< Integer >::is_integer, typename IntegerForSizeAndSign< sizeof(Integer), false >::type >::type type
integral_constant< T, v > type
#define T(name, string, precedence)