26
26
#include " llvm/ADT/STLExtras.h"
27
27
#include < optional>
28
28
29
+ namespace swift {
30
+ class AbstractConformance ;
31
+ }
32
+
29
33
namespace llvm {
30
- class raw_ostream ;
34
+ class raw_ostream ;
35
+
36
+ template <>
37
+ struct PointerLikeTypeTraits <swift::AbstractConformance *> {
38
+ public:
39
+ static inline void *getAsVoidPointer (swift::AbstractConformance *ptr) {
40
+ return ptr;
41
+ }
42
+ static inline swift::AbstractConformance *getFromVoidPointer (void *ptr) {
43
+ return (swift::AbstractConformance *)ptr;
44
+ }
45
+ enum { NumLowBitsAvailable = swift::TypeAlignInBits };
46
+ };
31
47
}
32
48
33
49
namespace swift {
@@ -53,22 +69,27 @@ enum class EffectKind : uint8_t;
53
69
// / ProtocolConformanceRef allows the efficient recovery of the protocol
54
70
// / even when the conformance is abstract.
55
71
class ProtocolConformanceRef {
56
- using UnionType = llvm::PointerUnion<ProtocolDecl *,
72
+ public:
73
+ using UnionType = llvm::PointerUnion<AbstractConformance *,
57
74
ProtocolConformance *,
58
75
PackConformance *>;
76
+
77
+ private:
59
78
UnionType Union;
60
79
61
80
explicit ProtocolConformanceRef (UnionType value) : Union(value) {}
62
81
82
+ public:
83
+ ProtocolConformanceRef () : Union() {}
84
+ ProtocolConformanceRef (std::nullptr_t ) : Union() {}
85
+
63
86
// / Create an abstract protocol conformance reference.
64
- explicit ProtocolConformanceRef (ProtocolDecl *proto) : Union(proto) {
65
- assert (proto != nullptr &&
87
+ explicit ProtocolConformanceRef (AbstractConformance *abstract)
88
+ : Union(abstract) {
89
+ assert (abstract != nullptr &&
66
90
" cannot construct ProtocolConformanceRef with null" );
67
91
}
68
92
69
- public:
70
- ProtocolConformanceRef () : Union() {}
71
-
72
93
// / Create a concrete protocol conformance reference.
73
94
explicit ProtocolConformanceRef (ProtocolConformance *conf) : Union(conf) {
74
95
assert (conf != nullptr &&
@@ -95,7 +116,7 @@ class ProtocolConformanceRef {
95
116
explicit operator bool () const { return !isInvalid (); }
96
117
97
118
// / Create an abstract conformance for a type parameter or archetype.
98
- static ProtocolConformanceRef forAbstract (Type subjectType ,
119
+ static ProtocolConformanceRef forAbstract (Type conformingType ,
99
120
ProtocolDecl *protocol);
100
121
101
122
bool isConcrete () const {
@@ -115,12 +136,11 @@ class ProtocolConformanceRef {
115
136
}
116
137
117
138
bool isAbstract () const {
118
- return !isInvalid () && Union.is <ProtocolDecl *>();
139
+ return !isInvalid () && Union.is <AbstractConformance *>();
119
140
}
120
141
121
- ProtocolDecl *getAbstract () const {
122
- ASSERT (isAbstract ());
123
- return Union.get <ProtocolDecl*>();
142
+ AbstractConformance *getAbstract () const {
143
+ return Union.get <AbstractConformance *>();
124
144
}
125
145
126
146
// / Determine whether this conformance (or a conformance it depends on)
@@ -149,7 +169,7 @@ class ProtocolConformanceRef {
149
169
// / The given `body` will be called on each isolated conformance. If it ever
150
170
// / returns `true`, this function will abort the search and return `true`.
151
171
bool forEachIsolatedConformance (
152
- llvm::function_ref<bool (ProtocolConformance* )> body
172
+ llvm::function_ref<bool (ProtocolConformanceRef )> body
153
173
) const ;
154
174
155
175
using OpaqueValue = void *;
@@ -158,8 +178,11 @@ class ProtocolConformanceRef {
158
178
return ProtocolConformanceRef (UnionType::getFromOpaqueValue (value));
159
179
}
160
180
181
+ // / Retrieve the conforming type.
182
+ Type getType () const ;
183
+
161
184
// / Return the protocol requirement.
162
- ProtocolDecl *getRequirement () const ;
185
+ ProtocolDecl *getProtocol () const ;
163
186
164
187
// / Apply a substitution to the conforming type.
165
188
ProtocolConformanceRef subst (Type origType, SubstitutionMap subMap,
@@ -240,4 +263,22 @@ SourceLoc extractNearestSourceLoc(const ProtocolConformanceRef conformanceRef);
240
263
241
264
} // end namespace swift
242
265
266
+ namespace llvm {
267
+ class raw_ostream ;
268
+
269
+ template <>
270
+ struct PointerLikeTypeTraits <swift::ProtocolConformanceRef>
271
+ : PointerLikeTypeTraits<swift::ProtocolConformanceRef::UnionType>
272
+ {
273
+ public:
274
+ static inline void *getAsVoidPointer (swift::ProtocolConformanceRef ref) {
275
+ return ref.getOpaqueValue ();
276
+ }
277
+ static inline swift::ProtocolConformanceRef getFromVoidPointer (void *ptr) {
278
+ return swift::ProtocolConformanceRef::getFromOpaqueValue (ptr);
279
+ }
280
+ };
281
+
282
+ }
283
+
243
284
#endif // LLVM_SWIFT_AST_PROTOCOLCONFORMANCEREF_H
0 commit comments