Mountain  1.0.0
Simple C++ 2D Game Framework
guid.hpp
Go to the documentation of this file.
1 #pragma once
2 
3 #include <array>
4 #include <cstdint>
5 #include <format>
6 #include <sstream>
7 #include <string>
8 
9 #include "Mountain/core.hpp"
10 
13 
14 namespace Mountain
15 {
17  class MOUNTAIN_API Guid final
18  {
19  static constexpr size_t Data4Size = 8;
20 
21  public:
22  constexpr Guid() = default;
23 
25  static constexpr Guid Empty() { return Guid(); }
26 
29  static Guid New();
30 
34  static Guid FromString(const char_t* str);
35 
36  [[nodiscard]]
37  uint32_t GetData1() const;
38 
39  [[nodiscard]]
40  uint16_t GetData2() const;
41 
42  [[nodiscard]]
43  uint16_t GetData3() const;
44 
45  [[nodiscard]]
46  const std::array<uint8_t, Data4Size>& GetData4() const;
47 
51  [[nodiscard]]
52  bool_t operator==(const Guid& other) const;
53 
57  [[nodiscard]]
58  bool_t operator!=(const Guid& other) const;
59 
61  explicit operator std::string() const;
62 
63  private:
64  uint32_t m_Data1 = 0;
65  uint16_t m_Data2 = 0;
66  uint16_t m_Data3 = 0;
67  std::array<uint8_t, Data4Size> m_Data4 = {};
68 
69  friend struct std::hash<Guid>;
70  };
71 }
72 
74 template <>
75 struct std::hash<Mountain::Guid>
76 {
77  static constexpr size_t RandomValue = 0x9E3779B9;
78 
79  size_t operator()(const Mountain::Guid& guid) const noexcept
80  {
81  size_t result = 0;
82  result ^= std::hash<decltype(guid.m_Data1)>()(guid.m_Data1) + RandomValue;
83  result ^= std::hash<decltype(guid.m_Data2)>()(guid.m_Data2) + RandomValue + (result << 6) + (result >> 2);
84  result ^= std::hash<decltype(guid.m_Data3)>()(guid.m_Data3) + RandomValue + (result << 6) + (result >> 2);
85 
86  for (size_t i = 0; i < Mountain::Guid::Data4Size; i++)
87  {
88  result ^= std::hash<std::remove_cvref_t<decltype(guid.m_Data4[i])>>()(guid.m_Data4[i]) + RandomValue + (result << 6) + (result >> 2);
89  }
90 
91  return result;
92  }
93 };
94 
96 template <>
97 struct std::formatter<Mountain::Guid>
98 {
100  template <class ParseContext>
101  constexpr typename ParseContext::iterator parse(ParseContext& ctx)
102  {
103  auto it = ctx.begin();
104  if (it == ctx.end())
105  return it;
106 
107  if (*it != '}')
108  throw std::format_error("Invalid format args for Mountain::Guid");
109 
110  return it;
111  }
112 
113  // ReSharper disable once CppMemberFunctionMayBeStatic
115  template <class FormatContext>
116  typename FormatContext::iterator format(const Mountain::Guid& guid, FormatContext& ctx) const
117  {
118  std::ostringstream out;
119 
120  out << static_cast<std::string>(guid);
121 
122  return std::ranges::copy(std::move(out).str(), ctx.out()).out;
123  }
124 };
constexpr bool_t operator==(const Color &c1, const Color &c2)
Compares 2 Color component-wise.
static constexpr Guid Empty()
Empty guid.
Definition: guid.hpp:25
constexpr bool_t operator!=(const Color &c1, const Color &c2)
Compares 2 Color component-wise.
FormatContext::iterator format(const Mountain::Guid &guid, FormatContext &ctx) const
Formats a string using the given instance of Mountain::Guid, according to the given options in the pa...
Definition: guid.hpp:116
constexpr ParseContext::iterator parse(ParseContext &ctx)
Parses the input formatting options.
Definition: guid.hpp:101
Stands for Global Unique Identifier, it represents a unique ID that&#39;s used to link pointers during se...
Definition: guid.hpp:17
Contains all declarations of the Mountain Framework.
Definition: audio.hpp:22