Stroika Library 3.0d16
 
Loading...
Searching...
No Matches
GUID.inl
1/*
2 * Copyright(c) Sophist Solutions, Inc. 1990-2025. All rights reserved
3 */
4
6
7 /*
8 ********************************************************************************
9 ********************************* Common::GUID *********************************
10 ********************************************************************************
11 */
12#if qStroika_Foundation_Common_Platform_Windows
13 constexpr GUID::GUID (const ::GUID& src) noexcept
14 : Data1{src.Data1}
15 , Data2{src.Data2}
16 , Data3{src.Data3}
17 {
18 for (size_t i = 0; i < Memory::NEltsOf (Data4); ++i) {
19 Data4[i] = src.Data4[i];
20 }
21 }
22#endif
23 namespace Private_ {
24 template <Characters::IConvertibleToString STRISH_TYPE>
25 inline string AsAscii (STRISH_TYPE&& src)
26 {
27 // @todo could be more efficient either using spans and passed in buffer arg for if needed (like with String Peek) but
28 // also could just do additional template specializations in CPP file for cases like string_view or const char*
29 if constexpr (same_as<STRISH_TYPE, Characters::String>) {
30 return src.AsASCII ();
31 }
32 if constexpr (IAnyOf<STRISH_TYPE, const char*, string_view, string>) {
33 return forward<STRISH_TYPE> (src);
34 }
35 return Characters::String{src}.AsASCII ();
36 }
37 }
38 template <Characters::IConvertibleToString STRISH_TYPE>
39 inline GUID::GUID (STRISH_TYPE&& src)
40 : GUID{mk_ (Private_::AsAscii (src))}
41 {
42 }
43 inline Common::GUID::GUID (const array<uint8_t, 16>& src) noexcept
44 {
45 ::memcpy (this, src.data (), 16);
46 }
47 inline const byte* GUID::begin () const noexcept
48 {
49 return reinterpret_cast<const byte*> (this);
50 }
51 inline const byte* GUID::end () const noexcept
52 {
53 return reinterpret_cast<const byte*> (this) + 16;
54 }
55 constexpr size_t GUID::size () const noexcept
56 {
57 return 16;
58 }
59 inline const uint8_t* GUID::data () const noexcept
60 {
61 return reinterpret_cast<const uint8_t*> (this);
62 }
63 template <IAnyOf<Characters::String, std::string, Memory::BLOB, array<byte, 16>, array<uint8_t, 16>> T>
64 inline T Common::GUID::As () const
65 {
66 if constexpr (same_as<T, Characters::String>) {
67 char buf[1024];
68 Verify (::snprintf (buf, Memory::NEltsOf (buf), "%08x-%04x-%04x-%02x%02x-%02x%02x%02x%02x%02x%02x", Data1, Data2, Data3,
69 Data4[0], Data4[1], Data4[2], Data4[3], Data4[4], Data4[5], Data4[6], Data4[7]) > 0);
70 return Characters::String{buf};
71 }
72 else if constexpr (same_as<T, std::string>) {
73 char buf[1024];
74 Verify (::snprintf (buf, Memory::NEltsOf (buf), "%08x-%04x-%04x-%02x%02x-%02x%02x%02x%02x%02x%02x", Data1, Data2, Data3,
75 Data4[0], Data4[1], Data4[2], Data4[3], Data4[4], Data4[5], Data4[6], Data4[7]) > 0);
76 return buf;
77 }
78 else if constexpr (same_as<T, array<byte, 16>> or same_as<T, array<uint8_t, 16>>) {
79 return *reinterpret_cast<const T*> (this);
80 }
81 else if constexpr (same_as<T, Memory::BLOB>) {
82 return T{begin (), end ()}; // tricky case cuz BLOB forward declared, not defined when this procedure definition first seen
83 }
84 }
85
86}
87
88/*
89 ********************************************************************************
90 ********* formatter<Stroika::Foundation::Common::GUID, char/wchar_t> ***********
91 ********************************************************************************
92 */
93template <class FmtContext>
94inline typename FmtContext::iterator qStroika_Foundation_Characters_FMT_PREFIX_::formatter<Stroika::Foundation::Common::GUID, wchar_t>::format (
95 const Stroika::Foundation::Common::GUID& s, FmtContext& ctx) const
96{
97 return this->inherited::format (s.As<Stroika::Foundation::Characters::String> ().As<std::wstring> (), ctx);
98}
99template <class FmtContext>
100inline typename FmtContext::iterator
101qStroika_Foundation_Characters_FMT_PREFIX_::formatter<Stroika::Foundation::Common::GUID, char>::format (const Stroika::Foundation::Common::GUID& s,
102 FmtContext& ctx) const
103{
104 return this->inherited::format (s.As<std::string> (), ctx);
105}
#define Verify(c)
Definition Assertions.h:419
String is like std::u32string, except it is much easier to use, often much more space efficient,...
Definition String.h:201
constexpr GUID() noexcept=default