17
17
#ifndef SWIFT_AST_AVAILABILITY_RANGE_H
18
18
#define SWIFT_AST_AVAILABILITY_RANGE_H
19
19
20
+ #include " swift/Basic/Assertions.h"
20
21
#include " swift/Basic/LLVM.h"
21
22
#include " llvm/ADT/FoldingSet.h"
22
23
#include " llvm/Support/VersionTuple.h"
@@ -36,36 +37,39 @@ class VersionRange {
36
37
// All: all versions
37
38
// x.y.x: all versions greater than or equal to x.y.z
38
39
39
- enum class ExtremalRange { Empty, All };
40
+ // / The sentinel version tuple representing a range containing all versions.
41
+ constexpr static llvm::VersionTuple getAllTuple () {
42
+ return llvm::VersionTuple (0x7FFFFFFE );
43
+ }
44
+
45
+ // / The sentinel version tuple representing an empty range.
46
+ constexpr static llvm::VersionTuple getEmptyTuple () {
47
+ return llvm::VersionTuple (0x7FFFFFFF );
48
+ }
40
49
41
50
// A version range is either an extremal value (Empty, All) or
42
51
// a single version tuple value representing the lower end point x.y.z of a
43
52
// range [x.y.z, +Inf).
44
- union {
45
- llvm::VersionTuple LowerEndpoint;
46
- ExtremalRange ExtremalValue;
47
- };
48
-
49
- unsigned HasLowerEndpoint : 1 ;
53
+ llvm::VersionTuple LowerEndpoint;
50
54
51
55
public:
52
56
// / Returns true if the range of versions is empty, or false otherwise.
53
57
bool isEmpty () const {
54
- return !HasLowerEndpoint && ExtremalValue == ExtremalRange::Empty ;
58
+ return !hasLowerEndpoint () && LowerEndpoint == getEmptyTuple () ;
55
59
}
56
60
57
61
// / Returns true if the range includes all versions, or false otherwise.
58
62
bool isAll () const {
59
- return !HasLowerEndpoint && ExtremalValue == ExtremalRange::All ;
63
+ return !hasLowerEndpoint () && LowerEndpoint == getAllTuple () ;
60
64
}
61
65
62
66
// / Returns true if the range has a lower end point; that is, if it is of
63
67
// / the form [X, +Inf).
64
- bool hasLowerEndpoint () const { return HasLowerEndpoint ; }
68
+ bool hasLowerEndpoint () const { return isValidVersion (LowerEndpoint) ; }
65
69
66
70
// / Returns the range's lower endpoint.
67
71
const llvm::VersionTuple &getLowerEndpoint () const {
68
- assert (HasLowerEndpoint );
72
+ assert (hasLowerEndpoint () );
69
73
return LowerEndpoint;
70
74
}
71
75
@@ -124,7 +128,7 @@ class VersionRange {
124
128
const llvm::VersionTuple maxVersion =
125
129
std::max (this ->getLowerEndpoint (), Other.getLowerEndpoint ());
126
130
127
- setLowerEndpoint ( maxVersion) ;
131
+ LowerEndpoint = maxVersion;
128
132
}
129
133
130
134
// / Mutates this range to be the union of itself and Other. This is the
@@ -145,7 +149,7 @@ class VersionRange {
145
149
const llvm::VersionTuple minVersion =
146
150
std::min (this ->getLowerEndpoint (), Other.getLowerEndpoint ());
147
151
148
- setLowerEndpoint ( minVersion) ;
152
+ LowerEndpoint = minVersion;
149
153
}
150
154
151
155
// / Mutates this range to be a best effort over-approximation of the
@@ -160,37 +164,29 @@ class VersionRange {
160
164
}
161
165
162
166
// / Returns a version range representing all versions.
163
- static VersionRange all () { return VersionRange (ExtremalRange::All ); }
167
+ static VersionRange all () { return VersionRange (getAllTuple () ); }
164
168
165
169
// / Returns a version range representing no versions.
166
- static VersionRange empty () { return VersionRange (ExtremalRange::Empty); }
170
+ static VersionRange empty () { return VersionRange (getEmptyTuple ()); }
171
+
172
+ // / Returns false if the given version tuple cannot be used as a lower
173
+ // / endpoint for `VersionRange`.
174
+ static bool isValidVersion (const llvm::VersionTuple &EndPoint) {
175
+ return EndPoint != getAllTuple () && EndPoint != getEmptyTuple ();
176
+ }
167
177
168
178
// / Returns a version range representing all versions greater than or equal
169
179
// / to the passed-in version.
170
180
static VersionRange allGTE (const llvm::VersionTuple &EndPoint) {
181
+ ASSERT (isValidVersion (EndPoint));
171
182
return VersionRange (EndPoint);
172
183
}
173
184
174
185
void Profile (llvm::FoldingSetNodeID &ID) const ;
175
186
176
187
private:
177
- VersionRange (const llvm::VersionTuple &LowerEndpoint) {
178
- setLowerEndpoint (LowerEndpoint);
179
- }
180
-
181
- VersionRange (ExtremalRange ExtremalValue) {
182
- setExtremalRange (ExtremalValue);
183
- }
184
-
185
- void setExtremalRange (ExtremalRange Version) {
186
- HasLowerEndpoint = 0 ;
187
- ExtremalValue = Version;
188
- }
189
-
190
- void setLowerEndpoint (const llvm::VersionTuple &Version) {
191
- HasLowerEndpoint = 1 ;
192
- LowerEndpoint = Version;
193
- }
188
+ VersionRange (const llvm::VersionTuple &LowerEndpoint)
189
+ : LowerEndpoint(LowerEndpoint) {}
194
190
};
195
191
196
192
// / Represents a version range in which something is available.
@@ -327,7 +323,7 @@ class AvailabilityRange {
327
323
// / Returns a representation of the raw version range as a string for
328
324
// / debugging purposes.
329
325
std::string getVersionString () const {
330
- assert (Range.hasLowerEndpoint ());
326
+ ASSERT (Range.hasLowerEndpoint ());
331
327
return Range.getLowerEndpoint ().getAsString ();
332
328
}
333
329
};
0 commit comments