| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105 |
- /*
- * Copyright (c) 2012-2026 Daniele Bartolini et al.
- * SPDX-License-Identifier: GPL-3.0-or-later
- */
- namespace Crown
- {
- [Compact]
- public struct Guid
- {
- uint64 data1;
- uint64 data2;
- public static Guid new_guid()
- {
- // FIXME: Replace Rand with something better.
- Rand rnd = new Rand();
- uint64 a = rnd.next_int();
- uint64 b = rnd.next_int();
- uint64 c = rnd.next_int();
- uint64 d = rnd.next_int();
- uint64 d1;
- d1 = a << 32;
- d1 |= b << 0;
- uint64 d2;
- d2 = c << 32;
- d2 |= d << 0;
- d1 = (d1 & 0xffffffffffff4fffu) | 0x4000u;
- d2 = (d2 & 0x3fffffffffffffffu) | 0x8000000000000000u;
- return { d1, d2 };
- }
- public static Guid parse(string guid)
- {
- Guid g;
- bool success = Guid.try_parse(guid, out g);
- assert(success);
- return g;
- }
- public static bool try_parse(string str, out Guid guid)
- {
- uint32 a = 0;
- uint32 b = 0;
- uint32 c = 0;
- uint32 d = 0;
- uint32 e = 0;
- uint32 f = 0;
- int num = str.scanf("%8x-%4x-%4x-%4x-%4x%8x", &a, &b, &c, &d, &e, &f);
- uint64 d1;
- d1 = ((uint64)a) << 32;
- d1 |= ((uint64)b) << 16;
- d1 |= ((uint64)c) << 0;
- uint64 d2;
- d2 = ((uint64)d) << 48;
- d2 |= ((uint64)e) << 32;
- d2 |= ((uint64)f) << 0;
- guid = { d1, d2 };
- return num == 6;
- }
- public string to_string()
- {
- return "%.8x-%.4x-%.4x-%.4x-%.4x%.8x".printf((uint32)((data1 & 0xffffffff00000000u) >> 32)
- , (uint16)((data1 & 0x00000000ffff0000u) >> 16)
- , (uint16)((data1 & 0x000000000000ffffu) >> 0)
- , (uint16)((data2 & 0xffff000000000000u) >> 48)
- , (uint16)((data2 & 0x0000ffff00000000u) >> 32)
- , (uint32)((data2 & 0x00000000ffffffffu) >> 0)
- );
- }
- public string to_debug_string()
- {
- return "%.3x..%.3x".printf((uint)(data1 >> 52), (uint)(data2 & 0xfffu));
- }
- public static uint hash_func(Guid? id)
- {
- return (uint)(id.data1 ^ id.data2);
- }
- public static bool equal_func(Guid? a, Guid? b)
- {
- return a.data1 == b.data1
- && a.data2 == b.data2
- ;
- }
- public static int compare_func(Guid a, Guid b)
- {
- if (a.data1 != b.data1)
- return a.data1 < b.data1 ? -1 : 1;
- if (a.data2 != b.data2)
- return a.data2 < b.data2 ? -1 : 1;
- return 0;
- }
- }
- public const Guid GUID_ZERO = { 0u, 0u };
- } /* namespace Crown */
|