annotate foosdk/sdk/pfc/guid.cpp @ 1:20d02a178406 default tip

*: check in everything else yay
author Paper <paper@tflc.us>
date Mon, 05 Jan 2026 02:15:46 -0500
parents
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
1
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1 #include "pfc-lite.h"
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2 #include "guid.h"
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3 #include "debug.h" // pfc::crash()
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4 #include "string_base.h"
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
5
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
6 #ifdef _WIN32
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
7 #include <Objbase.h>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
8 #else
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
9 #include "nix-objects.h"
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
10 #endif
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
11
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
12 /*
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
13 6B29FC40-CA47-1067-B31D-00DD010662DA
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
14 .
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
15 typedef struct _GUID { // size is 16
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
16 DWORD Data1;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
17 WORD Data2;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
18 WORD Data3;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
19 BYTE Data4[8];
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
20 } GUID;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
21
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
22 // {B296CF59-4D51-466f-8E0B-E57D3F91D908}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
23 static const GUID <<name>> =
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
24 { 0xb296cf59, 0x4d51, 0x466f, { 0x8e, 0xb, 0xe5, 0x7d, 0x3f, 0x91, 0xd9, 0x8 } };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
25
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
26 */
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
27 namespace {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
28 class _GUID_from_text
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
29 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
30 unsigned read_hex(char c);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
31 unsigned read_byte(const char * ptr);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
32 unsigned read_word(const char * ptr);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
33 unsigned read_dword(const char * ptr);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
34 void read_bytes(unsigned char * out,unsigned num,const char * ptr);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
35
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
36 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
37 GUID m_val = pfc::guid_null;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
38 _GUID_from_text(const char * text);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
39 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
40
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
41 unsigned _GUID_from_text::read_hex(char c)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
42 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
43 if (c>='0' && c<='9') return (unsigned)c - '0';
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
44 else if (c>='a' && c<='f') return 0xa + (unsigned)c - 'a';
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
45 else if (c>='A' && c<='F') return 0xa + (unsigned)c - 'A';
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
46 else return 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
47 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
48
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
49 unsigned _GUID_from_text::read_byte(const char * ptr)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
50 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
51 return (read_hex(ptr[0])<<4) | read_hex(ptr[1]);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
52 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
53 unsigned _GUID_from_text::read_word(const char * ptr)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
54 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
55 return (read_byte(ptr)<<8) | read_byte(ptr+2);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
56 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
57
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
58 unsigned _GUID_from_text::read_dword(const char * ptr)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
59 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
60 return (read_word(ptr)<<16) | read_word(ptr+4);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
61 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
62
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
63 void _GUID_from_text::read_bytes(uint8_t * out,unsigned num,const char * ptr)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
64 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
65 for(;num;num--)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
66 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
67 *out = read_byte(ptr);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
68 out++;ptr+=2;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
69 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
70 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
71
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
72
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
73 _GUID_from_text::_GUID_from_text(const char * text)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
74 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
75 if (*text=='{') text++;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
76 const char * max;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
77
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
78 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
79 const char * t = strchr(text,'}');
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
80 if (t) max = t;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
81 else max = text + strlen(text);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
82 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
83
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
84
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
85 bool OK = false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
86
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
87 do {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
88 if (text+8>max) break;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
89 m_val.Data1 = read_dword(text);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
90 text += 8;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
91 while(*text=='-') text++;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
92 if (text+4>max) break;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
93 m_val.Data2 = read_word(text);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
94 text += 4;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
95 while(*text=='-') text++;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
96 if (text+4>max) break;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
97 m_val.Data3 = read_word(text);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
98 text += 4;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
99 while(*text=='-') text++;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
100 if (text+4>max) break;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
101 read_bytes(m_val.Data4,2,text);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
102 text += 4;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
103 while(*text=='-') text++;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
104 if (text+12>max) break;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
105 read_bytes(m_val.Data4+2,6,text);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
106 OK = true;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
107 } while(false);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
108
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
109 if (!OK) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
110 m_val= pfc::guid_null;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
111 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
112 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
113 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
114
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
115 namespace pfc {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
116
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
117 GUID GUID_from_text(const char * text) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
118 return _GUID_from_text( text ).m_val;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
119 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
120
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
121 static inline char print_hex_digit(unsigned val)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
122 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
123 static constexpr char table[16] = {'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'};
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
124 PFC_ASSERT((val & ~0xF) == 0);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
125 return table[val];
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
126 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
127
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
128 static void print_hex(unsigned val,char * &out,unsigned bytes)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
129 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
130 unsigned n;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
131 for(n=0;n<bytes;n++)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
132 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
133 unsigned char c = (unsigned char)((val >> ((bytes - 1 - n) << 3)) & 0xFF);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
134 *(out++) = print_hex_digit( c >> 4 );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
135 *(out++) = print_hex_digit( c & 0xF );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
136 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
137 *out = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
138 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
139
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
140
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
141 pfc::string8 print_guid(const GUID & p_guid)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
142 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
143 char data[64];
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
144 char * out = data;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
145 print_hex(p_guid.Data1,out,4);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
146 *(out++) = '-';
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
147 print_hex(p_guid.Data2,out,2);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
148 *(out++) = '-';
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
149 print_hex(p_guid.Data3,out,2);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
150 *(out++) = '-';
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
151 print_hex(p_guid.Data4[0],out,1);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
152 print_hex(p_guid.Data4[1],out,1);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
153 *(out++) = '-';
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
154 print_hex(p_guid.Data4[2],out,1);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
155 print_hex(p_guid.Data4[3],out,1);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
156 print_hex(p_guid.Data4[4],out,1);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
157 print_hex(p_guid.Data4[5],out,1);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
158 print_hex(p_guid.Data4[6],out,1);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
159 print_hex(p_guid.Data4[7],out,1);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
160 *out = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
161 return data;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
162 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
163
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
164
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
165 void print_hex_raw(const void * buffer,unsigned bytes,char * p_out)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
166 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
167 char * out = p_out;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
168 const unsigned char * in = (const unsigned char *) buffer;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
169 unsigned n;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
170 for(n=0;n<bytes;n++)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
171 print_hex(in[n],out,1);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
172 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
173
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
174 GUID createGUID() {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
175 GUID out;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
176 #ifdef _WIN32
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
177 if (FAILED(CoCreateGuid( & out ) ) ) crash();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
178 #else
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
179 pfc::nixGetRandomData( &out, sizeof(out) );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
180 #endif
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
181 return out;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
182 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
183
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
184 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
185
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
186
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
187
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
188 namespace pfc {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
189 pfc::string8 format_guid_cpp(const GUID & guid) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
190 pfc::string8 s;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
191 s << "{0x" << pfc::format_hex(guid.Data1,8) << ", 0x" << pfc::format_hex(guid.Data2, 4) << ", 0x" << pfc::format_hex(guid.Data3,4) << ", {0x" << pfc::format_hex(guid.Data4[0],2);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
192 for(int n = 1; n < 8; ++n) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
193 s << ", 0x" << pfc::format_hex(guid.Data4[n],2);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
194 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
195 s << "}}";
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
196 return s;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
197 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
198
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
199 uint64_t halveGUID(const GUID & id) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
200 static_assert(sizeof(id) == 2 * sizeof(uint64_t), "sanity" );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
201 union {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
202 GUID g;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
203 uint64_t u[2];
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
204 } u;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
205 u.g = id;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
206 return u.u[0] ^ u.u[1];
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
207 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
208 }