@@ -280,15 +280,23 @@ class CustomAvailabilityDomain : public ASTAllocated<CustomAvailabilityDomain> {
280
280
// / Represents either a resolved availability domain or an identifier written
281
281
// / in source that has not yet been resolved to a domain.
282
282
class AvailabilityDomainOrIdentifier {
283
+ friend struct llvm ::PointerLikeTypeTraits<AvailabilityDomainOrIdentifier>;
284
+
283
285
using Storage = llvm::PointerUnion<AvailabilityDomain, Identifier>;
284
286
Storage storage;
285
287
288
+ AvailabilityDomainOrIdentifier (Storage storage) : storage(storage) {}
289
+
286
290
public:
287
291
AvailabilityDomainOrIdentifier (Identifier identifier)
288
292
: storage(identifier) {};
289
293
AvailabilityDomainOrIdentifier (AvailabilityDomain domain)
290
294
: storage(domain) {};
291
295
296
+ static AvailabilityDomainOrIdentifier fromOpaque (void *opaque) {
297
+ return AvailabilityDomainOrIdentifier (Storage::getFromOpaqueValue (opaque));
298
+ }
299
+
292
300
bool isDomain () const { return storage.is <AvailabilityDomain>(); }
293
301
bool isIdentifier () const { return storage.is <Identifier>(); }
294
302
@@ -315,6 +323,7 @@ class AvailabilityDomainOrIdentifier {
315
323
316
324
namespace llvm {
317
325
using swift::AvailabilityDomain;
326
+ using swift::AvailabilityDomainOrIdentifier;
318
327
319
328
// An AvailabilityDomain is "pointer like".
320
329
template <typename T>
@@ -352,6 +361,25 @@ struct DenseMapInfo<AvailabilityDomain> {
352
361
}
353
362
};
354
363
364
+ // An AvailabilityDomainOrIdentifier is "pointer like".
365
+ template <typename T>
366
+ struct PointerLikeTypeTraits ;
367
+ template <>
368
+ struct PointerLikeTypeTraits <swift::AvailabilityDomainOrIdentifier> {
369
+ public:
370
+ static inline void *getAsVoidPointer (AvailabilityDomainOrIdentifier value) {
371
+ return value.storage .getOpaqueValue ();
372
+ }
373
+ static inline swift::AvailabilityDomainOrIdentifier
374
+ getFromVoidPointer (void *P) {
375
+ return AvailabilityDomainOrIdentifier::fromOpaque (P);
376
+ }
377
+ enum {
378
+ NumLowBitsAvailable = PointerLikeTypeTraits<
379
+ AvailabilityDomainOrIdentifier::Storage>::NumLowBitsAvailable
380
+ };
381
+ };
382
+
355
383
} // end namespace llvm
356
384
357
385
#endif
0 commit comments