uuid_clock.hpp 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172
  1. #ifndef BOOST_UUID_UUID_CLOCK_HPP_INCLUDED
  2. #define BOOST_UUID_UUID_CLOCK_HPP_INCLUDED
  3. // Copyright 2024 Peter Dimov
  4. // Distributed under the Boost Software License, Version 1.0.
  5. // https://www.boost.org/LICENSE_1_0.txt
  6. #include <chrono>
  7. #include <ratio>
  8. #include <cstdint>
  9. namespace boost {
  10. namespace uuids {
  11. class uuid_clock
  12. {
  13. public:
  14. using rep = std::int64_t;
  15. using period = std::ratio<1, 10000000>; // 100ns
  16. using duration = std::chrono::duration<rep, period>;
  17. using time_point = std::chrono::time_point<uuid_clock, duration>;
  18. static constexpr bool is_steady = false;
  19. static time_point now() noexcept;
  20. template<class Duration> static time_point from_sys( std::chrono::time_point<std::chrono::system_clock, Duration> const& tp ) noexcept;
  21. static std::chrono::time_point<std::chrono::system_clock, duration> to_sys( time_point const& tp ) noexcept;
  22. static time_point from_timestamp( std::uint64_t timestamp ) noexcept;
  23. static std::uint64_t to_timestamp( time_point const& tp ) noexcept;
  24. };
  25. inline uuid_clock::time_point uuid_clock::now() noexcept
  26. {
  27. return from_sys( std::chrono::system_clock::now() );
  28. }
  29. template<class Duration>
  30. inline uuid_clock::time_point uuid_clock::from_sys( std::chrono::time_point<std::chrono::system_clock, Duration> const& tp ) noexcept
  31. {
  32. using days = std::chrono::duration< std::int32_t, std::ratio<86400> >;
  33. constexpr auto epoch_diff = days( 141427 );
  34. auto uuid_since = std::chrono::duration_cast<uuid_clock::duration>( tp.time_since_epoch() ) + epoch_diff;
  35. return uuid_clock::time_point( uuid_since );
  36. }
  37. inline std::chrono::time_point<std::chrono::system_clock, uuid_clock::duration> uuid_clock::to_sys( time_point const& tp ) noexcept
  38. {
  39. using days = std::chrono::duration< std::int32_t, std::ratio<86400> >;
  40. constexpr auto epoch_diff = days( 141427 );
  41. return std::chrono::time_point<std::chrono::system_clock, duration>( tp.time_since_epoch() - epoch_diff );
  42. }
  43. inline uuid_clock::time_point uuid_clock::from_timestamp( std::uint64_t timestamp ) noexcept
  44. {
  45. return time_point( duration( timestamp ) );
  46. }
  47. inline std::uint64_t uuid_clock::to_timestamp( time_point const& tp ) noexcept
  48. {
  49. return tp.time_since_epoch().count();
  50. }
  51. } // uuids
  52. } // boost
  53. #endif // BOOST_UUID_UUID_CLOCK_HPP_INCLUDED