Magic_Game/src/kiwano/core/Time.h

285 lines
7.5 KiB
C
Raw Normal View History

2019-11-13 14:33:15 +08:00
// Copyright (c) 2016-2018 Kiwano - Nomango
2020-01-21 10:09:55 +08:00
//
2019-11-13 14:33:15 +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:
2020-01-21 10:09:55 +08:00
//
2019-11-13 14:33:15 +08:00
// The above copyright notice and this permission notice shall be included in
// all copies or substantial portions of the Software.
2020-01-21 10:09:55 +08:00
//
2019-11-13 14:33:15 +08:00
// 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.
#pragma once
2020-01-17 16:55:47 +08:00
#include <kiwano/core/Common.h>
2019-11-13 14:33:15 +08:00
namespace kiwano
{
2020-01-21 10:09:55 +08:00
/**
* \~chinese
2020-02-10 17:32:04 +08:00
* @brief
2020-01-21 10:09:55 +08:00
* @par
2020-02-10 17:32:04 +08:00
* :
2020-01-21 10:09:55 +08:00
* @code
2020-02-10 17:32:04 +08:00
* time::Second * 5 // 5 秒
* time::Hour * 1.5 // 1.5 小时
* time::Hour * 3 + time::Minute * 45 + time::Second * 15 // 3 小时 45 分 15
*
2020-01-21 10:09:55 +08:00
* @endcode
2020-02-10 17:32:04 +08:00
* VS2015 使 time literals:
2020-01-21 10:09:55 +08:00
* @code
* using namespace kiwano;
2020-02-10 17:32:04 +08:00
* 5_sec // 5 秒
* 1.5_hour // 1.5 小时
* 3_hour + 45_min + 15_sec // 3 小时 45 分 15 秒
2020-01-21 10:09:55 +08:00
* @endcode
*/
struct KGE_API Duration
{
/// \~chinese
2020-02-10 17:32:04 +08:00
/// @brief 构造时间段
2020-01-21 10:09:55 +08:00
Duration();
/// \~chinese
2020-02-10 17:32:04 +08:00
/// @brief 构造时间段
/// @param milliseconds 毫秒数
2020-01-21 10:09:55 +08:00
Duration(long milliseconds);
/// \~chinese
2020-02-10 17:32:04 +08:00
/// @brief 获取毫秒数
2020-01-21 10:09:55 +08:00
long Milliseconds() const;
/// \~chinese
2020-02-10 17:32:04 +08:00
/// @brief 获取秒数
2020-01-21 10:09:55 +08:00
float Seconds() const;
/// \~chinese
2020-02-10 17:32:04 +08:00
/// @brief 获取分钟数
2020-01-21 10:09:55 +08:00
float Minutes() const;
/// \~chinese
2020-02-10 17:32:04 +08:00
/// @brief 获取小时数
2020-01-21 10:09:55 +08:00
float Hours() const;
/// \~chinese
2020-02-10 17:32:04 +08:00
/// @brief 时长是否是零
/// @return 若时长是零返回true
2020-01-21 10:09:55 +08:00
bool IsZero() const;
/// \~chinese
2020-02-10 17:32:04 +08:00
/// @brief 设置毫秒数
/// @param ms 毫秒数
2020-01-21 10:09:55 +08:00
void SetMilliseconds(long ms);
/// \~chinese
2020-02-10 17:32:04 +08:00
/// @brief 设置秒数
/// @param seconds 秒数
2020-01-21 10:09:55 +08:00
void SetSeconds(float seconds);
/// \~chinese
2020-02-10 17:32:04 +08:00
/// @brief 设置分钟数
/// @param minutes 分钟数
2020-01-21 10:09:55 +08:00
void SetMinutes(float minutes);
/// \~chinese
2020-02-10 17:32:04 +08:00
/// @brief 设置小时数
/// @param hours 小时数
2020-01-21 10:09:55 +08:00
void SetHours(float hours);
/// \~chinese
2020-02-10 17:32:04 +08:00
/// @brief 转为字符串
2020-01-21 10:09:55 +08:00
String ToString() const;
/// \~chinese
2020-02-10 17:32:04 +08:00
/// @brief 解析时间段字符串
/// @param str 时间段字符串
2020-01-21 10:09:55 +08:00
/// @details
2020-02-10 17:32:04 +08:00
/// 时间段字符串允许是有符号的浮点数, 并且带有时间单位后缀
/// 例如: "300ms", "-1.5h", "2h45m"
/// 允许的时间单位有 "ms", "s", "m", "h"
/// @return 解析出的时间段
2020-02-13 22:35:04 +08:00
/// @throw std::runtime_error 传入一个不合法的格式时抛出
2020-01-21 10:09:55 +08:00
static Duration Parse(const String& str);
2020-02-10 17:32:04 +08:00
static const Duration Ms; ///< 毫秒
static const Duration Second; ///< 秒
static const Duration Minute; ///< 分钟
static const Duration Hour; ///< 小时
2020-01-21 10:09:55 +08:00
bool operator==(const Duration&) const;
bool operator!=(const Duration&) const;
bool operator>(const Duration&) const;
bool operator>=(const Duration&) const;
bool operator<(const Duration&) const;
bool operator<=(const Duration&) const;
float operator/(const Duration&) const;
const Duration operator+(const Duration&) const;
const Duration operator-(const Duration&) const;
const Duration operator-() const;
const Duration operator*(int)const;
const Duration operator*(unsigned long long)const;
const Duration operator*(float)const;
const Duration operator*(double)const;
const Duration operator*(long double)const;
const Duration operator/(int) const;
const Duration operator/(float) const;
const Duration operator/(double) const;
Duration& operator+=(const Duration&);
Duration& operator-=(const Duration&);
Duration& operator*=(int);
Duration& operator*=(float);
Duration& operator*=(double);
Duration& operator/=(int);
Duration& operator/=(float);
Duration& operator/=(double);
friend const Duration operator*(int, const Duration&);
friend const Duration operator*(float, const Duration&);
friend const Duration operator*(double, const Duration&);
friend const Duration operator*(long double, const Duration&);
friend const Duration operator/(int, const Duration&);
friend const Duration operator/(float, const Duration&);
friend const Duration operator/(double, const Duration&);
private:
long milliseconds_;
};
/**
* \~chinese
2020-02-10 17:32:04 +08:00
* @brief
* @par
2020-01-21 10:09:55 +08:00
* @code
2020-02-10 17:32:04 +08:00
* // 两时间相减, 可得到一个 Duration 对象
2020-01-21 10:09:55 +08:00
* Time t1 = Time::Now();
2020-02-10 17:32:04 +08:00
* // 等待一段时间后
2020-01-21 10:09:55 +08:00
* Time t2 = Time::Now();
2020-02-10 17:32:04 +08:00
* int ms = (t2 - t1).Milliseconds(); // 获取两时间相差的毫秒数
2020-01-21 10:09:55 +08:00
* @endcode
2020-02-10 17:32:04 +08:00
* @note
2020-01-21 10:09:55 +08:00
*/
struct KGE_API Time
{
Time();
/// \~chinese
2020-02-10 17:32:04 +08:00
/// @brief 是否是零时
/// @return 若是零时返回true
2020-01-21 10:09:55 +08:00
bool IsZero() const;
/// \~chinese
2020-02-10 17:32:04 +08:00
/// @brief 获取当前时间
2020-01-21 10:09:55 +08:00
static Time Now() noexcept;
const Duration operator-(const Time&) const;
const Time operator+(const Duration&) const;
const Time operator-(const Duration&) const;
Time& operator+=(const Duration&);
Time& operator-=(const Duration&);
private:
Time(long ms);
private:
long dur_;
};
inline long Duration::Milliseconds() const
{
return milliseconds_;
}
inline bool Duration::IsZero() const
{
return milliseconds_ == 0LL;
}
inline void Duration::SetMilliseconds(long ms)
{
milliseconds_ = ms;
}
inline void Duration::SetSeconds(float seconds)
{
milliseconds_ = static_cast<long>(seconds * 1000.f);
}
inline void Duration::SetMinutes(float minutes)
{
milliseconds_ = static_cast<long>(minutes * 60 * 1000.f);
}
inline void Duration::SetHours(float hours)
{
milliseconds_ = static_cast<long>(hours * 60 * 60 * 1000.f);
}
inline bool Time::IsZero() const
{
return dur_ == 0;
2019-11-13 14:33:15 +08:00
}
2020-01-21 10:09:55 +08:00
} // namespace kiwano
2019-11-13 14:33:15 +08:00
2020-02-14 22:59:29 +08:00
#if defined(KGE_HAS_LITERALS)
2019-11-13 14:33:15 +08:00
namespace kiwano
{
2020-01-21 10:09:55 +08:00
inline namespace literals
{
inline const kiwano::Duration operator"" _msec(long double val)
{
return kiwano::Duration::Ms * val;
}
inline const kiwano::Duration operator"" _msec(unsigned long long val)
{
return kiwano::Duration::Ms * val;
}
inline const kiwano::Duration operator"" _sec(long double val)
{
return kiwano::Duration::Second * val;
}
inline const kiwano::Duration operator"" _sec(unsigned long long val)
{
return kiwano::Duration::Second * val;
}
inline const kiwano::Duration operator"" _min(long double val)
{
return kiwano::Duration::Minute * val;
}
inline const kiwano::Duration operator"" _min(unsigned long long val)
{
return kiwano::Duration::Minute * val;
}
inline const kiwano::Duration operator"" _hour(long double val)
{
return kiwano::Duration::Hour * val;
}
inline const kiwano::Duration operator"" _hour(unsigned long long val)
{
return kiwano::Duration::Hour * val;
2019-11-13 14:33:15 +08:00
}
2020-01-21 10:09:55 +08:00
} // namespace literals
} // namespace kiwano
2019-11-13 14:33:15 +08:00
#endif