File indexing completed on 2025-04-26 08:55:46
0001 #ifndef BOOST_UUID_UUID_CLOCK_HPP_INCLUDED
0002 #define BOOST_UUID_UUID_CLOCK_HPP_INCLUDED
0003
0004
0005
0006
0007
0008 #include <chrono>
0009 #include <ratio>
0010 #include <cstdint>
0011
0012 namespace boost {
0013 namespace uuids {
0014
0015 class uuid_clock
0016 {
0017 public:
0018
0019 using rep = std::int64_t;
0020 using period = std::ratio<1, 10000000>;
0021 using duration = std::chrono::duration<rep, period>;
0022 using time_point = std::chrono::time_point<uuid_clock, duration>;
0023
0024 static constexpr bool is_steady = false;
0025
0026 static time_point now() noexcept;
0027
0028 template<class Duration> static time_point from_sys( std::chrono::time_point<std::chrono::system_clock, Duration> const& tp ) noexcept;
0029 static std::chrono::time_point<std::chrono::system_clock, duration> to_sys( time_point const& tp ) noexcept;
0030
0031 static time_point from_timestamp( std::uint64_t timestamp ) noexcept;
0032 static std::uint64_t to_timestamp( time_point const& tp ) noexcept;
0033 };
0034
0035 inline uuid_clock::time_point uuid_clock::now() noexcept
0036 {
0037 return from_sys( std::chrono::system_clock::now() );
0038 }
0039
0040 template<class Duration>
0041 inline uuid_clock::time_point uuid_clock::from_sys( std::chrono::time_point<std::chrono::system_clock, Duration> const& tp ) noexcept
0042 {
0043 using days = std::chrono::duration< std::int32_t, std::ratio<86400> >;
0044 constexpr auto epoch_diff = days( 141427 );
0045
0046 auto uuid_since = std::chrono::duration_cast<uuid_clock::duration>( tp.time_since_epoch() ) + epoch_diff;
0047
0048 return uuid_clock::time_point( uuid_since );
0049 }
0050
0051 inline std::chrono::time_point<std::chrono::system_clock, uuid_clock::duration> uuid_clock::to_sys( time_point const& tp ) noexcept
0052 {
0053 using days = std::chrono::duration< std::int32_t, std::ratio<86400> >;
0054 constexpr auto epoch_diff = days( 141427 );
0055
0056 return std::chrono::time_point<std::chrono::system_clock, duration>( tp.time_since_epoch() - epoch_diff );
0057 }
0058
0059 inline uuid_clock::time_point uuid_clock::from_timestamp( std::uint64_t timestamp ) noexcept
0060 {
0061 return time_point( duration( timestamp ) );
0062 }
0063
0064 inline std::uint64_t uuid_clock::to_timestamp( time_point const& tp ) noexcept
0065 {
0066 return tp.time_since_epoch().count();
0067 }
0068
0069 }
0070 }
0071
0072 #endif