|
|
1.1 ! root 1: // ! 2: // nono ! 3: // Copyright (C) 2025 nono project ! 4: // Licensed under nono-license.txt ! 5: // ! 6: ! 7: #pragma once ! 8: ! 9: #include "header.h" ! 10: ! 11: // 時間単位の変換。 ! 12: constexpr uint64 psec_to_nsec(uint64 ps) { return ps / 1000U; } ! 13: constexpr uint64 psec_to_usec(uint64 ps) { return ps / 1000'000U; } ! 14: constexpr uint64 psec_to_msec(uint64 ps) { return ps / 1000'000'000U; } ! 15: constexpr uint64 psec_to_sec( uint64 ps) { return ps / 1000'000'000'000ULL; } ! 16: constexpr uint64 nsec_to_psec(uint64 ns) { return ns * 1000U; } ! 17: constexpr uint64 nsec_to_usec(uint64 ns) { return ns / 1000U; } ! 18: constexpr uint64 nsec_to_msec(uint64 ns) { return ns / 1000'000U; } ! 19: constexpr uint64 nsec_to_sec( uint64 ns) { return ns / 1000'000'000U; } ! 20: constexpr uint64 usec_to_psec(uint64 us) { return us * 1000'000U; } ! 21: constexpr uint64 usec_to_nsec(uint64 us) { return us * 1000U; } ! 22: constexpr uint64 usec_to_msec(uint64 us) { return us / 1000U; } ! 23: constexpr uint64 usec_to_sec( uint64 us) { return us / 1000'000U; } ! 24: constexpr uint64 msec_to_psec(uint64 ms) { return ms * 1000'000'000U; } ! 25: constexpr uint64 msec_to_nsec(uint64 ms) { return ms * 1000'000U; } ! 26: constexpr uint64 msec_to_usec(uint64 ms) { return ms * 1000U; } ! 27: constexpr uint64 msec_to_sec( uint64 ms) { return ms / 1000U; } ! 28: constexpr uint64 sec_to_psec(uint64 ss) { return ss * 1000'000'000'000ULL; } ! 29: constexpr uint64 sec_to_nsec(uint64 ss) { return ss * 1000'000'000U; } ! 30: constexpr uint64 sec_to_usec(uint64 ss) { return ss * 1000'000U; } ! 31: constexpr uint64 sec_to_msec(uint64 ss) { return ss * 1000U; } ! 32: ! 33: // 内部の単位時間は [tsec] と呼ぶ。t は特に意味はないけど tick とか。 ! 34: static constexpr uint64 TSEC_FREQUENCY = 1000'000'000U; ! 35: ! 36: static constexpr uint64 PSEC_IN_SEC = 1000'000'000'000ULL; ! 37: static constexpr uint64 NSEC_IN_SEC = 1000'000'000U; ! 38: static constexpr uint64 USEC_IN_SEC = 1000'000U; ! 39: static constexpr uint64 MSEC_IN_SEC = 1000U; ! 40: ! 41: constexpr uint64 GCD(uint64 a, uint64 b) ! 42: { ! 43: if (a == b) { ! 44: return a; ! 45: } ! 46: if (a < b) { ! 47: uint64 t = b; ! 48: b = a; ! 49: a = t; ! 50: } ! 51: uint64 d = 0; ! 52: do { ! 53: d = a % b; ! 54: a = b; ! 55: b = d; ! 56: } while (d != 0); ! 57: return a; ! 58: } ! 59: ! 60: constexpr uint64 tsec_to_xsec(uint64 ts, uint64 base) ! 61: { ! 62: auto g = GCD(base, TSEC_FREQUENCY); ! 63: auto n = base / g; ! 64: auto d = TSEC_FREQUENCY / g; ! 65: return ts * n / d; ! 66: } ! 67: constexpr uint64 xsec_to_tsec(uint64 xs, uint64 base) ! 68: { ! 69: auto g = GCD(base, TSEC_FREQUENCY); ! 70: auto n = base / g; ! 71: auto d = TSEC_FREQUENCY / g; ! 72: return xs * d / n; ! 73: } ! 74: ! 75: constexpr uint64 tsec_to_psec(uint64 ts) { ! 76: return tsec_to_xsec(ts, PSEC_IN_SEC); ! 77: } ! 78: constexpr uint64 tsec_to_nsec(uint64 ts) { ! 79: return tsec_to_xsec(ts, NSEC_IN_SEC); ! 80: } ! 81: constexpr uint64 tsec_to_usec(uint64 ts) { ! 82: return tsec_to_xsec(ts, USEC_IN_SEC); ! 83: } ! 84: constexpr uint64 tsec_to_msec(uint64 ts) { ! 85: return tsec_to_xsec(ts, MSEC_IN_SEC); ! 86: } ! 87: constexpr uint64 tsec_to_sec(uint64 ts) { ! 88: return tsec_to_xsec(ts, 1); ! 89: } ! 90: ! 91: constexpr uint64 psec_to_tsec(uint64 ps) { ! 92: return xsec_to_tsec(ps, PSEC_IN_SEC); ! 93: } ! 94: constexpr uint64 nsec_to_tsec(uint64 ns) { ! 95: return xsec_to_tsec(ns, NSEC_IN_SEC); ! 96: } ! 97: constexpr uint64 usec_to_tsec(uint64 us) { ! 98: return xsec_to_tsec(us, USEC_IN_SEC); ! 99: } ! 100: constexpr uint64 msec_to_tsec(uint64 ms) { ! 101: return xsec_to_tsec(ms, MSEC_IN_SEC); ! 102: } ! 103: constexpr uint64 sec_to_tsec(uint64 ss) { ! 104: return xsec_to_tsec(ss, 1); ! 105: } ! 106: ! 107: // ユーザ定義リテラルを使ったサフィックス ! 108: ! 109: // 単位時間 ! 110: constexpr uint64 operator"" _tsec(unsigned long long ts) ! 111: { ! 112: return ts; ! 113: } ! 114: constexpr uint64 operator"" _tsec(long double ts) ! 115: { ! 116: return ts; ! 117: } ! 118: ! 119: // ナノ秒 ! 120: constexpr uint64 operator"" _nsec(unsigned long long ns) ! 121: { ! 122: return nsec_to_tsec(ns); ! 123: } ! 124: constexpr uint64 operator"" _nsec(long double ns) ! 125: { ! 126: return ns / 1e9 * TSEC_FREQUENCY; ! 127: } ! 128: ! 129: // マイクロ秒 ! 130: constexpr uint64 operator"" _usec(unsigned long long us) ! 131: { ! 132: return us * 1000_nsec; ! 133: } ! 134: constexpr uint64 operator"" _usec(long double us) ! 135: { ! 136: return us * 1000_nsec; ! 137: } ! 138: ! 139: // ミリ秒 ! 140: constexpr uint64 operator"" _msec(unsigned long long ms) ! 141: { ! 142: return ms * 1000_usec; ! 143: } ! 144: constexpr uint64 operator"" _msec(long double ms) ! 145: { ! 146: return ms * 1000_usec; ! 147: } ! 148: ! 149: // 秒 ! 150: constexpr uint64 operator"" _sec(unsigned long long sec) ! 151: { ! 152: return sec * 1000_msec; ! 153: } ! 154: constexpr uint64 operator"" _sec(long double sec) ! 155: { ! 156: return sec * 1000_msec; ! 157: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.