| 
									
										
										
										
											2018-11-08 21:39:26 +08:00
										 |  |  |  | // Copyright (c) 2016-2018 Easy2D - Nomango
 | 
					
						
							|  |  |  |  | // 
 | 
					
						
							|  |  |  |  | // 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.
 | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | #pragma once
 | 
					
						
							|  |  |  |  | #include "macros.h"
 | 
					
						
							| 
									
										
										
										
											2018-11-11 16:32:12 +08:00
										 |  |  |  | #include <cstdint>
 | 
					
						
							| 
									
										
										
										
											2018-11-08 21:39:26 +08:00
										 |  |  |  | 
 | 
					
						
							|  |  |  |  | namespace easy2d | 
					
						
							|  |  |  |  | { | 
					
						
							|  |  |  |  | 	namespace time | 
					
						
							|  |  |  |  | 	{ | 
					
						
							|  |  |  |  | 		// ʱ<><CAB1><EFBFBD><EFBFBD>
 | 
					
						
							|  |  |  |  | 		//
 | 
					
						
							|  |  |  |  | 		// Usage:
 | 
					
						
							|  |  |  |  | 		//     ʱ<><CAB1><EFBFBD>α<EFBFBD>ʾ<EFBFBD><CABE>:
 | 
					
						
							|  |  |  |  | 		//         5 <20><>: time::Second * 5
 | 
					
						
							|  |  |  |  | 		//         1.5 Сʱ: time::Hour * 1.5
 | 
					
						
							|  |  |  |  | 		//         3 Сʱ 45 <20><> 15 <20><>: time::Hour * 3 + time::Minute * 45 + time::Second * 15
 | 
					
						
							|  |  |  |  | 		//     ʱ<><CAB1><EFBFBD>θ<EFBFBD>ʽ<EFBFBD><CABD>: auto d = time::ParseDuration(L"1h35m");  // 1Сʱ35<33><35><EFBFBD><EFBFBD>
 | 
					
						
							| 
									
										
										
										
											2018-11-11 16:32:12 +08:00
										 |  |  |  | 		//     <20><> VS2015 <20><><EFBFBD><EFBFBD><EFBFBD>߰汾<DFB0><E6B1BE><EFBFBD><EFBFBD>ʹ<EFBFBD><CAB9> time literals:
 | 
					
						
							|  |  |  |  | 		//         5 <20><>: 5_s
 | 
					
						
							|  |  |  |  | 		//         1.5 Сʱ: 1.5_h
 | 
					
						
							|  |  |  |  | 		//         3 Сʱ 45 <20><> 15 <20><>: 3_h + 45_m + 15_s
 | 
					
						
							|  |  |  |  | 		//
 | 
					
						
							| 
									
										
										
										
											2018-11-08 21:39:26 +08:00
										 |  |  |  | 		class Duration | 
					
						
							|  |  |  |  | 		{ | 
					
						
							|  |  |  |  | 		public: | 
					
						
							|  |  |  |  | 			Duration(); | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | 			explicit Duration( | 
					
						
							| 
									
										
										
										
											2018-11-11 16:32:12 +08:00
										 |  |  |  | 				int64_t milliseconds | 
					
						
							| 
									
										
										
										
											2018-11-08 21:39:26 +08:00
										 |  |  |  | 			); | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | 			// ת<><D7AA>Ϊ<EFBFBD><CEAA><EFBFBD><EFBFBD>
 | 
					
						
							| 
									
										
										
										
											2018-11-11 16:32:12 +08:00
										 |  |  |  | 			int64_t Milliseconds() const; | 
					
						
							| 
									
										
										
										
											2018-11-08 21:39:26 +08:00
										 |  |  |  | 
 | 
					
						
							|  |  |  |  | 			// ת<><D7AA>Ϊ<EFBFBD><CEAA>
 | 
					
						
							|  |  |  |  | 			float Seconds() const; | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | 			// ת<><D7AA>Ϊ<EFBFBD><CEAA><EFBFBD><EFBFBD>
 | 
					
						
							|  |  |  |  | 			float Minutes() const; | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | 			// ת<><D7AA>ΪСʱ
 | 
					
						
							|  |  |  |  | 			float Hours() const; | 
					
						
							|  |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-11-11 16:32:12 +08:00
										 |  |  |  | 			// תΪ<D7AA>ַ<EFBFBD><D6B7><EFBFBD>
 | 
					
						
							|  |  |  |  | 			std::wstring ToString() const; | 
					
						
							|  |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-11-08 21:39:26 +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; | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | 			Duration operator + (const Duration &) const; | 
					
						
							|  |  |  |  | 			Duration operator - (const Duration &) const; | 
					
						
							|  |  |  |  | 			Duration operator - () const; | 
					
						
							|  |  |  |  | 			Duration operator * (int) const; | 
					
						
							| 
									
										
										
										
											2018-11-11 16:32:12 +08:00
										 |  |  |  | 			Duration operator * (unsigned long long) const; | 
					
						
							| 
									
										
										
										
											2018-11-08 21:39:26 +08:00
										 |  |  |  | 			Duration operator * (float) const; | 
					
						
							|  |  |  |  | 			Duration operator * (double) const; | 
					
						
							| 
									
										
										
										
											2018-11-11 16:32:12 +08:00
										 |  |  |  | 			Duration operator * (long double) const; | 
					
						
							| 
									
										
										
										
											2018-11-08 21:39:26 +08:00
										 |  |  |  | 			Duration operator / (int) const; | 
					
						
							| 
									
										
										
										
											2018-11-11 16:32:12 +08:00
										 |  |  |  | 			Duration operator / (unsigned long long) const; | 
					
						
							| 
									
										
										
										
											2018-11-08 21:39:26 +08:00
										 |  |  |  | 			Duration operator / (float) const; | 
					
						
							|  |  |  |  | 			Duration operator / (double) const; | 
					
						
							| 
									
										
										
										
											2018-11-11 16:32:12 +08:00
										 |  |  |  | 			Duration operator / (long double) const; | 
					
						
							| 
									
										
										
										
											2018-11-08 21:39:26 +08:00
										 |  |  |  | 
 | 
					
						
							|  |  |  |  | 			Duration& operator += (const Duration &); | 
					
						
							|  |  |  |  | 			Duration& operator -= (const Duration &); | 
					
						
							|  |  |  |  | 			Duration& operator *= (int); | 
					
						
							| 
									
										
										
										
											2018-11-11 16:32:12 +08:00
										 |  |  |  | 			Duration& operator *= (unsigned long long); | 
					
						
							| 
									
										
										
										
											2018-11-08 21:39:26 +08:00
										 |  |  |  | 			Duration& operator *= (float); | 
					
						
							|  |  |  |  | 			Duration& operator *= (double); | 
					
						
							| 
									
										
										
										
											2018-11-11 16:32:12 +08:00
										 |  |  |  | 			Duration& operator *= (long double); | 
					
						
							| 
									
										
										
										
											2018-11-08 21:39:26 +08:00
										 |  |  |  | 			Duration& operator /= (int); | 
					
						
							| 
									
										
										
										
											2018-11-11 16:32:12 +08:00
										 |  |  |  | 			Duration& operator /= (unsigned long long); | 
					
						
							| 
									
										
										
										
											2018-11-08 21:39:26 +08:00
										 |  |  |  | 			Duration& operator /= (float); | 
					
						
							|  |  |  |  | 			Duration& operator /= (double); | 
					
						
							| 
									
										
										
										
											2018-11-11 16:32:12 +08:00
										 |  |  |  | 			Duration& operator /= (long double); | 
					
						
							| 
									
										
										
										
											2018-11-08 21:39:26 +08:00
										 |  |  |  | 
 | 
					
						
							|  |  |  |  | 			friend Duration operator* (int, const Duration &); | 
					
						
							| 
									
										
										
										
											2018-11-11 16:32:12 +08:00
										 |  |  |  | 			friend Duration operator* (unsigned long long, const Duration &); | 
					
						
							| 
									
										
										
										
											2018-11-08 21:39:26 +08:00
										 |  |  |  | 			friend Duration operator* (float, const Duration &); | 
					
						
							|  |  |  |  | 			friend Duration operator* (double, const Duration &); | 
					
						
							| 
									
										
										
										
											2018-11-11 16:32:12 +08:00
										 |  |  |  | 			friend Duration operator* (long double, const Duration &); | 
					
						
							| 
									
										
										
										
											2018-11-08 21:39:26 +08:00
										 |  |  |  | 			friend Duration operator/ (int, const Duration &); | 
					
						
							| 
									
										
										
										
											2018-11-11 16:32:12 +08:00
										 |  |  |  | 			friend Duration operator/ (unsigned long long, const Duration &); | 
					
						
							| 
									
										
										
										
											2018-11-08 21:39:26 +08:00
										 |  |  |  | 			friend Duration operator/ (float, const Duration &); | 
					
						
							|  |  |  |  | 			friend Duration operator/ (double, const Duration &); | 
					
						
							| 
									
										
										
										
											2018-11-11 16:32:12 +08:00
										 |  |  |  | 			friend Duration operator/ (long double, const Duration &); | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | 			friend std::wostream& operator<< (std::wostream &, const Duration &); | 
					
						
							|  |  |  |  | 			friend std::wistream& operator>> (std::wistream &, Duration &); | 
					
						
							| 
									
										
										
										
											2018-11-08 21:39:26 +08:00
										 |  |  |  | 
 | 
					
						
							|  |  |  |  | 		private: | 
					
						
							| 
									
										
										
										
											2018-11-11 16:32:12 +08:00
										 |  |  |  | 			int64_t milliseconds_; | 
					
						
							| 
									
										
										
										
											2018-11-08 21:39:26 +08:00
										 |  |  |  | 		}; | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | 		extern const Duration Millisecond;	// <20><><EFBFBD><EFBFBD>
 | 
					
						
							|  |  |  |  | 		extern const Duration Second;		// <20><>
 | 
					
						
							|  |  |  |  | 		extern const Duration Minute;		// <20><><EFBFBD><EFBFBD>
 | 
					
						
							|  |  |  |  | 		extern const Duration Hour;			// Сʱ
 | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | 		// ʱ<><CAB1>
 | 
					
						
							|  |  |  |  | 		//
 | 
					
						
							|  |  |  |  | 		// Usage:
 | 
					
						
							|  |  |  |  | 		//     <20><>ȡ<EFBFBD><C8A1>ǰʱ<C7B0><CAB1>: Time now = time::Now();
 | 
					
						
							|  |  |  |  | 		//     ʱ<><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>:
 | 
					
						
							|  |  |  |  | 		//         <20><>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, <20>õ<EFBFBD>һ<EFBFBD><D2BB> Duration <20><><EFBFBD><EFBFBD>, <20><><EFBFBD><EFBFBD>:
 | 
					
						
							|  |  |  |  | 		//         Time t1 = time::Now();
 | 
					
						
							|  |  |  |  | 		//         ...  // <20><>Щʲô
 | 
					
						
							|  |  |  |  | 		//         Time t2 = time::Now();
 | 
					
						
							|  |  |  |  | 		//         auto duration = t2 - t1;
 | 
					
						
							|  |  |  |  | 		//         <20><>ȡ<EFBFBD><C8A1>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ĺ<EFBFBD><C4BA><EFBFBD><EFBFBD><EFBFBD>:
 | 
					
						
							|  |  |  |  | 		//         int ms = duration.Milliseconds();
 | 
					
						
							|  |  |  |  | 		// 
 | 
					
						
							|  |  |  |  | 		class TimePoint | 
					
						
							|  |  |  |  | 		{ | 
					
						
							|  |  |  |  | 		public: | 
					
						
							|  |  |  |  | 			TimePoint(); | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | 			explicit TimePoint( | 
					
						
							| 
									
										
										
										
											2018-11-11 16:32:12 +08:00
										 |  |  |  | 				const Duration& dur_since_epoch | 
					
						
							|  |  |  |  | 			); | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | 			explicit TimePoint( | 
					
						
							|  |  |  |  | 				int64_t dur_since_epoch | 
					
						
							| 
									
										
										
										
											2018-11-08 21:39:26 +08:00
										 |  |  |  | 			); | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | 			TimePoint( | 
					
						
							|  |  |  |  | 				const TimePoint& other | 
					
						
							|  |  |  |  | 			); | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | 			TimePoint( | 
					
						
							|  |  |  |  | 				TimePoint&& other | 
					
						
							|  |  |  |  | 			); | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | 			// <20><>ȡʱ<C8A1><CAB1><EFBFBD><EFBFBD>
 | 
					
						
							|  |  |  |  | 			time_t GetTimeStamp() const; | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | 			// <20>Ƿ<EFBFBD><C7B7><EFBFBD><EFBFBD><EFBFBD>ʱ
 | 
					
						
							|  |  |  |  | 			bool IsZero() const; | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | 			TimePoint operator + (const Duration &) const; | 
					
						
							|  |  |  |  | 			TimePoint operator - (const Duration &) const; | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | 			TimePoint& operator += (const Duration &); | 
					
						
							|  |  |  |  | 			TimePoint& operator -= (const Duration &); | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | 			Duration operator - (const TimePoint &) const; | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | 			TimePoint& operator = (const TimePoint &) E2D_NOEXCEPT; | 
					
						
							|  |  |  |  | 			TimePoint& operator = (TimePoint &&) E2D_NOEXCEPT; | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | 		private: | 
					
						
							| 
									
										
										
										
											2018-11-11 16:32:12 +08:00
										 |  |  |  | 			Duration dur_since_epoch_; | 
					
						
							| 
									
										
										
										
											2018-11-08 21:39:26 +08:00
										 |  |  |  | 		}; | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | 		// <20><>ȡ<EFBFBD><C8A1>ǰʱ<C7B0><CAB1>
 | 
					
						
							|  |  |  |  | 		TimePoint Now(); | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | 		// ʱ<><CAB1><EFBFBD>θ<EFBFBD>ʽ<EFBFBD><CABD>
 | 
					
						
							|  |  |  |  | 		// ʱ<><CAB1><EFBFBD><EFBFBD><EFBFBD>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>з<EFBFBD><D0B7>ŵĸ<C5B5><C4B8><EFBFBD><EFBFBD><EFBFBD>, <20><><EFBFBD>Ҵ<EFBFBD><D2B4><EFBFBD>ʱ<EFBFBD>䵥λ<E4B5A5><CEBB>
 | 
					
						
							|  |  |  |  | 		// <20><><EFBFBD><EFBFBD>: "300ms", "-1.5h", "2h45m"
 | 
					
						
							|  |  |  |  | 		// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD>䵥λ<E4B5A5><CEBB> "ms", "s", "m", "h"
 | 
					
						
							|  |  |  |  | 		Duration ParseDuration(const std::wstring& parse_str); | 
					
						
							|  |  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2018-11-11 16:32:12 +08:00
										 |  |  |  | } | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | #if VS_VER >= VS_2015
 | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | namespace easy2d | 
					
						
							|  |  |  |  | { | 
					
						
							|  |  |  |  | 	inline namespace literals | 
					
						
							|  |  |  |  | 	{ | 
					
						
							|  |  |  |  | 		inline const easy2d::time::Duration operator "" _ms(long double val) | 
					
						
							|  |  |  |  | 		{ | 
					
						
							|  |  |  |  | 			return easy2d::time::Millisecond * val; | 
					
						
							|  |  |  |  | 		} | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | 		inline const easy2d::time::Duration operator "" _s(long double val) | 
					
						
							|  |  |  |  | 		{ | 
					
						
							|  |  |  |  | 			return easy2d::time::Second * val; | 
					
						
							|  |  |  |  | 		} | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | 		inline const easy2d::time::Duration operator "" _m(long double val) | 
					
						
							|  |  |  |  | 		{ | 
					
						
							|  |  |  |  | 			return easy2d::time::Minute * val; | 
					
						
							|  |  |  |  | 		} | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | 		inline const easy2d::time::Duration operator "" _h(long double val) | 
					
						
							|  |  |  |  | 		{ | 
					
						
							|  |  |  |  | 			return easy2d::time::Hour * val; | 
					
						
							|  |  |  |  | 		} | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | 		inline const easy2d::time::Duration operator "" _ms(unsigned long long val) | 
					
						
							|  |  |  |  | 		{ | 
					
						
							|  |  |  |  | 			return easy2d::time::Millisecond * val; | 
					
						
							|  |  |  |  | 		} | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | 		inline const easy2d::time::Duration operator "" _s(unsigned long long val) | 
					
						
							|  |  |  |  | 		{ | 
					
						
							|  |  |  |  | 			return easy2d::time::Second * val; | 
					
						
							|  |  |  |  | 		} | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | 		inline const easy2d::time::Duration operator "" _m(unsigned long long val) | 
					
						
							|  |  |  |  | 		{ | 
					
						
							|  |  |  |  | 			return easy2d::time::Minute * val; | 
					
						
							|  |  |  |  | 		} | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | 		inline const easy2d::time::Duration operator "" _h(unsigned long long val) | 
					
						
							|  |  |  |  | 		{ | 
					
						
							|  |  |  |  | 			return easy2d::time::Hour * val; | 
					
						
							|  |  |  |  | 		} | 
					
						
							|  |  |  |  | 	} | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | 	namespace time | 
					
						
							|  |  |  |  | 	{ | 
					
						
							|  |  |  |  | 		using namespace easy2d::literals; | 
					
						
							|  |  |  |  | 	} | 
					
						
							|  |  |  |  | } | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | #endif
 |