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:
Eric Fiselier
2016-11-17 19:24:04 +00:00
parent 77dabb302b
commit 8d33526db2
2 changed files with 34 additions and 58 deletions

View File

@@ -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>

View File

@@ -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