diff --git a/sourceCode/Types.hpp b/sourceCode/Types.hpp index 2ed11b4..44ef947 100644 --- a/sourceCode/Types.hpp +++ b/sourceCode/Types.hpp @@ -12,15 +12,24 @@ #include namespace Tourmaline::Type { struct UUID { + constexpr static uint8_t BitLength = 128; + constexpr static uint8_t QWORDLength = BitLength / 64; + constexpr static uint8_t ByteLength = BitLength / 8; + [[nodiscard]] std::string asString() const; UUID(uint64_t firstHalf, uint64_t secondHalf); UUID(const std::string &uuid); + + UUID(const UUID &uuid); UUID(UUID &&uuid) noexcept; + UUID &operator=(const UUID &uuid); + UUID &operator=(UUID &&uuid); + ~UUID() = default; private: - std::unique_ptr data = std::make_unique(2); + std::unique_ptr data = std::make_unique(QWORDLength); }; } // namespace Tourmaline::Type #endif diff --git a/sourceCode/Types/UUID.cpp b/sourceCode/Types/UUID.cpp index 9834483..2656a6a 100644 --- a/sourceCode/Types/UUID.cpp +++ b/sourceCode/Types/UUID.cpp @@ -8,7 +8,9 @@ */ #include "../Types.hpp" -#include +#include +#include +#include #include #include #include @@ -18,7 +20,31 @@ std::string UUID::asString() const { return std::format("{:016X}{:016X}", data[0], data[1]); } -UUID::UUID(UUID &&uuid) noexcept { data.swap(uuid.data); } +UUID::UUID(const UUID &uuid) { + std::memcpy(data.get(), uuid.data.get(), UUID::QWORDLength); +} + +UUID &UUID::operator=(const UUID &uuid) { + if (this != &uuid) { + std::memcpy(data.get(), uuid.data.get(), UUID::QWORDLength); + } + + return *this; +} + +UUID &UUID::operator=(UUID &&uuid) { + if (this != &uuid) { + data.swap(uuid.data); + uuid.data.release(); // Might be unnecessary + } + + return *this; +} + +UUID::UUID(UUID &&uuid) noexcept { + data.swap(uuid.data); + uuid.data.release(); // Might be unnecessary +} UUID::UUID(uint64_t firstHalf, uint64_t secondHalf) { data[0] = firstHalf; @@ -28,5 +54,9 @@ UUID::UUID(uint64_t firstHalf, uint64_t secondHalf) { UUID::UUID(const std::string &uuid) { // We are assuming that it is a valid UUID, if not then somewhere else this // UUID should cause an error - std::copy(uuid.begin(), uuid.begin() + 32, data.get()); + auto start = uuid.c_str(), half = start + ByteLength, + tail = half + ByteLength; // Each UUID element is 16 characters padded + + std::from_chars(start, half, data[0], 16); + std::from_chars(half, tail, data[1], 16); }