Line data Source code
1 : /* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
2 : /* vim: set ts=8 sts=2 et sw=2 tw=80: */
3 : /* This Source Code Form is subject to the terms of the Mozilla Public
4 : * License, v. 2.0. If a copy of the MPL was not distributed with this
5 : * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
6 :
7 : #ifndef nsID_h__
8 : #define nsID_h__
9 :
10 : #include <string.h>
11 :
12 : #include "nscore.h"
13 :
14 : #define NSID_LENGTH 39
15 :
16 : /**
17 : * A "unique identifier". This is modeled after OSF DCE UUIDs.
18 : */
19 :
20 : struct nsID
21 : {
22 : /**
23 : * @name Identifier values
24 : */
25 :
26 : //@{
27 : uint32_t m0;
28 : uint16_t m1;
29 : uint16_t m2;
30 : uint8_t m3[8];
31 : //@}
32 :
33 : /**
34 : * @name Methods
35 : */
36 :
37 : //@{
38 : /**
39 : * Ensures everything is zeroed out.
40 : */
41 : void Clear();
42 :
43 : /**
44 : * Equivalency method. Compares this nsID with another.
45 : * @return <b>true</b> if they are the same, <b>false</b> if not.
46 : */
47 :
48 1953151 : inline bool Equals(const nsID& aOther) const
49 : {
50 : // Unfortunately memcmp isn't faster than this.
51 : return
52 2560324 : (((uint32_t*)&m0)[0] == ((uint32_t*)&aOther.m0)[0]) &&
53 1214346 : (((uint32_t*)&m0)[1] == ((uint32_t*)&aOther.m0)[1]) &&
54 3167497 : (((uint32_t*)&m0)[2] == ((uint32_t*)&aOther.m0)[2]) &&
55 2560324 : (((uint32_t*)&m0)[3] == ((uint32_t*)&aOther.m0)[3]);
56 : }
57 :
58 0 : inline bool operator==(const nsID& aOther) const
59 : {
60 0 : return Equals(aOther);
61 : }
62 :
63 : /**
64 : * nsID Parsing method. Turns a {xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx}
65 : * string into an nsID
66 : */
67 : bool Parse(const char* aIDStr);
68 :
69 : #ifndef XPCOM_GLUE_AVOID_NSPR
70 : /**
71 : * nsID string encoder. Returns an allocated string in
72 : * {xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx} format. Caller should free string.
73 : * YOU SHOULD ONLY USE THIS IF YOU CANNOT USE ToProvidedString() BELOW.
74 : */
75 : char* ToString() const;
76 :
77 : /**
78 : * nsID string encoder. Builds a string in
79 : * {xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx} format, into a char[NSID_LENGTH]
80 : * buffer provided by the caller (for instance, on the stack).
81 : */
82 : void ToProvidedString(char (&aDest)[NSID_LENGTH]) const;
83 :
84 : #endif // XPCOM_GLUE_AVOID_NSPR
85 :
86 : //@}
87 : };
88 :
89 : #ifndef XPCOM_GLUE_AVOID_NSPR
90 : /**
91 : * A stack helper class to convert a nsID to a string. Useful
92 : * for printing nsIDs. For example:
93 : * nsID aID = ...;
94 : * printf("%s", nsIDToCString(aID).get());
95 : */
96 : class nsIDToCString
97 : {
98 : public:
99 5 : explicit nsIDToCString(const nsID& aID)
100 5 : {
101 5 : aID.ToProvidedString(mStringBytes);
102 5 : }
103 :
104 5 : const char *get() const
105 : {
106 5 : return mStringBytes;
107 : }
108 :
109 : protected:
110 : char mStringBytes[NSID_LENGTH];
111 : };
112 : #endif
113 :
114 : /*
115 : * Class IDs
116 : */
117 :
118 : typedef nsID nsCID;
119 :
120 : // Define an CID
121 : #define NS_DEFINE_CID(_name, _cidspec) \
122 : const nsCID _name = _cidspec
123 :
124 : #define NS_DEFINE_NAMED_CID(_name) \
125 : static const nsCID k##_name = _name
126 :
127 : #define REFNSCID const nsCID&
128 :
129 : /**
130 : * An "interface id" which can be used to uniquely identify a given
131 : * interface.
132 : */
133 :
134 : typedef nsID nsIID;
135 :
136 : /**
137 : * A macro shorthand for <tt>const nsIID&<tt>
138 : */
139 :
140 : #define REFNSIID const nsIID&
141 :
142 : /**
143 : * Define an IID
144 : * obsolete - do not use this macro
145 : */
146 :
147 : #define NS_DEFINE_IID(_name, _iidspec) \
148 : const nsIID _name = _iidspec
149 :
150 : /**
151 : * A macro to build the static const IID accessor method. The Dummy
152 : * template parameter only exists so that the kIID symbol will be linked
153 : * properly (weak symbol on linux, gnu_linkonce on mac, multiple-definitions
154 : * merged on windows). Dummy should always be instantiated as "void".
155 : */
156 :
157 : #define NS_DECLARE_STATIC_IID_ACCESSOR(the_iid) \
158 : template<typename T, typename U> \
159 : struct COMTypeInfo;
160 :
161 : #define NS_DEFINE_STATIC_IID_ACCESSOR(the_interface, the_iid) \
162 : template<typename T> \
163 : struct the_interface::COMTypeInfo<the_interface, T> { \
164 : static const nsIID kIID NS_HIDDEN; \
165 : }; \
166 : template<typename T> \
167 : const nsIID the_interface::COMTypeInfo<the_interface, T>::kIID NS_HIDDEN = the_iid;
168 :
169 : /**
170 : * A macro to build the static const CID accessor method
171 : */
172 :
173 : #define NS_DEFINE_STATIC_CID_ACCESSOR(the_cid) \
174 : static const nsID& GetCID() {static const nsID cid = the_cid; return cid;}
175 :
176 : #define NS_GET_IID(T) (T::COMTypeInfo<T, void>::kIID)
177 : #define NS_GET_TEMPLATE_IID(T) (T::template COMTypeInfo<T, void>::kIID)
178 :
179 : #endif
|