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 EqualsnsID48 inline bool Equals(const nsID& aOther) const 49 { 50 // Unfortunately memcmp isn't faster than this. 51 return 52 (((uint32_t*)&m0)[0] == ((uint32_t*)&aOther.m0)[0]) && 53 (((uint32_t*)&m0)[1] == ((uint32_t*)&aOther.m0)[1]) && 54 (((uint32_t*)&m0)[2] == ((uint32_t*)&aOther.m0)[2]) && 55 (((uint32_t*)&m0)[3] == ((uint32_t*)&aOther.m0)[3]); 56 } 57 58 inline bool operator==(const nsID& aOther) const 59 { 60 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: nsIDToCString(const nsID & aID)99 explicit nsIDToCString(const nsID& aID) 100 { 101 aID.ToProvidedString(mStringBytes); 102 } 103 get()104 const char *get() const 105 { 106 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 180