Implement P0504R0: Revisiting in-place tag types for any/optional/variant
git-svn-id: https://llvm.org/svn/llvm-project/libcxx/trunk@287250 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
@@ -200,7 +200,7 @@ public:
|
|||||||
, class _Tp = decay_t<_ValueType>
|
, class _Tp = decay_t<_ValueType>
|
||||||
, class = enable_if_t<
|
, class = enable_if_t<
|
||||||
!is_same<_Tp, any>::value &&
|
!is_same<_Tp, any>::value &&
|
||||||
!__is_inplace_type_tag<_ValueType>::value &&
|
!__is_inplace_type<_ValueType>::value &&
|
||||||
is_copy_constructible<_Tp>::value>
|
is_copy_constructible<_Tp>::value>
|
||||||
>
|
>
|
||||||
_LIBCPP_INLINE_VISIBILITY
|
_LIBCPP_INLINE_VISIBILITY
|
||||||
@@ -561,13 +561,13 @@ void swap(any & __lhs, any & __rhs) _NOEXCEPT
|
|||||||
template <class _Tp, class ..._Args>
|
template <class _Tp, class ..._Args>
|
||||||
inline _LIBCPP_INLINE_VISIBILITY
|
inline _LIBCPP_INLINE_VISIBILITY
|
||||||
any make_any(_Args&&... __args) {
|
any make_any(_Args&&... __args) {
|
||||||
return any(in_place<_Tp>, _VSTD::forward<_Args>(__args)...);
|
return any(in_place_type<_Tp>, _VSTD::forward<_Args>(__args)...);
|
||||||
}
|
}
|
||||||
|
|
||||||
template <class _Tp, class _Up, class ..._Args>
|
template <class _Tp, class _Up, class ..._Args>
|
||||||
inline _LIBCPP_INLINE_VISIBILITY
|
inline _LIBCPP_INLINE_VISIBILITY
|
||||||
any make_any(initializer_list<_Up> __il, _Args&&... __args) {
|
any make_any(initializer_list<_Up> __il, _Args&&... __args) {
|
||||||
return any(in_place<_Tp>, __il, _VSTD::forward<_Args>(__args)...);
|
return any(in_place_type<_Tp>, __il, _VSTD::forward<_Args>(__args)...);
|
||||||
}
|
}
|
||||||
|
|
||||||
template <class _ValueType>
|
template <class _ValueType>
|
||||||
|
|||||||
@@ -173,17 +173,22 @@ template<class T, class U=T>
|
|||||||
T exchange(T& obj, U&& new_value);
|
T exchange(T& obj, U&& new_value);
|
||||||
|
|
||||||
// 20.2.7, in-place construction // C++17
|
// 20.2.7, in-place construction // C++17
|
||||||
struct in_place_tag { in_place_tag() = delete; }; // C++17
|
struct in_place_t {
|
||||||
using in_place_t = in_place_tag(&)(unspecified );
|
explicit in_place_t() = default;
|
||||||
|
};
|
||||||
|
inline constexpr in_place_t in_place{};
|
||||||
template <class T>
|
template <class T>
|
||||||
using in_place_type_t = in_place_tag(&)(unspecified <T>);
|
struct in_place_type_t {
|
||||||
template <size_t I>
|
explicit in_place_type_t() = default;
|
||||||
using in_place_index_t = in_place_tag(&)(unspecified <I>);
|
};
|
||||||
in_place_tag in_place(unspecified );
|
|
||||||
template <class T>
|
template <class T>
|
||||||
in_place_tag in_place(unspecified <T>);
|
inline constexpr in_place_type_t<T> in_place_type{};
|
||||||
template <size_t I>
|
template <size_t I>
|
||||||
in_place_tag in_place(unspecified <I>);
|
struct in_place_index_t {
|
||||||
|
explicit in_place_index_t() = default;
|
||||||
|
};
|
||||||
|
template <size_t I>
|
||||||
|
inline constexpr in_place_index_t<I> in_place_index{};
|
||||||
|
|
||||||
} // std
|
} // std
|
||||||
|
|
||||||
@@ -889,59 +894,30 @@ _T1 exchange(_T1& __obj, _T2 && __new_value)
|
|||||||
|
|
||||||
#if _LIBCPP_STD_VER > 14
|
#if _LIBCPP_STD_VER > 14
|
||||||
|
|
||||||
struct _LIBCPP_TYPE_VIS_ONLY __in_place_tag {};
|
struct _LIBCPP_TYPE_VIS in_place_t {
|
||||||
template <class> struct _LIBCPP_TYPE_VIS_ONLY __in_place_type_tag {};
|
explicit in_place_t() = default;
|
||||||
template <size_t> struct _LIBCPP_TYPE_VIS_ONLY __in_place_index_tag {};
|
|
||||||
|
|
||||||
struct _LIBCPP_TYPE_VIS_ONLY in_place_tag;
|
|
||||||
|
|
||||||
using in_place_t = in_place_tag(&)(__in_place_tag);
|
|
||||||
template <class _Tp>
|
|
||||||
using in_place_type_t = in_place_tag(&)(__in_place_type_tag<_Tp>);
|
|
||||||
template <size_t _Nx>
|
|
||||||
using in_place_index_t = in_place_tag(&)(__in_place_index_tag<_Nx>);
|
|
||||||
|
|
||||||
struct in_place_tag {
|
|
||||||
in_place_tag() = delete;
|
|
||||||
private:
|
|
||||||
explicit in_place_tag(__in_place_tag) {}
|
|
||||||
|
|
||||||
friend inline in_place_tag in_place(__in_place_tag __t);
|
|
||||||
template <class _Tp>
|
|
||||||
friend inline in_place_tag in_place(__in_place_type_tag<_Tp>);
|
|
||||||
template <size_t _Nx>
|
|
||||||
friend inline in_place_tag in_place(__in_place_index_tag<_Nx>);
|
|
||||||
};
|
};
|
||||||
|
inline constexpr in_place_t in_place{};
|
||||||
inline in_place_tag in_place(__in_place_tag __t) {
|
|
||||||
_LIBCPP_ASSERT(false, "The in_place function cannot be invoked");
|
|
||||||
return in_place_tag(__t);
|
|
||||||
}
|
|
||||||
template <class _Tp>
|
|
||||||
inline in_place_tag in_place(__in_place_type_tag<_Tp>) {
|
|
||||||
_LIBCPP_ASSERT(false, "The in_place function cannot be invoked");
|
|
||||||
return in_place_tag(__in_place_tag{});
|
|
||||||
}
|
|
||||||
template <size_t _Nx>
|
|
||||||
inline in_place_tag in_place(__in_place_index_tag<_Nx>) {
|
|
||||||
_LIBCPP_ASSERT(false, "The in_place function cannot be invoked");
|
|
||||||
return in_place_tag(__in_place_tag{});
|
|
||||||
}
|
|
||||||
|
|
||||||
template <class _Tp> struct __is_inplace_tag_imp : false_type {};
|
|
||||||
template <> struct __is_inplace_tag_imp<in_place_tag(__in_place_tag)> : true_type {};
|
|
||||||
template <class _Tp> struct __is_inplace_tag_imp<in_place_tag(__in_place_type_tag<_Tp>)> : true_type {};
|
|
||||||
template <size_t _Idx> struct __is_inplace_tag_imp<in_place_tag(__in_place_index_tag<_Idx>)> : true_type {};
|
|
||||||
|
|
||||||
template <class _Tp>
|
template <class _Tp>
|
||||||
using __is_inplace_tag = __is_inplace_tag_imp<remove_pointer_t<decay_t<_Tp>>>;
|
struct _LIBCPP_TYPE_VIS in_place_type_t {
|
||||||
|
explicit in_place_type_t() = default;
|
||||||
|
};
|
||||||
|
template <class _Tp>
|
||||||
|
inline constexpr in_place_type_t<_Tp> in_place_type{};
|
||||||
|
|
||||||
template <class _Tp> struct __is_inplace_type_tag_imp : false_type {};
|
template <size_t _Idx>
|
||||||
template <class _Tp> struct __is_inplace_type_tag_imp<in_place_tag(__in_place_type_tag<_Tp>)> : true_type {};
|
struct _LIBCPP_TYPE_VIS in_place_index_t {
|
||||||
|
explicit in_place_index_t() = default;
|
||||||
|
};
|
||||||
|
template <size_t _Idx>
|
||||||
|
inline constexpr in_place_index_t<_Idx> in_place_index{};
|
||||||
|
|
||||||
|
template <class _Tp> struct __is_inplace_type_imp : false_type {};
|
||||||
|
template <class _Tp> struct __is_inplace_type_imp<in_place_type_t<_Tp>> : true_type {};
|
||||||
|
|
||||||
template <class _Tp>
|
template <class _Tp>
|
||||||
using __is_inplace_type_tag = __is_inplace_type_tag_imp<remove_pointer_t<decay_t<_Tp>>>;
|
using __is_inplace_type = __is_inplace_type_imp<__uncvref_t<_Tp>>;
|
||||||
|
|
||||||
|
|
||||||
#endif // _LIBCPP_STD_VER > 14
|
#endif // _LIBCPP_STD_VER > 14
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user