Back to home page

EIC code displayed by LXR

 
 

    


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 // Copyright 2024 Peter Dimov
0005 // Distributed under the Boost Software License, Version 1.0.
0006 // https://www.boost.org/LICENSE_1_0.txt
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>; // 100ns
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 } // uuids
0070 } // boost
0071 
0072 #endif // BOOST_UUID_UUID_CLOCK_HPP_INCLUDED