blob: 5fd6016762889088ef579ac8eb9b59ef1c9afb93 [file] [log] [blame]
// Copyright (c) 2011, the Dart project authors. Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.
#ifndef RUNTIME_PLATFORM_C99_SUPPORT_WIN_H_
#define RUNTIME_PLATFORM_C99_SUPPORT_WIN_H_
#if defined(_MSC_VER) && (_MSC_VER < 1800)
// Before Visual Studio 2013 Visual C++ was missing a bunch of C99 math macros
// and functions. Define them here.
#include <float.h>
#include <string.h>
#include <cmath>
static const unsigned __int64 kQuietNaNMask =
static_cast<unsigned __int64>(0xfff) << 51;
#ifndef va_copy
#define va_copy(dst, src) (memmove(&(dst), &(src), sizeof(dst)))
#endif /* va_copy */
#define NAN *reinterpret_cast<const double*>(&kQuietNaNMask)
namespace std {
static inline int isinf(double x) {
return (_fpclass(x) & (_FPCLASS_PINF | _FPCLASS_NINF)) != 0;
}
static inline int isnan(double x) {
return _isnan(x);
}
static inline int signbit(double x) {
if (x == 0) {
return _fpclass(x) & _FPCLASS_NZ;
} else {
return x < 0;
}
}
} // namespace std
static inline double trunc(double x) {
if (x < 0) {
return ceil(x);
} else {
return floor(x);
}
}
static inline double round(double x) {
if (!_finite(x)) {
return x;
}
double intpart;
double fractpart = modf(x, &intpart);
if (fractpart >= 0.5) {
return intpart + 1;
} else if (fractpart > -0.5) {
return intpart;
} else {
return intpart - 1;
}
}
// Windows does not have strtoll defined.
#if defined(_MSC_VER)
#define strtoll _strtoi64
#endif
#endif
#endif // RUNTIME_PLATFORM_C99_SUPPORT_WIN_H_