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