27
27
28
28
namespace llvm {
29
29
30
- template <typename T>
31
- class Optional {
30
+ template <typename T> class Optional {
32
31
AlignedCharArrayUnion<T> storage;
33
32
bool hasVal = false ;
34
33
@@ -38,18 +37,14 @@ class Optional {
38
37
Optional (NoneType) {}
39
38
explicit Optional () {}
40
39
41
- Optional (const T &y) : hasVal(true ) {
42
- new (storage.buffer ) T (y);
43
- }
40
+ Optional (const T &y) : hasVal(true ) { new (storage.buffer ) T (y); }
44
41
45
42
Optional (const Optional &O) : hasVal(O.hasVal) {
46
43
if (hasVal)
47
44
new (storage.buffer ) T (*O);
48
45
}
49
46
50
- Optional (T &&y) : hasVal(true ) {
51
- new (storage.buffer ) T (std::forward<T>(y));
52
- }
47
+ Optional (T &&y) : hasVal(true ) { new (storage.buffer ) T (std::forward<T>(y)); }
53
48
54
49
Optional (Optional<T> &&O) : hasVal(O) {
55
50
if (O) {
@@ -58,9 +53,7 @@ class Optional {
58
53
}
59
54
}
60
55
61
- ~Optional () {
62
- reset ();
63
- }
56
+ ~Optional () { reset (); }
64
57
65
58
Optional &operator =(T &&y) {
66
59
if (hasVal)
@@ -83,14 +76,13 @@ class Optional {
83
76
}
84
77
85
78
// / Create a new object by constructing it in place with the given arguments.
86
- template <typename ...ArgTypes>
87
- void emplace (ArgTypes &&...Args) {
79
+ template <typename ... ArgTypes> void emplace (ArgTypes &&... Args) {
88
80
reset ();
89
81
hasVal = true ;
90
82
new (storage.buffer ) T (std::forward<ArgTypes>(Args)...);
91
83
}
92
84
93
- static inline Optional create (const T* y) {
85
+ static inline Optional create (const T * y) {
94
86
return y ? Optional (*y) : Optional ();
95
87
}
96
88
@@ -124,26 +116,50 @@ class Optional {
124
116
}
125
117
}
126
118
127
- const T* getPointer () const { assert (hasVal); return reinterpret_cast <const T*>(storage.buffer ); }
128
- T* getPointer () { assert (hasVal); return reinterpret_cast <T*>(storage.buffer ); }
129
- const T& getValue () const LLVM_LVALUE_FUNCTION { assert (hasVal); return *getPointer (); }
130
- T& getValue () LLVM_LVALUE_FUNCTION { assert (hasVal); return *getPointer (); }
119
+ const T *getPointer () const {
120
+ assert (hasVal);
121
+ return reinterpret_cast <const T *>(storage.buffer );
122
+ }
123
+ T *getPointer () {
124
+ assert (hasVal);
125
+ return reinterpret_cast <T *>(storage.buffer );
126
+ }
127
+ const T &getValue () const LLVM_LVALUE_FUNCTION {
128
+ assert (hasVal);
129
+ return *getPointer ();
130
+ }
131
+ T &getValue () LLVM_LVALUE_FUNCTION {
132
+ assert (hasVal);
133
+ return *getPointer ();
134
+ }
131
135
132
136
explicit operator bool () const { return hasVal; }
133
137
bool hasValue () const { return hasVal; }
134
- const T* operator ->() const { return getPointer (); }
135
- T* operator ->() { return getPointer (); }
136
- const T& operator *() const LLVM_LVALUE_FUNCTION { assert (hasVal); return *getPointer (); }
137
- T& operator *() LLVM_LVALUE_FUNCTION { assert (hasVal); return *getPointer (); }
138
+ const T *operator ->() const { return getPointer (); }
139
+ T *operator ->() { return getPointer (); }
140
+ const T &operator *() const LLVM_LVALUE_FUNCTION {
141
+ assert (hasVal);
142
+ return *getPointer ();
143
+ }
144
+ T &operator *() LLVM_LVALUE_FUNCTION {
145
+ assert (hasVal);
146
+ return *getPointer ();
147
+ }
138
148
139
149
template <typename U>
140
150
constexpr T getValueOr (U &&value) const LLVM_LVALUE_FUNCTION {
141
151
return hasValue () ? getValue () : std::forward<U>(value);
142
152
}
143
153
144
154
#if LLVM_HAS_RVALUE_REFERENCE_THIS
145
- T&& getValue() && { assert (hasVal); return std::move (*getPointer ()); }
146
- T&& operator *() && { assert (hasVal); return std::move (*getPointer ()); }
155
+ T &&getValue() && {
156
+ assert (hasVal);
157
+ return std::move (*getPointer ());
158
+ }
159
+ T &&operator *() && {
160
+ assert (hasVal);
161
+ return std::move (*getPointer ());
162
+ }
147
163
148
164
template <typename U>
149
165
T getValueOr (U &&value) && {
0 commit comments