Skip to content

Commit bd4b562

Browse files
committed
AST: Make AvailabilityDomainOrIdentifier pointer-like.
1 parent 35a4175 commit bd4b562

File tree

1 file changed

+28
-0
lines changed

1 file changed

+28
-0
lines changed

include/swift/AST/AvailabilityDomain.h

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -280,15 +280,23 @@ class CustomAvailabilityDomain : public ASTAllocated<CustomAvailabilityDomain> {
280280
/// Represents either a resolved availability domain or an identifier written
281281
/// in source that has not yet been resolved to a domain.
282282
class AvailabilityDomainOrIdentifier {
283+
friend struct llvm::PointerLikeTypeTraits<AvailabilityDomainOrIdentifier>;
284+
283285
using Storage = llvm::PointerUnion<AvailabilityDomain, Identifier>;
284286
Storage storage;
285287

288+
AvailabilityDomainOrIdentifier(Storage storage) : storage(storage) {}
289+
286290
public:
287291
AvailabilityDomainOrIdentifier(Identifier identifier)
288292
: storage(identifier) {};
289293
AvailabilityDomainOrIdentifier(AvailabilityDomain domain)
290294
: storage(domain) {};
291295

296+
static AvailabilityDomainOrIdentifier fromOpaque(void *opaque) {
297+
return AvailabilityDomainOrIdentifier(Storage::getFromOpaqueValue(opaque));
298+
}
299+
292300
bool isDomain() const { return storage.is<AvailabilityDomain>(); }
293301
bool isIdentifier() const { return storage.is<Identifier>(); }
294302

@@ -315,6 +323,7 @@ class AvailabilityDomainOrIdentifier {
315323

316324
namespace llvm {
317325
using swift::AvailabilityDomain;
326+
using swift::AvailabilityDomainOrIdentifier;
318327

319328
// An AvailabilityDomain is "pointer like".
320329
template <typename T>
@@ -352,6 +361,25 @@ struct DenseMapInfo<AvailabilityDomain> {
352361
}
353362
};
354363

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+
355383
} // end namespace llvm
356384

357385
#endif

0 commit comments

Comments
 (0)