libstdc++: Add compare_three_way and install <compare> header
* include/Makefile.in: Regenerate. * libsupc++/Makefile.in: Regenerate. * libsupc++/compare (__3way_builtin_ptr_cmp): Define helper. (compare_three_way): Add missing implementation. From-SVN: r277889
This commit is contained in:
parent
d37303d15a
commit
0c92c8627c
4 changed files with 41 additions and 11 deletions
|
@ -1,5 +1,10 @@
|
|||
2019-11-06 Jonathan Wakely <jwakely@redhat.com>
|
||||
|
||||
* include/Makefile.in: Regenerate.
|
||||
* libsupc++/Makefile.in: Regenerate.
|
||||
* libsupc++/compare (__3way_builtin_ptr_cmp): Define helper.
|
||||
(compare_three_way): Add missing implementation.
|
||||
|
||||
* include/bits/iterator_concepts.h (unreachable_sentinel_t): Remove
|
||||
redundant equality operators.
|
||||
* testsuite/util/testsuite_iterators.h (test_range::sentinel):
|
||||
|
|
|
@ -1859,8 +1859,9 @@ ${pch3_output}: ${pch3_source} ${pch2_output}
|
|||
# <new>, <typeinfo>, <exception>, <initializer_list>, <cstdalign>, <cstdarg>,
|
||||
# <concepts>, <cstdbool>, <type_traits>, <bit>, <atomic>,
|
||||
# and any files which they include (and which we provide).
|
||||
# <new>, <typeinfo>, <exception>, and <initializer_list> are installed by
|
||||
# libsupc++, so only the others and the sub-includes are copied here.
|
||||
# <new>, <typeinfo>, <exception>, <initializer_list> and <compare>
|
||||
# are installed by libsupc++, so only the others and the sub-includes
|
||||
# are copied here.
|
||||
install-freestanding-headers:
|
||||
$(mkinstalldirs) $(DESTDIR)${gxx_include_dir}/bits
|
||||
for file in c++0x_warning.h atomic_base.h concept_check.h move.h; do \
|
||||
|
|
|
@ -483,7 +483,7 @@ toolexeclib_LTLIBRARIES = libsupc++.la
|
|||
# 2) integrated libsupc++convenience.la that is to be a part of libstdc++.a
|
||||
noinst_LTLIBRARIES = libsupc++convenience.la
|
||||
std_HEADERS = \
|
||||
cxxabi.h exception initializer_list new typeinfo
|
||||
compare cxxabi.h exception initializer_list new typeinfo
|
||||
|
||||
bits_HEADERS = \
|
||||
atomic_lockfree_defines.h cxxabi_forced.h \
|
||||
|
|
|
@ -519,7 +519,8 @@ namespace std
|
|||
|
||||
// [cmp.common], common comparison category type
|
||||
template<typename... _Ts>
|
||||
struct common_comparison_category {
|
||||
struct common_comparison_category
|
||||
{
|
||||
// using type = TODO
|
||||
};
|
||||
|
||||
|
@ -527,7 +528,7 @@ namespace std
|
|||
using common_comparison_category_t
|
||||
= typename common_comparison_category<_Ts...>::type;
|
||||
|
||||
#if __cpp_concepts
|
||||
#if __cpp_lib_concepts
|
||||
namespace __detail
|
||||
{
|
||||
template<typename _Tp, typename _Cat>
|
||||
|
@ -604,20 +605,42 @@ namespace std
|
|||
using compare_three_way_result_t
|
||||
= typename compare_three_way_result<_Tp, _Up>::__type;
|
||||
|
||||
#if __cpp_lib_concepts
|
||||
namespace __detail
|
||||
{
|
||||
// BUILTIN-PTR-THREE-WAY(T, U)
|
||||
template<typename _Tp, typename _Up>
|
||||
concept __3way_builtin_ptr_cmp
|
||||
= convertible_to<_Tp, const volatile void*>
|
||||
&& convertible_to<_Up, const volatile void*>
|
||||
&& ! requires(_Tp&& __t, _Up&& __u)
|
||||
{ operator<=>(static_cast<_Tp&&>(__t), static_cast<_Up&&>(__u)); }
|
||||
&& ! requires(_Tp&& __t, _Up&& __u)
|
||||
{ static_cast<_Tp&&>(__t).operator<=>(static_cast<_Up&&>(__u)); };
|
||||
} // namespace __detail
|
||||
|
||||
// [cmp.object], typename compare_three_way
|
||||
struct compare_three_way
|
||||
{
|
||||
// TODO
|
||||
#if 0
|
||||
template<typename _Tp, typename _Up>
|
||||
requires (three_way_comparable_with<_Tp, _Up>
|
||||
|| BUILTIN-PTR-THREE-WAY(_Tp, _Up))
|
||||
|| __detail::__3way_builtin_ptr_cmp<_Tp, _Up>)
|
||||
constexpr auto
|
||||
operator()(_Tp&& __t, _Up&& __u) const noexcept
|
||||
{
|
||||
// TODO
|
||||
if constexpr (__detail::__3way_builtin_ptr_cmp<_Tp, _Up>)
|
||||
{
|
||||
auto __pt = static_cast<const volatile void*>(__t);
|
||||
auto __pu = static_cast<const volatile void*>(__u);
|
||||
if (__builtin_is_constant_evaluated())
|
||||
return __pt <=> __pu;
|
||||
auto __it = reinterpret_cast<__UINTPTR_TYPE__>(__pt);
|
||||
auto __iu = reinterpret_cast<__UINTPTR_TYPE__>(__pu);
|
||||
return __it <=> __iu;
|
||||
}
|
||||
else
|
||||
return static_cast<_Tp&&>(__t) <=> static_cast<_Up&&>(__u);
|
||||
}
|
||||
#endif
|
||||
|
||||
using is_transparent = void;
|
||||
};
|
||||
|
@ -635,7 +658,8 @@ namespace std
|
|||
inline constexpr unspecified compare_partial_order_fallback = unspecified;
|
||||
#endif
|
||||
}
|
||||
}
|
||||
#endif
|
||||
} // namespace std
|
||||
|
||||
#pragma GCC visibility pop
|
||||
|
||||
|
|
Loading…
Add table
Reference in a new issue