// 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_
