зеркало из https://github.com/microsoft/STL.git
Casey's accumulated miscellaneous changes (#4900)
This commit is contained in:
Родитель
d5777f4fef
Коммит
7782684576
|
@ -456,6 +456,11 @@ _EXPORT_STD using ranges::get;
|
||||||
template <class _It, class _Se, ranges::subrange_kind _Ki>
|
template <class _It, class _Se, ranges::subrange_kind _Ki>
|
||||||
constexpr bool _Is_subrange_v<ranges::subrange<_It, _Se, _Ki>> = true;
|
constexpr bool _Is_subrange_v<ranges::subrange<_It, _Se, _Ki>> = true;
|
||||||
|
|
||||||
|
#if _HAS_CXX23
|
||||||
|
template <class _It, class _Se, ranges::subrange_kind _Ki>
|
||||||
|
constexpr bool _Tuple_like_impl<ranges::subrange<_It, _Se, _Ki>> = true;
|
||||||
|
#endif // _HAS_CXX23
|
||||||
|
|
||||||
template <class _It, class _Se, ranges::subrange_kind _Ki>
|
template <class _It, class _Se, ranges::subrange_kind _Ki>
|
||||||
struct tuple_size<ranges::subrange<_It, _Se, _Ki>> : integral_constant<size_t, 2> {};
|
struct tuple_size<ranges::subrange<_It, _Se, _Ki>> : integral_constant<size_t, 2> {};
|
||||||
|
|
||||||
|
|
|
@ -1209,7 +1209,7 @@ public:
|
||||||
};
|
};
|
||||||
|
|
||||||
auto remove(const _Ty& _Val) { // erase each element matching _Val
|
auto remove(const _Ty& _Val) { // erase each element matching _Val
|
||||||
return remove_if([&](const _Ty& _Other) { return _Other == _Val; });
|
return remove_if([&](const _Ty& _Other) -> bool { return _Other == _Val; });
|
||||||
}
|
}
|
||||||
|
|
||||||
template <class _Pr1>
|
template <class _Pr1>
|
||||||
|
@ -1614,7 +1614,7 @@ _NODISCARD bool operator>=(const forward_list<_Ty, _Alloc>& _Left, const forward
|
||||||
#if _HAS_CXX20
|
#if _HAS_CXX20
|
||||||
_EXPORT_STD template <class _Ty, class _Alloc, class _Uty>
|
_EXPORT_STD template <class _Ty, class _Alloc, class _Uty>
|
||||||
forward_list<_Ty, _Alloc>::size_type erase(forward_list<_Ty, _Alloc>& _Cont, const _Uty& _Val) {
|
forward_list<_Ty, _Alloc>::size_type erase(forward_list<_Ty, _Alloc>& _Cont, const _Uty& _Val) {
|
||||||
return _Cont.remove_if([&](_Ty& _Elem) { return _Elem == _Val; });
|
return _Cont.remove_if([&](_Ty& _Elem) -> bool { return _Elem == _Val; });
|
||||||
}
|
}
|
||||||
|
|
||||||
_EXPORT_STD template <class _Ty, class _Alloc, class _Pr>
|
_EXPORT_STD template <class _Ty, class _Alloc, class _Pr>
|
||||||
|
|
|
@ -1663,7 +1663,7 @@ public:
|
||||||
};
|
};
|
||||||
|
|
||||||
auto remove(const _Ty& _Val) { // erase each element matching _Val
|
auto remove(const _Ty& _Val) { // erase each element matching _Val
|
||||||
return remove_if([&](const _Ty& _Other) { return _Other == _Val; });
|
return remove_if([&](const _Ty& _Other) -> bool { return _Other == _Val; });
|
||||||
}
|
}
|
||||||
|
|
||||||
template <class _Pr1>
|
template <class _Pr1>
|
||||||
|
@ -1916,7 +1916,7 @@ _NODISCARD bool operator>=(const list<_Ty, _Alloc>& _Left, const list<_Ty, _Allo
|
||||||
#if _HAS_CXX20
|
#if _HAS_CXX20
|
||||||
_EXPORT_STD template <class _Ty, class _Alloc, class _Uty>
|
_EXPORT_STD template <class _Ty, class _Alloc, class _Uty>
|
||||||
list<_Ty, _Alloc>::size_type erase(list<_Ty, _Alloc>& _Cont, const _Uty& _Val) {
|
list<_Ty, _Alloc>::size_type erase(list<_Ty, _Alloc>& _Cont, const _Uty& _Val) {
|
||||||
return _Cont.remove_if([&](_Ty& _Elem) { return _Elem == _Val; });
|
return _Cont.remove_if([&](_Ty& _Elem) -> bool { return _Elem == _Val; });
|
||||||
}
|
}
|
||||||
|
|
||||||
_EXPORT_STD template <class _Ty, class _Alloc, class _Pr>
|
_EXPORT_STD template <class _Ty, class _Alloc, class _Pr>
|
||||||
|
|
|
@ -7134,7 +7134,7 @@ namespace ranges {
|
||||||
const auto _Evaluate_equality_closure =
|
const auto _Evaluate_equality_closure =
|
||||||
[&_Lhs_tuple, &_Rhs_tuple]<size_t... _Indices>(index_sequence<_Indices...>) noexcept(
|
[&_Lhs_tuple, &_Rhs_tuple]<size_t... _Indices>(index_sequence<_Indices...>) noexcept(
|
||||||
(noexcept(_STD declval<const _LHSTupleTypes&>() == _STD declval<const _RHSTupleTypes&>())&&...)) {
|
(noexcept(_STD declval<const _LHSTupleTypes&>() == _STD declval<const _RHSTupleTypes&>())&&...)) {
|
||||||
return ((_STD get<_Indices>(_Lhs_tuple) == _STD get<_Indices>(_Rhs_tuple)) || ...);
|
return ((_STD get<_Indices>(_Lhs_tuple) == _STD get<_Indices>(_Rhs_tuple)) || ... || false);
|
||||||
};
|
};
|
||||||
|
|
||||||
return _Evaluate_equality_closure(index_sequence_for<_LHSTupleTypes...>{});
|
return _Evaluate_equality_closure(index_sequence_for<_LHSTupleTypes...>{});
|
||||||
|
@ -7455,6 +7455,11 @@ namespace ranges {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static constexpr auto _Size_closure = [](auto... _Sizes) _STATIC_CALL_OPERATOR noexcept {
|
||||||
|
using _Common_unsigned_type = _Make_unsigned_like_t<common_type_t<decltype(_Sizes)...>>;
|
||||||
|
return (_RANGES min)({static_cast<_Common_unsigned_type>(_Sizes)...});
|
||||||
|
};
|
||||||
|
|
||||||
public:
|
public:
|
||||||
zip_view() noexcept((is_nothrow_default_constructible_v<_ViewTypes> && ...)) = default;
|
zip_view() noexcept((is_nothrow_default_constructible_v<_ViewTypes> && ...)) = default;
|
||||||
|
|
||||||
|
@ -7501,25 +7506,17 @@ namespace ranges {
|
||||||
}
|
}
|
||||||
|
|
||||||
_NODISCARD constexpr auto size() noexcept(
|
_NODISCARD constexpr auto size() noexcept(
|
||||||
noexcept(_STD apply(_Size_closure(), _Tuple_transform(_RANGES size, _Views)))) // strengthened
|
noexcept(_STD apply(_Size_closure, _Tuple_transform(_RANGES size, _Views)))) // strengthened
|
||||||
requires (sized_range<_ViewTypes> && ...)
|
requires (sized_range<_ViewTypes> && ...)
|
||||||
{
|
{
|
||||||
return _STD apply(_Size_closure(), _Tuple_transform(_RANGES size, _Views));
|
return _STD apply(_Size_closure, _Tuple_transform(_RANGES size, _Views));
|
||||||
}
|
}
|
||||||
|
|
||||||
_NODISCARD constexpr auto size() const
|
_NODISCARD constexpr auto size() const
|
||||||
noexcept(noexcept(_STD apply(_Size_closure(), _Tuple_transform(_RANGES size, _Views)))) // strengthened
|
noexcept(noexcept(_STD apply(_Size_closure, _Tuple_transform(_RANGES size, _Views)))) // strengthened
|
||||||
requires (sized_range<const _ViewTypes> && ...)
|
requires (sized_range<const _ViewTypes> && ...)
|
||||||
{
|
{
|
||||||
return _STD apply(_Size_closure(), _Tuple_transform(_RANGES size, _Views));
|
return _STD apply(_Size_closure, _Tuple_transform(_RANGES size, _Views));
|
||||||
}
|
|
||||||
|
|
||||||
private:
|
|
||||||
_NODISCARD static constexpr auto _Size_closure() noexcept {
|
|
||||||
return [](auto... _Sizes) _STATIC_CALL_OPERATOR noexcept {
|
|
||||||
using _Common_unsigned_type = _Make_unsigned_like_t<common_type_t<decltype(_Sizes)...>>;
|
|
||||||
return (_RANGES min)({static_cast<_Common_unsigned_type>(_Sizes)...});
|
|
||||||
};
|
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -9094,9 +9091,8 @@ namespace ranges {
|
||||||
requires (indirectly_swappable<iterator_t<_Maybe_const<_Const, _First>>> && ...
|
requires (indirectly_swappable<iterator_t<_Maybe_const<_Const, _First>>> && ...
|
||||||
&& indirectly_swappable<iterator_t<_Maybe_const<_Const, _Rest>>>)
|
&& indirectly_swappable<iterator_t<_Maybe_const<_Const, _Rest>>>)
|
||||||
{
|
{
|
||||||
return [&]<size_t... _Indices>(index_sequence<_Indices...>) {
|
[&]<size_t... _Indices>(index_sequence<_Indices...>) {
|
||||||
return (_RANGES iter_swap(_STD get<_Indices>(_Left._Current), _STD get<_Indices>(_Right._Current)),
|
(_RANGES iter_swap(_STD get<_Indices>(_Left._Current), _STD get<_Indices>(_Right._Current)), ...);
|
||||||
...);
|
|
||||||
}(make_index_sequence<1 + sizeof...(_Rest)>{});
|
}(make_index_sequence<1 + sizeof...(_Rest)>{});
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
@ -9144,7 +9140,7 @@ namespace ranges {
|
||||||
requires ((!_Simple_view<_First> || ... || !_Simple_view<_Rest>) && _Cartesian_product_is_common<_First>)
|
requires ((!_Simple_view<_First> || ... || !_Simple_view<_Rest>) && _Cartesian_product_is_common<_First>)
|
||||||
{
|
{
|
||||||
const bool _Is_empty = [&]<size_t... _Indices>(index_sequence<_Indices...>) {
|
const bool _Is_empty = [&]<size_t... _Indices>(index_sequence<_Indices...>) {
|
||||||
return (_RANGES empty(_STD get<_Indices + 1>(_Bases)) || ...);
|
return (_RANGES empty(_STD get<_Indices + 1>(_Bases)) || ... || false);
|
||||||
}(make_index_sequence<sizeof...(_Rest)>{});
|
}(make_index_sequence<sizeof...(_Rest)>{});
|
||||||
|
|
||||||
const auto _Make_iter_tuple = [&]<size_t... _Indices>(index_sequence<_Indices...>) {
|
const auto _Make_iter_tuple = [&]<size_t... _Indices>(index_sequence<_Indices...>) {
|
||||||
|
@ -9157,7 +9153,7 @@ namespace ranges {
|
||||||
requires _Cartesian_product_is_common<const _First>
|
requires _Cartesian_product_is_common<const _First>
|
||||||
{
|
{
|
||||||
const bool _Is_empty = [&]<size_t... _Indices>(index_sequence<_Indices...>) {
|
const bool _Is_empty = [&]<size_t... _Indices>(index_sequence<_Indices...>) {
|
||||||
return (_RANGES empty(_STD get<_Indices + 1>(_Bases)) || ...);
|
return (_RANGES empty(_STD get<_Indices + 1>(_Bases)) || ... || false);
|
||||||
}(make_index_sequence<sizeof...(_Rest)>{});
|
}(make_index_sequence<sizeof...(_Rest)>{});
|
||||||
|
|
||||||
const auto _Make_iter_tuple = [&]<size_t... _Indices>(index_sequence<_Indices...>) {
|
const auto _Make_iter_tuple = [&]<size_t... _Indices>(index_sequence<_Indices...>) {
|
||||||
|
|
|
@ -235,6 +235,12 @@ constexpr bool _Is_span_v = false;
|
||||||
template <class _Ty, size_t _Extent>
|
template <class _Ty, size_t _Extent>
|
||||||
constexpr bool _Is_span_v<span<_Ty, _Extent>> = true;
|
constexpr bool _Is_span_v<span<_Ty, _Extent>> = true;
|
||||||
|
|
||||||
|
template <class>
|
||||||
|
constexpr bool _Is_std_array_v = false;
|
||||||
|
|
||||||
|
template <class _Ty, size_t _Size>
|
||||||
|
constexpr bool _Is_std_array_v<array<_Ty, _Size>> = true;
|
||||||
|
|
||||||
// clang-format off
|
// clang-format off
|
||||||
template <class _It, class _Ty>
|
template <class _It, class _Ty>
|
||||||
concept _Span_compatible_iterator = contiguous_iterator<_It>
|
concept _Span_compatible_iterator = contiguous_iterator<_It>
|
||||||
|
|
|
@ -200,19 +200,21 @@ _NODISCARD constexpr const _Ty&& get(const array<_Ty, _Size>&& _Arr) noexcept;
|
||||||
template <class _Ty1, class _Ty2>
|
template <class _Ty1, class _Ty2>
|
||||||
concept _Different_from = !same_as<remove_cvref_t<_Ty1>, remove_cvref_t<_Ty2>>;
|
concept _Different_from = !same_as<remove_cvref_t<_Ty1>, remove_cvref_t<_Ty2>>;
|
||||||
|
|
||||||
template <class>
|
|
||||||
constexpr bool _Is_std_array_v = false;
|
|
||||||
|
|
||||||
template <class _Ty, size_t _Size>
|
|
||||||
constexpr bool _Is_std_array_v<array<_Ty, _Size>> = true;
|
|
||||||
|
|
||||||
template <class>
|
template <class>
|
||||||
constexpr bool _Is_subrange_v = false;
|
constexpr bool _Is_subrange_v = false;
|
||||||
|
|
||||||
#if _HAS_CXX23
|
#if _HAS_CXX23
|
||||||
template <class _Ty>
|
template <class>
|
||||||
constexpr bool _Tuple_like_impl =
|
constexpr bool _Tuple_like_impl = false;
|
||||||
_Is_specialization_v<_Ty, tuple> || _Is_specialization_v<_Ty, pair> || _Is_std_array_v<_Ty> || _Is_subrange_v<_Ty>;
|
|
||||||
|
template <class... _Types>
|
||||||
|
constexpr bool _Tuple_like_impl<tuple<_Types...>> = true;
|
||||||
|
|
||||||
|
template <class _Ty1, class _Ty2>
|
||||||
|
constexpr bool _Tuple_like_impl<pair<_Ty1, _Ty2>> = true;
|
||||||
|
|
||||||
|
template <class _Ty, size_t _Size>
|
||||||
|
constexpr bool _Tuple_like_impl<array<_Ty, _Size>> = true;
|
||||||
|
|
||||||
template <class _Ty>
|
template <class _Ty>
|
||||||
concept _Tuple_like = _Tuple_like_impl<remove_cvref_t<_Ty>>;
|
concept _Tuple_like = _Tuple_like_impl<remove_cvref_t<_Ty>>;
|
||||||
|
|
|
@ -2232,8 +2232,8 @@ void test_reinit_regression() {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Defend against regression of llvm-project#59854, in which clang is confused
|
// Defend against regression of LLVM-59854, in which clang is confused by the
|
||||||
// by the explicit `noexcept` on `expected`'s destructors.
|
// explicit `noexcept` on `expected`'s destructors.
|
||||||
struct Data {
|
struct Data {
|
||||||
vector<int> vec_;
|
vector<int> vec_;
|
||||||
constexpr Data(initializer_list<int> il) : vec_(il) {}
|
constexpr Data(initializer_list<int> il) : vec_(il) {}
|
||||||
|
|
Загрузка…
Ссылка в новой задаче