From 9d606695884bb73eb0dbdd9a176e4f07433e2259 Mon Sep 17 00:00:00 2001 From: Peter Dimov Date: Wed, 24 Apr 2024 19:39:54 +0300 Subject: [PATCH] Add uuid::time_point_v1(), uuid_clock::from_timestamp, uuid_clock::to_timestamp --- include/boost/uuid/uuid.hpp | 18 ++++++++++++++++++ include/boost/uuid/uuid_clock.hpp | 13 +++++++++++++ test/test_time_generator_v1.cpp | 10 +--------- test/test_uuid_clock.cpp | 7 +++++-- 4 files changed, 37 insertions(+), 11 deletions(-) diff --git a/include/boost/uuid/uuid.hpp b/include/boost/uuid/uuid.hpp index c191df3..c962e8d 100644 --- a/include/boost/uuid/uuid.hpp +++ b/include/boost/uuid/uuid.hpp @@ -33,6 +33,7 @@ // 02 Dec 2009 - removed BOOST_STATIC_CONSTANT - not all compilers like it // 29 Apr 2013 - added support for noexcept and constexpr, added optimizations for SSE/AVX +#include #include #include #include @@ -81,6 +82,8 @@ public: // accessors + // variant + enum variant_type { variant_ncs, // NCS backward compatibility @@ -106,6 +109,8 @@ public: } } + // version + enum version_type { version_unknown = -1, @@ -136,6 +141,8 @@ public: } } + // timestamp + using timestamp_type = std::uint64_t; timestamp_type timestamp_v1() const BOOST_NOEXCEPT @@ -147,6 +154,15 @@ public: return time_low | static_cast( time_mid ) << 32 | static_cast( time_hi ) << 48; } + // time_point + + uuid_clock::time_point time_point_v1() const BOOST_NOEXCEPT + { + return uuid_clock::from_timestamp( timestamp_v1() ); + } + + // clock_seq + using clock_seq_type = std::uint16_t; clock_seq_type clock_seq() const BOOST_NOEXCEPT @@ -154,6 +170,8 @@ public: return detail::load_big_u16( this->data + 8 ) & 0x3FFF; } + // node_identifier + using node_type = std::array; node_type node_identifier() const BOOST_NOEXCEPT diff --git a/include/boost/uuid/uuid_clock.hpp b/include/boost/uuid/uuid_clock.hpp index 0fdf081..0ee2700 100644 --- a/include/boost/uuid/uuid_clock.hpp +++ b/include/boost/uuid/uuid_clock.hpp @@ -27,6 +27,9 @@ public: static time_point from_sys( std::chrono::system_clock::time_point const& tp ) noexcept; static std::chrono::system_clock::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 @@ -54,6 +57,16 @@ inline std::chrono::system_clock::time_point uuid_clock::to_sys( time_point cons return std::chrono::system_clock::time_point( sys_since ); } +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 diff --git a/test/test_time_generator_v1.cpp b/test/test_time_generator_v1.cpp index dc662ec..4a313d4 100644 --- a/test/test_time_generator_v1.cpp +++ b/test/test_time_generator_v1.cpp @@ -13,14 +13,6 @@ using namespace boost::uuids; -uuid_clock::time_point get_time_point_v1( uuid const& u ) -{ - auto t = u.timestamp_v1(); - auto d = uuid_clock::duration( t ); - - return uuid_clock::time_point( d ); -} - uuid generate_and_test( time_generator_v1& gen ) { auto sys_before = std::chrono::time_point_cast( std::chrono::system_clock::now() ); @@ -32,7 +24,7 @@ uuid generate_and_test( time_generator_v1& gen ) auto sys_after = std::chrono::time_point_cast( std::chrono::system_clock::now() ); - auto uuid_time_point = get_time_point_v1( u ); + auto uuid_time_point = u.time_point_v1(); auto sys_time_point = uuid_clock::to_sys( uuid_time_point ); diff --git a/test/test_uuid_clock.cpp b/test/test_uuid_clock.cpp index 818cb2d..a072faf 100644 --- a/test/test_uuid_clock.cpp +++ b/test/test_uuid_clock.cpp @@ -16,7 +16,9 @@ int main() std::uint64_t uuid_timestamp = 0x1ef018cddaa7790; - auto uuid_time = uuid_clock::time_point( uuid_clock::duration( uuid_timestamp ) ); + auto uuid_time = uuid_clock::from_timestamp( uuid_timestamp ); + + BOOST_TEST_EQ( uuid_clock::to_timestamp( uuid_time ), uuid_timestamp ); auto sys_time = uuid_clock::to_sys( uuid_time ); @@ -26,7 +28,8 @@ int main() auto uuid_time_2 = uuid_clock::from_sys( sys_time ); - BOOST_TEST_EQ( uuid_time_2.time_since_epoch().count(), uuid_timestamp ); + BOOST_TEST( uuid_time == uuid_time_2 ); + BOOST_TEST_EQ( uuid_clock::to_timestamp( uuid_time_2 ), uuid_timestamp ); return boost::report_errors(); }