1717#ifndef SWIFT_AST_AVAILABILITY_RANGE_H
1818#define SWIFT_AST_AVAILABILITY_RANGE_H
1919
20+ #include " swift/Basic/Assertions.h"
2021#include " swift/Basic/LLVM.h"
2122#include " llvm/ADT/FoldingSet.h"
2223#include " llvm/Support/VersionTuple.h"
@@ -36,36 +37,39 @@ class VersionRange {
3637 // All: all versions
3738 // x.y.x: all versions greater than or equal to x.y.z
3839
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+ }
4049
4150 // A version range is either an extremal value (Empty, All) or
4251 // a single version tuple value representing the lower end point x.y.z of a
4352 // range [x.y.z, +Inf).
44- union {
45- llvm::VersionTuple LowerEndpoint;
46- ExtremalRange ExtremalValue;
47- };
48-
49- unsigned HasLowerEndpoint : 1 ;
53+ llvm::VersionTuple LowerEndpoint;
5054
5155public:
5256 // / Returns true if the range of versions is empty, or false otherwise.
5357 bool isEmpty () const {
54- return !HasLowerEndpoint && ExtremalValue == ExtremalRange::Empty ;
58+ return !hasLowerEndpoint () && LowerEndpoint == getEmptyTuple () ;
5559 }
5660
5761 // / Returns true if the range includes all versions, or false otherwise.
5862 bool isAll () const {
59- return !HasLowerEndpoint && ExtremalValue == ExtremalRange::All ;
63+ return !hasLowerEndpoint () && LowerEndpoint == getAllTuple () ;
6064 }
6165
6266 // / Returns true if the range has a lower end point; that is, if it is of
6367 // / the form [X, +Inf).
64- bool hasLowerEndpoint () const { return HasLowerEndpoint ; }
68+ bool hasLowerEndpoint () const { return isValidVersion (LowerEndpoint) ; }
6569
6670 // / Returns the range's lower endpoint.
6771 const llvm::VersionTuple &getLowerEndpoint () const {
68- assert (HasLowerEndpoint );
72+ assert (hasLowerEndpoint () );
6973 return LowerEndpoint;
7074 }
7175
@@ -124,7 +128,7 @@ class VersionRange {
124128 const llvm::VersionTuple maxVersion =
125129 std::max (this ->getLowerEndpoint (), Other.getLowerEndpoint ());
126130
127- setLowerEndpoint ( maxVersion) ;
131+ LowerEndpoint = maxVersion;
128132 }
129133
130134 // / Mutates this range to be the union of itself and Other. This is the
@@ -145,7 +149,7 @@ class VersionRange {
145149 const llvm::VersionTuple minVersion =
146150 std::min (this ->getLowerEndpoint (), Other.getLowerEndpoint ());
147151
148- setLowerEndpoint ( minVersion) ;
152+ LowerEndpoint = minVersion;
149153 }
150154
151155 // / Mutates this range to be a best effort over-approximation of the
@@ -160,37 +164,29 @@ class VersionRange {
160164 }
161165
162166 // / Returns a version range representing all versions.
163- static VersionRange all () { return VersionRange (ExtremalRange::All ); }
167+ static VersionRange all () { return VersionRange (getAllTuple () ); }
164168
165169 // / 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+ }
167177
168178 // / Returns a version range representing all versions greater than or equal
169179 // / to the passed-in version.
170180 static VersionRange allGTE (const llvm::VersionTuple &EndPoint) {
181+ ASSERT (isValidVersion (EndPoint));
171182 return VersionRange (EndPoint);
172183 }
173184
174185 void Profile (llvm::FoldingSetNodeID &ID) const ;
175186
176187private:
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) {}
194190};
195191
196192// / Represents a version range in which something is available.
@@ -327,7 +323,7 @@ class AvailabilityRange {
327323 // / Returns a representation of the raw version range as a string for
328324 // / debugging purposes.
329325 std::string getVersionString () const {
330- assert (Range.hasLowerEndpoint ());
326+ ASSERT (Range.hasLowerEndpoint ());
331327 return Range.getLowerEndpoint ().getAsString ();
332328 }
333329};
0 commit comments