Changeset View
Changeset View
Standalone View
Standalone View
libcxx/include/variant
Show First 20 Lines • Show All 312 Lines • ▼ Show 20 Lines | std::tuple_element_t< | ||||
__choose_index_type(_NumAlts), | __choose_index_type(_NumAlts), | ||||
std::tuple<unsigned char, unsigned short, unsigned int> | std::tuple<unsigned char, unsigned short, unsigned int> | ||||
>; | >; | ||||
#endif | #endif | ||||
template <class _IndexType> | template <class _IndexType> | ||||
constexpr _IndexType __variant_npos = static_cast<_IndexType>(-1); | constexpr _IndexType __variant_npos = static_cast<_IndexType>(-1); | ||||
template <class... _Types> | |||||
class _LIBCPP_TEMPLATE_VIS variant; | |||||
template <class... _Types> | |||||
_LIBCPP_INLINE_VISIBILITY constexpr variant<_Types...>& | |||||
__as_variant(variant<_Types...>& __vs) noexcept { | |||||
return __vs; | |||||
} | |||||
template <class... _Types> | |||||
_LIBCPP_INLINE_VISIBILITY constexpr const variant<_Types...>& | |||||
ldionne: No need for `inline` on these, they are already `inline` by way of being templates. | |||||
__as_variant(const variant<_Types...>& __vs) noexcept { | |||||
return __vs; | |||||
} | |||||
template <class... _Types> | |||||
_LIBCPP_INLINE_VISIBILITY constexpr const variant<_Types...>&& | |||||
__as_variant(const variant<_Types...>&& __vs) noexcept { | |||||
return _VSTD::move(__vs); | |||||
} | |||||
QuuxplusoneUnsubmitted Minor bikeshed: & const& const&& && is a weird order to put these four overloads in :) Quuxplusone: Minor bikeshed: `&` `const&` `const&&` `&&` is a weird order to put these four overloads in :) | |||||
curdeiusAuthorUnsubmitted I changed to paper's order (&, const &, &&, const &&). curdeius: I changed to paper's order (`&`, `const &`, `&&`, `const &&`). | |||||
template <class... _Types> | |||||
_LIBCPP_INLINE_VISIBILITY constexpr variant<_Types...>&& | |||||
__as_variant(variant<_Types...>&& __vs) noexcept { | |||||
return _VSTD::move(__vs); | |||||
} | |||||
namespace __find_detail { | namespace __find_detail { | ||||
template <class _Tp, class... _Types> | template <class _Tp, class... _Types> | ||||
inline _LIBCPP_INLINE_VISIBILITY | inline _LIBCPP_INLINE_VISIBILITY | ||||
constexpr size_t __find_index() { | constexpr size_t __find_index() { | ||||
constexpr bool __matches[] = {is_same_v<_Tp, _Types>...}; | constexpr bool __matches[] = {is_same_v<_Tp, _Types>...}; | ||||
size_t __result = __not_found; | size_t __result = __not_found; | ||||
for (size_t __i = 0; __i < sizeof...(_Types); ++__i) { | for (size_t __i = 0; __i < sizeof...(_Types); ++__i) { | ||||
▲ Show 20 Lines • Show All 230 Lines • ▼ Show 20 Lines | return __base::__visit_alt_at(__index, | ||||
_VSTD::forward<_Visitor>(__visitor), | _VSTD::forward<_Visitor>(__visitor), | ||||
_VSTD::forward<_Vs>(__vs).__impl...); | _VSTD::forward<_Vs>(__vs).__impl...); | ||||
} | } | ||||
template <class _Visitor, class... _Vs> | template <class _Visitor, class... _Vs> | ||||
inline _LIBCPP_INLINE_VISIBILITY | inline _LIBCPP_INLINE_VISIBILITY | ||||
static constexpr decltype(auto) __visit_alt(_Visitor&& __visitor, | static constexpr decltype(auto) __visit_alt(_Visitor&& __visitor, | ||||
_Vs&&... __vs) { | _Vs&&... __vs) { | ||||
return __base::__visit_alt(_VSTD::forward<_Visitor>(__visitor), | return __base::__visit_alt( | ||||
_VSTD::forward<_Vs>(__vs).__impl...); | _VSTD::forward<_Visitor>(__visitor), | ||||
_VSTD::__as_variant(_VSTD::forward<_Vs>(__vs)).__impl...); | |||||
} | } | ||||
template <class _Visitor, class... _Vs> | template <class _Visitor, class... _Vs> | ||||
inline _LIBCPP_INLINE_VISIBILITY | inline _LIBCPP_INLINE_VISIBILITY | ||||
static constexpr decltype(auto) | static constexpr decltype(auto) | ||||
__visit_value_at(size_t __index, _Visitor&& __visitor, _Vs&&... __vs) { | __visit_value_at(size_t __index, _Visitor&& __visitor, _Vs&&... __vs) { | ||||
return __visit_alt_at( | return __visit_alt_at( | ||||
__index, | __index, | ||||
__make_value_visitor(_VSTD::forward<_Visitor>(__visitor)), | __make_value_visitor(_VSTD::forward<_Visitor>(__visitor)), | ||||
_VSTD::forward<_Vs>(__vs)...); | _VSTD::forward<_Vs>(__vs)...); | ||||
} | } | ||||
template <class _Visitor, class... _Vs> | template <class _Visitor, class... _Vs> | ||||
inline _LIBCPP_INLINE_VISIBILITY | inline _LIBCPP_INLINE_VISIBILITY | ||||
static constexpr decltype(auto) __visit_value(_Visitor&& __visitor, | static constexpr decltype(auto) __visit_value(_Visitor&& __visitor, | ||||
_Vs&&... __vs) { | _Vs&&... __vs) { | ||||
return __visit_alt( | return __visit_alt( | ||||
__make_value_visitor(_VSTD::forward<_Visitor>(__visitor)), | __make_value_visitor(_VSTD::forward<_Visitor>(__visitor)), | ||||
_VSTD::forward<_Vs>(__vs)...); | _VSTD::forward<_Vs>(__vs)...); | ||||
} | } | ||||
#if _LIBCPP_STD_VER > 17 | #if _LIBCPP_STD_VER > 17 | ||||
template <class _Rp, class _Visitor, class... _Vs> | template <class _Rp, class _Visitor, class... _Vs> | ||||
inline _LIBCPP_INLINE_VISIBILITY | inline _LIBCPP_INLINE_VISIBILITY | ||||
static constexpr _Rp __visit_value(_Visitor&& __visitor, | static constexpr _Rp __visit_value(_Visitor&& __visitor, | ||||
_Vs&&... __vs) { | _Vs&&... __vs) { | ||||
return __visit_alt( | return __visit_alt( | ||||
__make_value_visitor<_Rp>(_VSTD::forward<_Visitor>(__visitor)), | __make_value_visitor<_Rp>(_VSTD::forward<_Visitor>(__visitor)), | ||||
_VSTD::forward<_Vs>(__vs)...); | _VSTD::forward<_Vs>(__vs)...); | ||||
▲ Show 20 Lines • Show All 1,035 Lines • ▼ Show 20 Lines | constexpr bool operator>=(const variant<_Types...>& __lhs, | ||||
if (__lhs.index() > __rhs.index()) return true; | if (__lhs.index() > __rhs.index()) return true; | ||||
if (__lhs.index() < __rhs.index()) return false; | if (__lhs.index() < __rhs.index()) return false; | ||||
return __variant::__visit_value_at( | return __variant::__visit_value_at( | ||||
__lhs.index(), __convert_to_bool<greater_equal<>>{}, __lhs, __rhs); | __lhs.index(), __convert_to_bool<greater_equal<>>{}, __lhs, __rhs); | ||||
} | } | ||||
template <class... _Vs> | template <class... _Vs> | ||||
inline _LIBCPP_INLINE_VISIBILITY | inline _LIBCPP_INLINE_VISIBILITY | ||||
_LIBCPP_AVAILABILITY_THROW_BAD_VARIANT_ACCESS | _LIBCPP_AVAILABILITY_THROW_BAD_VARIANT_ACCESS constexpr void | ||||
constexpr void __throw_if_valueless(_Vs&&... __vs) { | __throw_if_valueless(_Vs&&... __vs) { | ||||
const bool __valueless = (... || __vs.valueless_by_exception()); | const bool __valueless = | ||||
(... || _VSTD::__as_variant(__vs).valueless_by_exception()); | |||||
Calling __as_variant(__vs).valueless_by_exception() here instead would be closer to the Standard and would allow getting rid of __valueless_by_exception -- WDYT? ldionne: Calling `__as_variant(__vs).valueless_by_exception()` here instead would be closer to the… | |||||
Yes, I agree. That's actually because I started by this part and only later added __as_variant. I'll use __as_variant and remove __valueless_by_exception. curdeius: Yes, I agree. That's actually because I started by this part and only later added… | |||||
if (__valueless) { | if (__valueless) { | ||||
__throw_bad_variant_access(); | __throw_bad_variant_access(); | ||||
} | } | ||||
} | } | ||||
template <class _Visitor, class... _Vs> | template < | ||||
class _Visitor, class... _Vs, | |||||
typename = void_t<decltype(_VSTD::__as_variant(_VSTD::declval<_Vs>()))...> > | |||||
Not Done ReplyInline Actionsvoid_t here is not necessary. Just typename = decltype(...) should be sufficient for SFINAE. Same below. ldionne: `void_t` here is not necessary. Just `typename = decltype(...)` should be sufficient for SFINAE. | |||||
@ldionne, but... _Vs is a parameter pack. How can that be done without void_t? curdeius: @ldionne, but... `_Vs` is a parameter pack. How can that be done without `void_t`? | |||||
Not Done ReplyInline ActionsMy bad, I looked too quickly. ldionne: My bad, I looked too quickly. | |||||
inline _LIBCPP_INLINE_VISIBILITY | inline _LIBCPP_INLINE_VISIBILITY | ||||
_LIBCPP_AVAILABILITY_THROW_BAD_VARIANT_ACCESS | _LIBCPP_AVAILABILITY_THROW_BAD_VARIANT_ACCESS constexpr | ||||
constexpr decltype(auto) visit(_Visitor&& __visitor, _Vs&&... __vs) { | decltype(auto) visit(_Visitor&& __visitor, _Vs&&... __vs) { | ||||
using __variant_detail::__visitation::__variant; | using __variant_detail::__visitation::__variant; | ||||
_VSTD::__throw_if_valueless(_VSTD::forward<_Vs>(__vs)...); | _VSTD::__throw_if_valueless(_VSTD::forward<_Vs>(__vs)...); | ||||
return __variant::__visit_value(_VSTD::forward<_Visitor>(__visitor), | return __variant::__visit_value(_VSTD::forward<_Visitor>(__visitor), | ||||
_VSTD::forward<_Vs>(__vs)...); | _VSTD::forward<_Vs>(__vs)...); | ||||
} | } | ||||
#if _LIBCPP_STD_VER > 17 | #if _LIBCPP_STD_VER > 17 | ||||
template <class _Rp, class _Visitor, class... _Vs> | template < | ||||
class _Rp, class _Visitor, class... _Vs, | |||||
typename = void_t<decltype(_VSTD::__as_variant(_VSTD::declval<_Vs>()))...> > | |||||
inline _LIBCPP_INLINE_VISIBILITY | inline _LIBCPP_INLINE_VISIBILITY | ||||
_LIBCPP_AVAILABILITY_THROW_BAD_VARIANT_ACCESS | _LIBCPP_AVAILABILITY_THROW_BAD_VARIANT_ACCESS constexpr _Rp | ||||
constexpr _Rp visit(_Visitor&& __visitor, _Vs&&... __vs) { | visit(_Visitor&& __visitor, _Vs&&... __vs) { | ||||
using __variant_detail::__visitation::__variant; | using __variant_detail::__visitation::__variant; | ||||
_VSTD::__throw_if_valueless(_VSTD::forward<_Vs>(__vs)...); | _VSTD::__throw_if_valueless(_VSTD::forward<_Vs>(__vs)...); | ||||
return __variant::__visit_value<_Rp>(_VSTD::forward<_Visitor>(__visitor), | return __variant::__visit_value<_Rp>(_VSTD::forward<_Visitor>(__visitor), | ||||
_VSTD::forward<_Vs>(__vs)...); | _VSTD::forward<_Vs>(__vs)...); | ||||
} | } | ||||
#endif | #endif | ||||
struct _LIBCPP_TEMPLATE_VIS monostate {}; | struct _LIBCPP_TEMPLATE_VIS monostate {}; | ||||
▲ Show 20 Lines • Show All 69 Lines • Show Last 20 Lines |
No need for inline on these, they are already inline by way of being templates.