#ifndef BOOST_UUID_UUID_CLOCK_HPP_INCLUDED #define BOOST_UUID_UUID_CLOCK_HPP_INCLUDED // Copyright 2024 Peter Dimov // Distributed under the Boost Software License, Version 1.0. // https://www.boost.org/LICENSE_1_0.txt #include #include #include namespace boost { namespace uuids { class uuid_clock { public: using rep = std::int64_t; using period = std::ratio<1, 10000000>; // 100ns using duration = std::chrono::duration; using time_point = std::chrono::time_point; static constexpr bool is_steady = false; static time_point now() noexcept; template static time_point from_sys( std::chrono::time_point const& tp ) noexcept; static std::chrono::time_point to_sys( time_point const& tp ) noexcept; static time_point from_timestamp( std::uint64_t timestamp ) noexcept; static std::uint64_t to_timestamp( time_point const& tp ) noexcept; }; inline uuid_clock::time_point uuid_clock::now() noexcept { return from_sys( std::chrono::system_clock::now() ); } template inline uuid_clock::time_point uuid_clock::from_sys( std::chrono::time_point const& tp ) noexcept { using days = std::chrono::duration< std::int32_t, std::ratio<86400> >; constexpr auto epoch_diff = days( 141427 ); auto uuid_since = std::chrono::duration_cast( tp.time_since_epoch() ) + epoch_diff; return uuid_clock::time_point( uuid_since ); } inline std::chrono::time_point uuid_clock::to_sys( time_point const& tp ) noexcept { using days = std::chrono::duration< std::int32_t, std::ratio<86400> >; constexpr auto epoch_diff = days( 141427 ); return std::chrono::time_point( tp.time_since_epoch() - epoch_diff ); } inline uuid_clock::time_point uuid_clock::from_timestamp( std::uint64_t timestamp ) noexcept { return time_point( duration( timestamp ) ); } inline std::uint64_t uuid_clock::to_timestamp( time_point const& tp ) noexcept { return tp.time_since_epoch().count(); } } // uuids } // boost #endif // BOOST_UUID_UUID_CLOCK_HPP_INCLUDED