2020-11-16 14:47:43 +08:00
|
|
|
//////////////////////////////////////////////////////////////////////////////////////////
|
2023-01-10 22:19:30 +08:00
|
|
|
// A multi-platform support c++11 library with focus on asynchronous socket I/O for any
|
2021-01-14 15:30:18 +08:00
|
|
|
// client application.
|
2020-11-16 14:47:43 +08:00
|
|
|
//////////////////////////////////////////////////////////////////////////////////////////
|
|
|
|
/*
|
|
|
|
The MIT License (MIT)
|
|
|
|
|
2023-01-01 17:36:38 +08:00
|
|
|
Copyright (c) 2012-2023 HALX99
|
2020-11-16 14:47:43 +08:00
|
|
|
|
|
|
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
|
|
of this software and associated documentation files (the "Software"), to deal
|
|
|
|
in the Software without restriction, including without limitation the rights
|
|
|
|
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
|
|
copies of the Software, and to permit persons to whom the Software is
|
|
|
|
furnished to do so, subject to the following conditions:
|
|
|
|
|
|
|
|
The above copyright notice and this permission notice shall be included in all
|
|
|
|
copies or substantial portions of the Software.
|
|
|
|
|
|
|
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
|
|
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
|
|
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
|
|
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
|
|
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
|
|
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
|
|
SOFTWARE.
|
|
|
|
*/
|
|
|
|
#ifndef YASIO__UTILS_HPP
|
|
|
|
#define YASIO__UTILS_HPP
|
|
|
|
#include <assert.h>
|
2023-01-10 22:19:30 +08:00
|
|
|
#include <sys/stat.h>
|
2020-11-16 14:47:43 +08:00
|
|
|
#include <chrono>
|
|
|
|
#include <algorithm>
|
|
|
|
#include "yasio/compiler/feature_test.hpp"
|
|
|
|
|
|
|
|
namespace yasio
|
|
|
|
{
|
|
|
|
// typedefs
|
|
|
|
typedef long long highp_time_t;
|
2023-04-17 00:28:05 +08:00
|
|
|
#if YASIO__HAS_CXX11
|
|
|
|
typedef std::chrono::steady_clock steady_clock_t;
|
|
|
|
#else
|
2020-11-16 14:47:43 +08:00
|
|
|
typedef std::chrono::high_resolution_clock steady_clock_t;
|
2023-04-17 00:28:05 +08:00
|
|
|
#endif
|
2020-11-16 14:47:43 +08:00
|
|
|
typedef std::chrono::system_clock system_clock_t;
|
|
|
|
|
|
|
|
// The high precision nano seconds timestamp since epoch
|
2023-01-10 22:19:30 +08:00
|
|
|
template <typename _Ty = steady_clock_t>
|
|
|
|
inline highp_time_t xhighp_clock()
|
2020-11-16 14:47:43 +08:00
|
|
|
{
|
|
|
|
auto duration = _Ty::now().time_since_epoch();
|
|
|
|
return std::chrono::duration_cast<std::chrono::nanoseconds>(duration).count();
|
|
|
|
}
|
|
|
|
// The high precision micro seconds timestamp since epoch
|
2023-01-10 22:19:30 +08:00
|
|
|
template <typename _Ty = steady_clock_t>
|
|
|
|
inline highp_time_t highp_clock()
|
2020-11-16 14:47:43 +08:00
|
|
|
{
|
|
|
|
return xhighp_clock<_Ty>() / std::milli::den;
|
|
|
|
}
|
|
|
|
// The normal precision milli seconds timestamp since epoch
|
2023-01-10 22:19:30 +08:00
|
|
|
template <typename _Ty = steady_clock_t>
|
|
|
|
inline highp_time_t clock()
|
2020-11-16 14:47:43 +08:00
|
|
|
{
|
|
|
|
return xhighp_clock<_Ty>() / std::micro::den;
|
|
|
|
}
|
|
|
|
// The time now in seconds since epoch, better performance than chrono on win32
|
|
|
|
// see: win10 sdk ucrt/time/time.cpp:common_time
|
|
|
|
// https://docs.microsoft.com/en-us/windows/desktop/sysinfo/acquiring-high-resolution-time-stamps
|
|
|
|
inline highp_time_t time_now() { return ::time(nullptr); }
|
|
|
|
|
|
|
|
#if YASIO__HAS_CXX17
|
|
|
|
using std::clamp;
|
|
|
|
#else
|
2023-01-10 22:19:30 +08:00
|
|
|
template <typename _Ty>
|
|
|
|
const _Ty& clamp(const _Ty& v, const _Ty& lo, const _Ty& hi)
|
2020-11-16 14:47:43 +08:00
|
|
|
{
|
|
|
|
assert(!(hi < lo));
|
|
|
|
return v < lo ? lo : hi < v ? hi : v;
|
|
|
|
}
|
|
|
|
#endif
|
|
|
|
|
2023-01-10 22:19:30 +08:00
|
|
|
template <typename _Ty>
|
|
|
|
inline void invoke_dtor(_Ty* p)
|
|
|
|
{
|
|
|
|
p->~_Ty();
|
|
|
|
}
|
|
|
|
|
|
|
|
inline bool is_regular_file(const char* path)
|
|
|
|
{
|
|
|
|
struct stat st;
|
|
|
|
return (::stat(path, &st) == 0) && (st.st_mode & S_IFREG);
|
|
|
|
}
|
|
|
|
|
2020-11-16 14:47:43 +08:00
|
|
|
} // namespace yasio
|
|
|
|
|
|
|
|
#endif
|