OSDN Git Service

src初コミット
[yurina/yurina.git] / src / core / base / Time.h
diff --git a/src/core/base/Time.h b/src/core/base/Time.h
new file mode 100755 (executable)
index 0000000..6968d6a
--- /dev/null
@@ -0,0 +1,143 @@
+/*\r
+ *     “yurina”: yurina unpretentious renderer is not an anathema\r
+ *\r
+ *     This software is distributed under a BSD-style license.\r
+ *     See license.txt for more information.\r
+ */\r
+\r
+#pragma once\r
+\r
+#include "base/yurinaCommon.h"\r
+#include "base/YuriString.h"\r
+#include <ctime>\r
+\r
+namespace yurina\r
+{\r
+       /**\r
+        *      時刻および時間\r
+        */\r
+       class Time\r
+       {\r
+       public:\r
+               struct Counter\r
+               {\r
+                       /** usec単位の基準時刻.*/\r
+                       int64_t baseTime;\r
+                       int64_t baseCount;\r
+                       /** カウンタ周波数. 無効の場合ゼロ */\r
+                       int64_t frequency;\r
+\r
+                       Counter( void );\r
+                       int64_t getCount( void );\r
+                       void initialize( void );\r
+               };\r
+       private:\r
+               enum Flag\r
+               {\r
+                       UTC = 1,\r
+                       LOCAL = 2,\r
+                       ABSOLUTE = 3,\r
+                       RESERVED1 = 4,\r
+                       RESERVED2 = 8\r
+               };\r
+       private:\r
+               /**\r
+                *      上位60bitは1970-01-01からのUTCでのusec.\r
+                *      下位4ビットはフラグ    \n\r
+                *      b0:     UTCである場合に1 \n\r
+                *      b1:     現地時刻である場合に1 \n\r
+                *      b2:     予約\n\r
+                *      b3:     予約\n\r
+                *      @note b0とb1がともに1の場合,不正な時刻\r
+                */\r
+               int64_t time;\r
+               static Counter counter;\r
+       public:\r
+               Time( void );\r
+               Time( int64_t time, bool isUTC = false, bool isLocalTime = false );\r
+               ~Time( void );\r
+\r
+               Time operator+( const Time &delta );\r
+               Time operator-( const Time &delta );\r
+               bool operator==( const Time &other );\r
+               bool operator!=( const Time &other );\r
+\r
+               inline bool isUTC() const { return 0 != (time & UTC); }\r
+               inline bool isLocalTime() const { return 0 != (time & LOCAL); }\r
+               inline bool isTimeSpan() const { return 0 == (time & ABSOLUTE); }\r
+               inline bool isValid() const { return ABSOLUTE != (time & ABSOLUTE); }\r
+               \r
+               \r
+               inline void toUTC( void ) { time = time & (-1 ^ ABSOLUTE) | UTC; }\r
+               inline void toLocalTime( void ) { time = time & (-1 ^ ABSOLUTE) | LOCAL; }\r
+\r
+\r
+               /**\r
+                *      西暦を取得する.\r
+                *      @return 西暦を表す数字\r
+                *      @note 0は紀元前1年\r
+                */\r
+               int getYear( void ) const;\r
+\r
+               /**\r
+                *      月を取得する.\r
+                *      @return 月を表す数字. 1月の場合1を返す\r
+                *      @note 1月の場合0ではなく1\r
+                */\r
+               int getMonth( void ) const;\r
+\r
+               /**\r
+                *      日を取得する.\r
+                *      @return 日を表す数字. 1日の場合1を返す\r
+                */\r
+               int getDay( void ) const;\r
+\r
+               /**\r
+                *      時を取得する.\r
+                *      @return 時を表す数字. 0~23の値\r
+                */\r
+               int getHour( void ) const;\r
+\r
+               /**\r
+                *      分を取得する.\r
+                *      @return 分を表す数字. 0~59の値\r
+                */\r
+               int getMinute( void ) const;\r
+\r
+               /**\r
+                *      秒を取得する.\r
+                *      @return 秒を表す数字. 0~60の値\r
+                */\r
+               int getSecond( void ) const;\r
+\r
+               /**\r
+                *      ミリ秒を取得する.\r
+                *      @return ミリ秒を表す数字. 0~999の値\r
+                */\r
+               int getMillisecond( void ) const;\r
+\r
+               /**\r
+                *      エポック時からのusec単位のカウントを取得する.\r
+                *      @return カウント\r
+                */\r
+               int64_t getTicks( void ) const;\r
+\r
+\r
+               /**\r
+                *      現在のローカル時刻を返す\r
+                *      @return 現在のローカル時刻\r
+                */\r
+               static Time now( void );\r
+\r
+               /**\r
+                *      現在のUTC時刻を返す\r
+                *      @return 現在のUTC時刻\r
+                */\r
+               static Time nowUTC( void );\r
+\r
+               const YuriString toString( const YuriString &format ) const;\r
+       private:\r
+               static int64_t getCurrentTime( void );\r
+               void getElements( tm *elements ) const;\r
+       };\r
+}\r