1//************************************ bs::framework - Copyright 2018 Marko Pintera **************************************//
2//*********** Licensed under the MIT license. See LICENSE.md for full terms. This notice is not to be removed. ***********//
3#pragma once
4
5#include "Prerequisites/BsPlatformDefines.h"
6#include "String/BsString.h"
7#include "Prerequisites/BsTypes.h"
8#include "Prerequisites/BsRTTIPrerequisites.h"
9#include "Utility/BsUtil.h"
10
11namespace bs
12{
13 /** @addtogroup Utility-Core
14 * @{
15 */
16
17 /** Represents a universally unique identifier. */
18 struct BS_UTILITY_EXPORT UUID
19 {
20 /** Initializes an empty UUID. */
21 constexpr UUID() = default;
22
23 /** Initializes an UUID using framework's UUID representation. */
24 constexpr UUID(UINT32 data1, UINT32 data2, UINT32 data3, UINT32 data4)
25 : mData{data1, data2, data3, data4}
26 { }
27
28 /** Initializes an UUID using its string representation. */
29 explicit UUID(const String& uuid);
30
31 constexpr bool operator==(const UUID& rhs) const
32 {
33 return mData[0] == rhs.mData[0] && mData[1] == rhs.mData[1] && mData[2] == rhs.mData[2] && mData[3] == rhs.mData[3];
34 }
35
36 constexpr bool operator!=(const UUID& rhs) const
37 {
38 return !(*this == rhs);
39 }
40
41 constexpr bool operator<(const UUID& rhs) const
42 {
43 for(UINT32 i = 0; i < 4; i++)
44 {
45 if (mData[i] < rhs.mData[i])
46 return true;
47 else if (mData[i] > rhs.mData[i])
48 return false;
49
50 // Move to next element if equal
51 }
52
53 // They're equal
54 return false;
55 }
56
57 /** Checks has the UUID been initialized to a valid value. */
58 constexpr bool empty() const
59 {
60 return mData[0] == 0 && mData[1] == 0 && mData[2] == 0 && mData[3] == 0;
61 }
62
63 /** Converts the UUID into its string representation. */
64 String toString() const;
65
66 static UUID EMPTY;
67 private:
68 friend struct std::hash<UUID>;
69
70 UINT32 mData[4] = {0, 0, 0, 0};
71 };
72
73 BS_ALLOW_MEMCPY_SERIALIZATION(UUID)
74
75 /**
76 * Utility class for generating universally unique identifiers.
77 *
78 * @note Thread safe.
79 */
80 class BS_UTILITY_EXPORT UUIDGenerator
81 {
82 public:
83 /** Generate a new random universally unique identifier. */
84 static UUID generateRandom();
85 };
86
87 /** @} */
88}
89
90/** @cond STDLIB */
91/** @addtogroup Utility
92 * @{
93 */
94
95namespace std
96{
97/** Hash value generator for UUID. */
98template<>
99struct hash<bs::UUID>
100{
101 size_t operator()(const bs::UUID& value) const
102 {
103 size_t hash = 0;
104 bs::bs_hash_combine(hash, value.mData[0]);
105 bs::bs_hash_combine(hash, value.mData[1]);
106 bs::bs_hash_combine(hash, value.mData[2]);
107 bs::bs_hash_combine(hash, value.mData[3]);
108
109 return hash;
110 }
111};
112}
113
114/** @} */
115/** @endcond */
116