text: /**
  * hdr_time.h
  * Written by Michael Barker and Philip Orwig and released to the public domain,
  * as explained at http://creativecommons.org/publicdomain/zero/1.0/
  */
  
  #include "hdr_time.h"
  
  #if defined(_WIN32) || defined(_WIN64)
  
  #if !defined(WIN32_LEAN_AND_MEAN)
  #define WIN32_LEAN_AND_MEAN
  #endif
  
  #include <windows.h>
  
  static int s_clockPeriodSet = 0;
  static double s_clockPeriod = 1.0;
  
  void hdr_gettime(hdr_timespec* t)
  {
      LARGE_INTEGER num;
      /* if this is distasteful, we can add in an hdr_time_init() */
      if (!s_clockPeriodSet)
      {
          QueryPerformanceFrequency(&num);
          s_clockPeriod = 1.0 / (double) num.QuadPart;
          s_clockPeriodSet = 1;
      }
  
      QueryPerformanceCounter(&num);
      double seconds = num.QuadPart * s_clockPeriod;
      double integral;
      double remainder = modf(seconds, &integral);
  
      t->tv_sec  = (long) integral;
      t->tv_nsec = (long) (remainder * 1000000000);
  }
  
  #elif defined(__APPLE__)
  
  #include <mach/clock.h>
  #include <mach/mach.h>
  
  
  void hdr_gettime(hdr_timespec* ts)
  {
      clock_serv_t cclock;
      mach_timespec_t mts;
      host_get_clock_service(mach_host_self(), CALENDAR_CLOCK, &cclock);
      clock_get_time(cclock, &mts);
      mach_port_deallocate(mach_task_self(), cclock);
      ts->tv_sec = mts.tv_sec;
      ts->tv_nsec = mts.tv_nsec;
  }
  
  #elif defined(__linux__) || defined(__CYGWIN__)
  
  
  void hdr_gettime(hdr_timespec* t)
  {
      clock_gettime(CLOCK_MONOTONIC, (struct timespec*)t);
  }
  
  #else
  
  #warning "Platform not supported\n"
  
  #endif
  
  