1 module nulib.system.com.uuid;
2 import numem.core.traits : getUDAs, hasUDA;
3 import nuuuid = nulib.uuid;
4 
5 /**
6     UUID
7 */
8 alias UUID = nuuuid.UUID;
9 alias uuid_t = UUID; /// ditto
10 
11 /**
12     A Compile-Time Globally Unique Identifier.
13 */
14 enum Guid(string guid) = nuuuid.CTUUID!(guid, true);
15 
16 /**
17     A Globally Unique Identifier.
18 */
19 enum Guid(uint time_low, ushort time_mid, ushort time_hi_and_version, ubyte clk0, ubyte clk1, ubyte d0, ubyte d1, ubyte d2, ubyte d3, ubyte d4, ubyte d5) = 
20     nuuuid.UUID(time_low, time_mid, time_hi_and_version, clk1, clk0, d0, d1, d2, d3, d4, d5);
21 
22 /**
23     Globally unique identifier.
24 */
25 alias GUID = UUID;
26 alias LPGUID = GUID*; /// ditto
27 alias LPCGUID = const(GUID)*; /// ditto
28 alias REFGUID = const(GUID)*; /// ditto
29 
30 /**
31     A null GUID
32 */
33 enum GUID GUID_NULL = UUID(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0);
34 alias IID_NULL = GUID_NULL; /// ditto
35 alias CLSID_NULL = GUID_NULL; /// ditto
36 
37 /**
38     Interface ID
39 */
40 alias IID = UUID;
41 alias LPIID = IID*; /// ditto
42 alias LPCIID = const(IID)*; /// ditto
43 alias REFIID = const(IID)*; /// ditto
44 
45 /**
46     Class ID
47 */
48 alias CLSID = UUID;
49 alias LPCLSID = CLSID*; /// ditto
50 alias LPCCLSID = const(CLSID)*; /// ditto
51 alias REFCLSID = const(CLSID)*; /// ditto
52 
53 /**
54     Format ID
55 */
56 alias FMTID = const(UUID);
57 alias LPFMTID = FMTID*; /// ditto
58 alias LPCFMTID = const(FMTID)*; /// ditto
59 alias REFFMTID = const(FMTID)*; /// ditto
60 
61 /**
62     Gets the $(D Guid) for the given type if possible.
63 
64     You can check if a type has a Guid with a $(D is(__uuidof!T)) expression.
65 */
66 template __uuidof(T, A...) {
67     import nulib.system.com.uuid : Guid;
68 
69     static if (A.length == 0) {
70         alias attrs = __traits(getAttributes, T);
71 
72         static if (attrs.length > 0)
73             enum __uuidof = __uuidof!(T, attrs);
74         else
75             static assert(0, T.stringof~" lacks a GUID!");
76     } else static if (A.length == 1) {
77         static assert (is(typeof(A[0]) == UUID), T.stringof~" lacks a GUID!");
78         enum __uuidof = A[0];
79     } else static if (is(typeof(A[0]) == UUID)) {
80         enum __uuidof = A[0];
81     } else {
82         enum __uuidof = __uuidof!(T, A[1 .. $]);
83     }
84 }
85