Make it compile with Visual Studio 2013.
diff --git a/include/benchmark/macros.h b/include/benchmark/macros.h
index 5e75ed3..3e9540e 100644
--- a/include/benchmark/macros.h
+++ b/include/benchmark/macros.h
@@ -27,12 +27,16 @@
#if defined(__GNUC__)
# define BENCHMARK_UNUSED __attribute__((unused))
# define BENCHMARK_ALWAYS_INLINE __attribute__((always_inline))
+# define BENCHMARK_NOEXCEPT noexcept
#elif defined(_MSC_VER) && !defined(__clang__)
# define BENCHMARK_UNUSED
# define BENCHMARK_ALWAYS_INLINE __forceinline
+# define BENCHMARK_NOEXCEPT
+# define __func__ __FUNCTION__
#else
# define BENCHMARK_UNUSED
# define BENCHMARK_ALWAYS_INLINE
+# define BENCHMARK_NOEXCEPT
#endif
#if defined(__GNUC__)
diff --git a/src/benchmark.cc b/src/benchmark.cc
index 56104ac..1168124 100644
--- a/src/benchmark.cc
+++ b/src/benchmark.cc
@@ -15,11 +15,11 @@
#include "benchmark/benchmark.h"
#include "internal_macros.h"
-#include <sys/time.h>
#ifndef OS_WINDOWS
+#include <sys/time.h>
#include <sys/resource.h>
-#endif
#include <unistd.h>
+#endif
#include <cstdlib>
#include <cstring>
diff --git a/src/cycleclock.h b/src/cycleclock.h
index b87a879..955c5d7 100644
--- a/src/cycleclock.h
+++ b/src/cycleclock.h
@@ -40,7 +40,10 @@
extern "C" uint64_t __rdtsc();
#pragma intrinsic(__rdtsc)
#endif
+
+#if !defined(OS_WINDOWS)
#include <sys/time.h>
+#endif
namespace benchmark {
// NOTE: only i386 and x86_64 have been well tested.
diff --git a/src/string_util.h b/src/string_util.h
index e83abbc..b89fef5 100644
--- a/src/string_util.h
+++ b/src/string_util.h
@@ -4,6 +4,7 @@
#include <string>
#include <sstream>
#include <utility>
+#include "internal_macros.h"
namespace benchmark {
@@ -14,7 +15,7 @@
std::string StringPrintF(const char* format, ...);
inline std::ostream&
-StringCatImp(std::ostream& out) noexcept
+StringCatImp(std::ostream& out) BENCHMARK_NOEXCEPT
{
return out;
}
diff --git a/src/walltime.cc b/src/walltime.cc
index 65ae610..367ad55 100644
--- a/src/walltime.cc
+++ b/src/walltime.cc
@@ -13,8 +13,15 @@
// limitations under the License.
#include "walltime.h"
+#include "benchmark/macros.h"
+#include "internal_macros.h"
+#if defined(OS_WINDOWS)
+#include <time.h>
+#include <winsock.h> // for timeval
+#else
#include <sys/time.h>
+#endif
#include <cstdio>
#include <cstdint>
@@ -92,7 +99,22 @@
WallTime Slow() const {
struct timeval tv;
+#if defined(OS_WINDOWS)
+ FILETIME file_time;
+ SYSTEMTIME system_time;
+ ULARGE_INTEGER ularge;
+ const unsigned __int64 epoch = 116444736000000000LL;
+
+ GetSystemTime(&system_time);
+ SystemTimeToFileTime(&system_time, &file_time);
+ ularge.LowPart = file_time.dwLowDateTime;
+ ularge.HighPart = file_time.dwHighDateTime;
+
+ tv.tv_sec = (long)((ularge.QuadPart - epoch) / 10000000L);
+ tv.tv_usec = (long)(system_time.wMilliseconds * 1000);
+#else
gettimeofday(&tv, nullptr);
+#endif
return tv.tv_sec + tv.tv_usec * 1e-6;
}
@@ -100,8 +122,6 @@
static_assert(sizeof(float) <= sizeof(int32_t),
"type sizes don't allow the drift_adjust hack");
- static constexpr double kMaxErrorInterval = 100e-6;
-
WallTime base_walltime_;
int64_t base_cycletime_;
int64_t cycles_per_second_;
@@ -147,7 +167,8 @@
cycles_per_second_(0), seconds_per_cycle_(0.0),
last_adjust_time_(0), drift_adjust_(0),
max_interval_cycles_(0) {
- cycles_per_second_ = static_cast<int64_t>(CyclesPerSecond());
+ const double kMaxErrorInterval = 100e-6;
+ cycles_per_second_ = static_cast<int64_t>(CyclesPerSecond());
CHECK(cycles_per_second_ != 0);
seconds_per_cycle_ = 1.0 / cycles_per_second_;
max_interval_cycles_ =
@@ -213,15 +234,27 @@
typedef std::chrono::system_clock Clock;
std::time_t now = Clock::to_time_t(Clock::now());
char storage[128];
+ std::size_t written;
- std::tm timeinfo;
- std::memset(&timeinfo, 0, sizeof(std::tm));
if (local) {
- localtime_r(&now, &timeinfo);
+#if defined(OS_WINDOWS)
+ written = std::strftime(storage, sizeof(storage), "%x %X", ::localtime(&now));
+#else
+ std::tm timeinfo;
+ std::memset(&timeinfo, 0, sizeof(std::tm));
+ ::localtime_r(&now, &timeinfo);
+ written = std::strftime(storage, sizeof(storage), "%F %T", &timeinfo);
+#endif
} else {
- gmtime_r(&now, &timeinfo);
+#if defined(OS_WINDOWS)
+ written = std::strftime(storage, sizeof(storage), "%x %X", ::gmtime(&now));
+#else
+ std::tm timeinfo;
+ std::memset(&timeinfo, 0, sizeof(std::tm));
+ ::gmtime_r(&now, &timeinfo);
+ written = std::strftime(storage, sizeof(storage), "%F %T", &timeinfo);
+#endif
}
- std::size_t written = std::strftime(storage, sizeof(storage), "%F %T", &timeinfo);
CHECK(written < arraysize(storage));
((void)written); // prevent unused variable in optimized mode.
return std::string(storage);