From bd63944a739b4dcd49e8a65294ffb1b8a0a7b20b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sybren=20A=2E=20St=C3=BCvel?= Date: Thu, 23 Sep 2021 17:55:43 +0200 Subject: UUID: place C++ code in correct namespace Put the `bUUID` class in the `blender` namespace, instead of the `blender::bke` namespace. As a result, some C++ code now correctly uses the C++ class, where previously it would use the C struct and use implicit casting where necessary. As a result, support for initializer lists had to be explicitly coded and in another place an explicit `::bUUID` was necessary to avoid ambiguity. --- source/blender/blenlib/BLI_uuid.h | 9 +++++++-- source/blender/blenlib/intern/uuid.cc | 22 +++++++++++++++++++--- source/blender/blenlib/tests/BLI_uuid_test.cc | 12 ++++++++---- 3 files changed, 34 insertions(+), 9 deletions(-) (limited to 'source/blender/blenlib') diff --git a/source/blender/blenlib/BLI_uuid.h b/source/blender/blenlib/BLI_uuid.h index 72d95b41329..d21ccd450cc 100644 --- a/source/blender/blenlib/BLI_uuid.h +++ b/source/blender/blenlib/BLI_uuid.h @@ -68,19 +68,24 @@ bool BLI_uuid_parse_string(bUUID *uuid, const char *buffer) ATTR_NONNULL(); #ifdef __cplusplus } +# include # include /** Output the UUID as formatted ASCII string, see #BLI_uuid_format(). */ std::ostream &operator<<(std::ostream &stream, bUUID uuid); -namespace blender::bke { +namespace blender { class bUUID : public ::bUUID { public: bUUID() = default; + /** Initialise from the bUUID DNA struct. */ bUUID(const ::bUUID &struct_uuid); + /** Initialise from 11 integers, 5 for the regular fields and 6 for the `node` array. */ + bUUID(std::initializer_list field_values); + /** Initialise by parsing the string; undefined behaviour when the string is invalid. */ explicit bUUID(const std::string &string_formatted_uuid); @@ -89,6 +94,6 @@ class bUUID : public ::bUUID { bool operator==(bUUID uuid1, bUUID uuid2); -} // namespace blender::bke +} // namespace blender #endif diff --git a/source/blender/blenlib/intern/uuid.cc b/source/blender/blenlib/intern/uuid.cc index c1f7f8dfecd..cdb430c046a 100644 --- a/source/blender/blenlib/intern/uuid.cc +++ b/source/blender/blenlib/intern/uuid.cc @@ -18,6 +18,7 @@ * \ingroup bli */ +#include "BLI_assert.h" #include "BLI_uuid.h" #include @@ -139,7 +140,22 @@ std::ostream &operator<<(std::ostream &stream, bUUID uuid) return stream; } -namespace blender::bke { +namespace blender { + +bUUID::bUUID(const std::initializer_list field_values) +{ + BLI_assert_msg(field_values.size() == 11, "bUUID requires 5 regular fields + 6 `node` values"); + + auto field_iter = field_values.begin(); + + this->time_low = static_cast(*field_iter++); + this->time_mid = static_cast(*field_iter++); + this->time_hi_and_version = static_cast(*field_iter++); + this->clock_seq_hi_and_reserved = static_cast(*field_iter++); + this->clock_seq_low = static_cast(*field_iter++); + + std::copy(field_iter, field_values.end(), this->node); +} bUUID::bUUID(const std::string &string_formatted_uuid) { @@ -163,9 +179,9 @@ uint64_t bUUID::hash() const return uuid_as_int64[0] ^ uuid_as_int64[1]; } -bool operator==(bUUID uuid1, bUUID uuid2) +bool operator==(const bUUID uuid1, const bUUID uuid2) { return BLI_uuid_equal(uuid1, uuid2); } -} // namespace blender::bke +} // namespace blender diff --git a/source/blender/blenlib/tests/BLI_uuid_test.cc b/source/blender/blenlib/tests/BLI_uuid_test.cc index 731489c6c9e..42aa618963f 100644 --- a/source/blender/blenlib/tests/BLI_uuid_test.cc +++ b/source/blender/blenlib/tests/BLI_uuid_test.cc @@ -18,6 +18,8 @@ #include "BLI_uuid.h" +namespace blender::tests { + TEST(BLI_uuid, generate_random) { const bUUID uuid = BLI_uuid_generate_random(); @@ -51,7 +53,7 @@ TEST(BLI_uuid, generate_many_random) TEST(BLI_uuid, nil_value) { const bUUID nil_uuid = BLI_uuid_nil(); - const bUUID zeroes_uuid = {0, 0, 0, 0, 0, 0}; + const bUUID zeroes_uuid{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; EXPECT_TRUE(BLI_uuid_equal(nil_uuid, zeroes_uuid)); EXPECT_TRUE(BLI_uuid_is_nil(nil_uuid)); @@ -91,13 +93,13 @@ TEST(BLI_uuid, string_formatting) EXPECT_EQ("00000001-0002-0003-0405-060000000007", buffer); /* Somewhat more complex bit patterns. This is a version 1 UUID generated from Python. */ - const bUUID uuid1 = {3540651616, 5282, 4588, 139, 153, {0xf7, 0x73, 0x69, 0x44, 0xdb, 0x8b}}; + const bUUID uuid1 = {3540651616, 5282, 4588, 139, 153, 0xf7, 0x73, 0x69, 0x44, 0xdb, 0x8b}; BLI_uuid_format(buffer.data(), uuid1); EXPECT_EQ("d30a0e60-14a2-11ec-8b99-f7736944db8b", buffer); /* Namespace UUID, example listed in RFC4211. */ const bUUID namespace_dns = { - 0x6ba7b810, 0x9dad, 0x11d1, 0x80, 0xb4, {0x00, 0xc0, 0x4f, 0xd4, 0x30, 0xc8}}; + 0x6ba7b810, 0x9dad, 0x11d1, 0x80, 0xb4, 0x00, 0xc0, 0x4f, 0xd4, 0x30, 0xc8}; BLI_uuid_format(buffer.data(), namespace_dns); EXPECT_EQ("6ba7b810-9dad-11d1-80b4-00c04fd430c8", buffer); } @@ -139,7 +141,9 @@ TEST(BLI_uuid, string_parsing_fail) TEST(BLI_uuid, stream_operator) { std::stringstream ss; - const bUUID uuid = {3540651616, 5282, 4588, 139, 153, {0xf7, 0x73, 0x69, 0x44, 0xdb, 0x8b}}; + const bUUID uuid = {3540651616, 5282, 4588, 139, 153, 0xf7, 0x73, 0x69, 0x44, 0xdb, 0x8b}; ss << uuid; EXPECT_EQ(ss.str(), "d30a0e60-14a2-11ec-8b99-f7736944db8b"); } + +} // namespace blender::tests -- cgit v1.2.3