@@ -168,45 +168,6 @@ struct _Meta_at_<_List<_Types...>, _Idx, enable_if_t<(_Idx < sizeof...(_Types))>
168
168
};
169
169
#endif // ^^^ !defined(__clang__) ^^^
170
170
171
- inline constexpr auto _Meta_npos = ~size_t{0};
172
-
173
- constexpr size_t _Meta_find_index_i_(const bool* const _Ptr, const size_t _Count, size_t _Idx = 0) {
174
- // return the index of the first true in the _Count bools at _Ptr, or _Meta_npos if all are false
175
- for (; _Idx < _Count; ++_Idx) {
176
- if (_Ptr[_Idx]) {
177
- return _Idx;
178
- }
179
- }
180
-
181
- return _Meta_npos;
182
- }
183
-
184
- template <class _List, class _Ty>
185
- struct _Meta_find_unique_index_ {
186
- using type = integral_constant<size_t, _Meta_npos>;
187
- };
188
- template <class _List, class _Ty>
189
- using _Meta_find_unique_index =
190
- // The index of _Ty in _List if it occurs exactly once, otherwise _Meta_npos
191
- typename _Meta_find_unique_index_<_List, _Ty>::type;
192
-
193
- constexpr size_t _Meta_find_unique_index_i_2(const bool* const _Ptr, const size_t _Count, const size_t _First) {
194
- // return _First if there is no _First < j < _Count such that _Ptr[j] is true, otherwise _Meta_npos
195
- return _First != _Meta_npos && _STD _Meta_find_index_i_(_Ptr, _Count, _First + 1) == _Meta_npos ? _First
196
- : _Meta_npos;
197
- }
198
-
199
- constexpr size_t _Meta_find_unique_index_i_(const bool* const _Ptr, const size_t _Count) {
200
- // Pass the smallest i such that _Ptr[i] is true to _Meta_find_unique_index_i_2
201
- return _STD _Meta_find_unique_index_i_2(_Ptr, _Count, _STD _Meta_find_index_i_(_Ptr, _Count));
202
- }
203
-
204
- template <template <class...> class _List, class _First, class... _Rest, class _Ty>
205
- struct _Meta_find_unique_index_<_List<_First, _Rest...>, _Ty> {
206
- static constexpr bool _Bools[] = {is_same_v<_First, _Ty>, is_same_v<_Rest, _Ty>...};
207
- using type = integral_constant<size_t, _STD _Meta_find_unique_index_i_(_Bools, 1 + sizeof...(_Rest))>;
208
- };
209
-
210
171
template <class>
211
172
struct _Meta_as_list_;
212
173
template <class _Ty>
@@ -1179,9 +1140,12 @@ _EXPORT_STD template <class _Ty, class... _Types>
1179
1140
_NODISCARD constexpr bool holds_alternative(const variant<_Types...>& _Var) noexcept {
1180
1141
// true iff _Var holds alternative _Ty
1181
1142
constexpr size_t _Idx = _Meta_find_unique_index<variant<_Types...>, _Ty>::value;
1182
- static_assert(_Idx != _Meta_npos, "holds_alternative<T>(const variant<Types...>&) requires T to occur exactly "
1183
- "once in Types. (N4950 [variant.get]/1)");
1184
- return _Var.index() == _Idx;
1143
+ if constexpr (_Idx != _Meta_npos) {
1144
+ return _Var.index() == _Idx;
1145
+ } else {
1146
+ static_assert(_Always_false<_Ty>, "holds_alternative<T>(const variant<Types...>&) requires T to occur exactly "
1147
+ "once in Types. (N4971 [variant.get]/1)");
1148
+ }
1185
1149
}
1186
1150
1187
1151
_EXPORT_STD template <size_t _Idx, class... _Types>
@@ -1229,33 +1193,45 @@ _EXPORT_STD template <class _Ty, class... _Types>
1229
1193
_NODISCARD constexpr decltype(auto) get(variant<_Types...>& _Var) {
1230
1194
// access the contained value of _Var if its alternative _Ty is active
1231
1195
constexpr size_t _Idx = _Meta_find_unique_index<variant<_Types...>, _Ty>::value;
1232
- static_assert(_Idx < sizeof...(_Types),
1233
- "get<T>(variant<Types...>&) requires T to occur exactly once in Types. (N4950 [variant.get]/5)");
1234
- return _STD get<_Idx>(_Var);
1196
+ if constexpr (_Idx < sizeof...(_Types)) {
1197
+ return _STD get<_Idx>(_Var);
1198
+ } else {
1199
+ static_assert(_Always_false<_Ty>,
1200
+ "get<T>(variant<Types...>&) requires T to occur exactly once in Types. (N4971 [variant.get]/8)");
1201
+ }
1235
1202
}
1236
1203
_EXPORT_STD template <class _Ty, class... _Types>
1237
1204
_NODISCARD constexpr decltype(auto) get(variant<_Types...>&& _Var) {
1238
1205
// access the contained value of _Var if its alternative _Ty is active
1239
1206
constexpr size_t _Idx = _Meta_find_unique_index<variant<_Types...>, _Ty>::value;
1240
- static_assert(_Idx < sizeof...(_Types),
1241
- "get<T>(variant<Types...>&&) requires T to occur exactly once in Types. (N4950 [variant.get]/5)");
1242
- return _STD get<_Idx>(_STD move(_Var));
1207
+ if constexpr (_Idx < sizeof...(_Types)) {
1208
+ return _STD get<_Idx>(_STD move(_Var));
1209
+ } else {
1210
+ static_assert(_Always_false<_Ty>,
1211
+ "get<T>(variant<Types...>&&) requires T to occur exactly once in Types. (N4971 [variant.get]/8)");
1212
+ }
1243
1213
}
1244
1214
_EXPORT_STD template <class _Ty, class... _Types>
1245
1215
_NODISCARD constexpr decltype(auto) get(const variant<_Types...>& _Var) {
1246
1216
// access the contained value of _Var if its alternative _Ty is active
1247
1217
constexpr size_t _Idx = _Meta_find_unique_index<variant<_Types...>, _Ty>::value;
1248
- static_assert(_Idx < sizeof...(_Types),
1249
- "get<T>(const variant<Types...>&) requires T to occur exactly once in Types. (N4950 [variant.get]/5)");
1250
- return _STD get<_Idx>(_Var);
1218
+ if constexpr (_Idx < sizeof...(_Types)) {
1219
+ return _STD get<_Idx>(_Var);
1220
+ } else {
1221
+ static_assert(_Always_false<_Ty>,
1222
+ "get<T>(const variant<Types...>&) requires T to occur exactly once in Types. (N4971 [variant.get]/8)");
1223
+ }
1251
1224
}
1252
1225
_EXPORT_STD template <class _Ty, class... _Types>
1253
1226
_NODISCARD constexpr decltype(auto) get(const variant<_Types...>&& _Var) {
1254
1227
// access the contained value of _Var if its alternative _Ty is active
1255
1228
constexpr size_t _Idx = _Meta_find_unique_index<variant<_Types...>, _Ty>::value;
1256
- static_assert(_Idx < sizeof...(_Types),
1257
- "get<T>(const variant<Types...>&&) requires T to occur exactly once in Types. (N4950 [variant.get]/5)");
1258
- return _STD get<_Idx>(_STD move(_Var));
1229
+ if constexpr (_Idx < sizeof...(_Types)) {
1230
+ return _STD get<_Idx>(_STD move(_Var));
1231
+ } else {
1232
+ static_assert(_Always_false<_Ty>,
1233
+ "get<T>(const variant<Types...>&&) requires T to occur exactly once in Types. (N4971 [variant.get]/8)");
1234
+ }
1259
1235
}
1260
1236
1261
1237
_EXPORT_STD template <size_t _Idx, class... _Types>
@@ -1275,17 +1251,23 @@ _EXPORT_STD template <class _Ty, class... _Types>
1275
1251
_NODISCARD constexpr add_pointer_t<_Ty> get_if(variant<_Types...>* _Ptr) noexcept {
1276
1252
// get the address of *_Ptr's contained value if it holds alternative _Ty
1277
1253
constexpr size_t _Idx = _Meta_find_unique_index<variant<_Types...>, _Ty>::value;
1278
- static_assert(_Idx != _Meta_npos,
1279
- "get_if<T>(variant<Types...> *) requires T to occur exactly once in Types. (N4950 [variant.get]/9)");
1280
- return _STD get_if<_Idx>(_Ptr);
1254
+ if constexpr (_Idx != _Meta_npos) {
1255
+ return _STD get_if<_Idx>(_Ptr);
1256
+ } else {
1257
+ static_assert(_Always_false<_Ty>,
1258
+ "get_if<T>(variant<Types...> *) requires T to occur exactly once in Types. (N4971 [variant.get]/12)");
1259
+ }
1281
1260
}
1282
1261
_EXPORT_STD template <class _Ty, class... _Types>
1283
1262
_NODISCARD constexpr add_pointer_t<const _Ty> get_if(const variant<_Types...>* _Ptr) noexcept {
1284
1263
// get the address of *_Ptr's contained value if it holds alternative _Ty
1285
1264
constexpr size_t _Idx = _Meta_find_unique_index<variant<_Types...>, _Ty>::value;
1286
- static_assert(_Idx != _Meta_npos,
1287
- "get_if<T>(const variant<Types...> *) requires T to occur exactly once in Types. (N4950 [variant.get]/9)");
1288
- return _STD get_if<_Idx>(_Ptr);
1265
+ if constexpr (_Idx != _Meta_npos) {
1266
+ return _STD get_if<_Idx>(_Ptr);
1267
+ } else {
1268
+ static_assert(_Always_false<_Ty>,
1269
+ "get_if<T>(const variant<Types...> *) requires T to occur exactly once in Types. (N4971 [variant.get]/12)");
1270
+ }
1289
1271
}
1290
1272
1291
1273
template <class _Op, class _Result, class... _Types>
0 commit comments