2019-01-02 22:38:03 +05:00
|
|
|
#ifndef NETGEN_CORE_UTILS_HPP
|
|
|
|
#define NETGEN_CORE_UTILS_HPP
|
|
|
|
|
2019-01-03 19:54:50 +05:00
|
|
|
#include <chrono>
|
2019-01-02 22:38:03 +05:00
|
|
|
#include <sstream>
|
2019-01-03 19:54:50 +05:00
|
|
|
#include <string>
|
|
|
|
#include <x86intrin.h> // for __rdtsc() CPU time step counter
|
2019-01-02 22:38:03 +05:00
|
|
|
|
|
|
|
#include "ngcore_api.hpp" // for NGCORE_API
|
|
|
|
|
|
|
|
namespace ngcore
|
|
|
|
{
|
|
|
|
NGCORE_API std::string Demangle(const char* typeinfo);
|
|
|
|
|
|
|
|
#if defined(__GNUC__)
|
|
|
|
inline bool likely (bool x) { return bool(__builtin_expect(long(x), 1L)); }
|
|
|
|
inline bool unlikely (bool x) { return bool(__builtin_expect(long(x), 0L)); }
|
|
|
|
#else
|
|
|
|
inline bool likely (bool x) { return x; }
|
|
|
|
inline bool unlikely (bool x) { return x; }
|
|
|
|
#endif
|
|
|
|
|
2019-01-03 19:54:50 +05:00
|
|
|
using TClock = std::chrono::system_clock;
|
|
|
|
extern NGCORE_API const std::chrono::time_point<TClock> wall_time_start;
|
|
|
|
|
|
|
|
// Time in seconds since program start
|
|
|
|
inline double WallTime () noexcept
|
|
|
|
{
|
|
|
|
std::chrono::time_point<TClock> now = TClock::now();
|
|
|
|
std::chrono::duration<double> elapsed_seconds = now-wall_time_start;
|
|
|
|
return elapsed_seconds.count();
|
|
|
|
}
|
|
|
|
|
|
|
|
// High precision clock counter register
|
|
|
|
using TTimePoint = size_t;
|
|
|
|
extern NGCORE_API double ticks_per_second;
|
|
|
|
|
|
|
|
inline TTimePoint GetTimeCounter() noexcept
|
|
|
|
{
|
|
|
|
return TTimePoint(__rdtsc());
|
|
|
|
}
|
|
|
|
|
|
|
|
template <class T>
|
|
|
|
inline std::string ToString (const T& t)
|
|
|
|
{
|
|
|
|
std::stringstream ss;
|
|
|
|
ss << t;
|
|
|
|
return ss.str();
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2019-01-02 22:38:03 +05:00
|
|
|
} // namespace ngcore
|
|
|
|
|
|
|
|
#endif // NETGEN_CORE_UTILS_HPP
|