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:
Jonathan Wakely 2019-11-06 17:53:38 +00:00 committed by Jonathan Wakely
parent d37303d15a
commit 0c92c8627c
4 changed files with 41 additions and 11 deletions

View File

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

View File

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

View File

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

View File

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