Skip to content

Commit 225c876

Browse files
requires for chrono::parse and comparison category detection
Drive-by: Simply `sub_match` by reusing `_Get_comparison_category_t`.
1 parent ca1553d commit 225c876

File tree

3 files changed

+30
-42
lines changed

3 files changed

+30
-42
lines changed

stl/inc/__msvc_string_view.hpp

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1756,13 +1756,14 @@ _NODISCARD constexpr bool operator==(const basic_string_view<_Elem, _Traits> _Lh
17561756
return _Lhs._Equal(_Rhs);
17571757
}
17581758

1759-
template <class _Traits, class = void>
1759+
template <class _Traits>
17601760
struct _Get_comparison_category {
17611761
using type = weak_ordering;
17621762
};
17631763

17641764
template <class _Traits>
1765-
struct _Get_comparison_category<_Traits, void_t<typename _Traits::comparison_category>> {
1765+
requires requires { typename _Traits::comparison_category; }
1766+
struct _Get_comparison_category<_Traits> {
17661767
using type = _Traits::comparison_category;
17671768

17681769
static_assert(_Is_any_of_v<type, partial_ordering, weak_ordering, strong_ordering>,

stl/inc/chrono

Lines changed: 19 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -4612,57 +4612,56 @@ namespace chrono {
46124612
minutes* _Offset;
46134613
};
46144614

4615-
template <class _CharT, class _Traits, class _Parsable, class... _Rest>
4616-
using _Has_from_stream =
4617-
decltype(static_cast<void>(from_stream(_STD declval<basic_istream<_CharT, _Traits>&>(),
4618-
_STD declval<const _CharT*>(), _STD declval<_Parsable&>(), _STD declval<_Rest>()...)),
4619-
0); // intentional ADL
4615+
template <class _Parsable, class _CharT, class _Traits, class... _Rest>
4616+
concept _Can_from_stream = requires(
4617+
basic_istream<_CharT, _Traits>& __istr, const _CharT* __s, _Parsable& __parsed, _Rest&&... __rest_args) {
4618+
from_stream(__istr, +__s, __parsed, _STD forward<_Rest>(__rest_args)...); // intentional ADL
4619+
};
46204620

4621-
_EXPORT_STD template <class _CharT, class _Parsable, _Has_from_stream<_CharT, char_traits<_CharT>, _Parsable> = 0>
4621+
_EXPORT_STD template <class _CharT, _Can_from_stream<_CharT, char_traits<_CharT>> _Parsable>
46224622
_NODISCARD auto parse(const _CharT* _Fmt, _Parsable& _Tp) {
46234623
return _Time_parse_iomanip_c_str<_CharT, char_traits<_CharT>, allocator<_CharT>, _Parsable>{_Fmt, _Tp};
46244624
}
46254625

4626-
_EXPORT_STD template <class _CharT, class _Traits, class _Alloc, class _Parsable,
4627-
_Has_from_stream<_CharT, _Traits, _Parsable> = 0>
4626+
_EXPORT_STD template <class _CharT, class _Traits, class _Alloc, _Can_from_stream<_CharT, _Traits> _Parsable>
46284627
_NODISCARD auto parse(const basic_string<_CharT, _Traits, _Alloc>& _Fmt, _Parsable& _Tp) {
46294628
return _Time_parse_iomanip{_Fmt, _Tp};
46304629
}
46314630

4632-
_EXPORT_STD template <class _CharT, class _Traits, class _Alloc, class _Parsable,
4633-
_Has_from_stream<_CharT, _Traits, _Parsable, basic_string<_CharT, _Traits, _Alloc>*> = 0>
4631+
_EXPORT_STD template <class _CharT, class _Traits, class _Alloc,
4632+
_Can_from_stream<_CharT, _Traits, basic_string<_CharT, _Traits, _Alloc>*> _Parsable>
46344633
_NODISCARD auto parse(const _CharT* _Fmt, _Parsable& _Tp, basic_string<_CharT, _Traits, _Alloc>& _Abbrev) {
46354634
return _Time_parse_iomanip_c_str{_Fmt, _Tp, _STD addressof(_Abbrev)};
46364635
}
46374636

4638-
_EXPORT_STD template <class _CharT, class _Traits, class _Alloc, class _Parsable,
4639-
_Has_from_stream<_CharT, _Traits, _Parsable, basic_string<_CharT, _Traits, _Alloc>*> = 0>
4637+
_EXPORT_STD template <class _CharT, class _Traits, class _Alloc,
4638+
_Can_from_stream<_CharT, _Traits, basic_string<_CharT, _Traits, _Alloc>> _Parsable>
46404639
_NODISCARD auto parse(const basic_string<_CharT, _Traits, _Alloc>& _Fmt, _Parsable& _Tp,
46414640
basic_string<_CharT, _Traits, _Alloc>& _Abbrev) {
46424641
return _Time_parse_iomanip{_Fmt, _Tp, _STD addressof(_Abbrev)};
46434642
}
46444643

4645-
_EXPORT_STD template <class _CharT, class _Parsable,
4646-
_Has_from_stream<_CharT, char_traits<_CharT>, _Parsable, basic_string<_CharT>*, minutes*> = 0>
4644+
_EXPORT_STD template <class _CharT,
4645+
_Can_from_stream<_CharT, char_traits<_CharT>, basic_string<_CharT>*, minutes*> _Parsable>
46474646
_NODISCARD auto parse(const _CharT* _Fmt, _Parsable& _Tp, minutes& _Offset) {
46484647
return _Time_parse_iomanip_c_str{_Fmt, _Tp, static_cast<basic_string<_CharT>*>(nullptr), &_Offset};
46494648
}
46504649

4651-
_EXPORT_STD template <class _CharT, class _Traits, class _Alloc, class _Parsable,
4652-
_Has_from_stream<_CharT, _Traits, _Parsable, basic_string<_CharT, _Traits, _Alloc>*, minutes*> = 0>
4650+
_EXPORT_STD template <class _CharT, class _Traits, class _Alloc,
4651+
_Can_from_stream<_CharT, _Traits, basic_string<_CharT, _Traits, _Alloc>*, minutes*> _Parsable>
46534652
_NODISCARD auto parse(const basic_string<_CharT, _Traits, _Alloc>& _Fmt, _Parsable& _Tp, minutes& _Offset) {
46544653
return _Time_parse_iomanip{_Fmt, _Tp, static_cast<basic_string<_CharT, _Traits, _Alloc>*>(nullptr), &_Offset};
46554654
}
46564655

4657-
_EXPORT_STD template <class _CharT, class _Traits, class _Alloc, class _Parsable,
4658-
_Has_from_stream<_CharT, _Traits, _Parsable, basic_string<_CharT, _Traits, _Alloc>*, minutes*> = 0>
4656+
_EXPORT_STD template <class _CharT, class _Traits, class _Alloc,
4657+
_Can_from_stream<_CharT, _Traits, basic_string<_CharT, _Traits, _Alloc>*, minutes*> _Parsable>
46594658
_NODISCARD auto parse(
46604659
const _CharT* _Fmt, _Parsable& _Tp, basic_string<_CharT, _Traits, _Alloc>& _Abbrev, minutes& _Offset) {
46614660
return _Time_parse_iomanip_c_str{_Fmt, _Tp, _STD addressof(_Abbrev), &_Offset};
46624661
}
46634662

4664-
_EXPORT_STD template <class _CharT, class _Traits, class _Alloc, class _Parsable,
4665-
_Has_from_stream<_CharT, _Traits, _Parsable, basic_string<_CharT, _Traits, _Alloc>*, minutes*> = 0>
4663+
_EXPORT_STD template <class _CharT, class _Traits, class _Alloc,
4664+
_Can_from_stream<_CharT, _Traits, basic_string<_CharT, _Traits, _Alloc>*, minutes*> _Parsable>
46664665
_NODISCARD auto parse(const basic_string<_CharT, _Traits, _Alloc>& _Fmt, _Parsable& _Tp,
46674666
basic_string<_CharT, _Traits, _Alloc>& _Abbrev, minutes& _Offset) {
46684667
return _Time_parse_iomanip{_Fmt, _Tp, _STD addressof(_Abbrev), &_Offset};

stl/inc/regex

Lines changed: 8 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -605,18 +605,6 @@ bool _Is_word(_Elem _Ch) {
605605
return _UCh <= static_cast<_UElem>('z') && _Is_word(static_cast<unsigned char>(_UCh));
606606
}
607607

608-
#if _HAS_CXX20
609-
template <class _Ty, class = void>
610-
struct _Get_member_comparison_category {
611-
using type = weak_ordering;
612-
};
613-
614-
template <class _Ty>
615-
struct _Get_member_comparison_category<_Ty, void_t<typename _Ty::comparison_category>> {
616-
using type = _Ty::comparison_category;
617-
};
618-
#endif // _HAS_CXX20
619-
620608
_EXPORT_STD template <class _BidIt>
621609
class sub_match : public pair<_BidIt, _BidIt> { // class to hold contents of a capture group
622610
public:
@@ -630,10 +618,6 @@ public:
630618
// Note that _Size_type should always be std::size_t
631619
using _Size_type = typename string_type::size_type;
632620

633-
#if _HAS_CXX20
634-
using _Comparison_category = _Get_member_comparison_category<_Traits>::type;
635-
#endif // _HAS_CXX20
636-
637621
constexpr sub_match() : _Mybase(), matched(false) {}
638622

639623
bool matched;
@@ -744,7 +728,8 @@ _NODISCARD bool operator==(const sub_match<_BidIt>& _Left, const sub_match<_BidI
744728
#if _HAS_CXX20
745729
_EXPORT_STD template <class _BidIt>
746730
_NODISCARD auto operator<=>(const sub_match<_BidIt>& _Left, const sub_match<_BidIt>& _Right) {
747-
return static_cast<sub_match<_BidIt>::_Comparison_category>(_Left.compare(_Right) <=> 0);
731+
using _Comparison_category = _Get_comparison_category_t<char_traits<_Iter_value_t<_BidIt>>>;
732+
return static_cast<_Comparison_category>(_Left.compare(_Right) <=> 0);
748733
}
749734
#else // ^^^ _HAS_CXX20 / !_HAS_CXX20 vvv
750735
template <class _BidIt>
@@ -781,7 +766,8 @@ _NODISCARD bool operator==(const sub_match<_BidIt>& _Left, const _Iter_value_t<_
781766
#if _HAS_CXX20
782767
_EXPORT_STD template <class _BidIt>
783768
_NODISCARD auto operator<=>(const sub_match<_BidIt>& _Left, const _Iter_value_t<_BidIt>* _Right) {
784-
return static_cast<sub_match<_BidIt>::_Comparison_category>(_Left.compare(_Right) <=> 0);
769+
using _Comparison_category = _Get_comparison_category_t<char_traits<_Iter_value_t<_BidIt>>>;
770+
return static_cast<_Comparison_category>(_Left.compare(_Right) <=> 0);
785771
}
786772
#else // ^^^ _HAS_CXX20 / !_HAS_CXX20 vvv
787773
template <class _BidIt>
@@ -848,7 +834,8 @@ _NODISCARD bool operator==(const sub_match<_BidIt>& _Left, const _Iter_value_t<_
848834
#if _HAS_CXX20
849835
_EXPORT_STD template <class _BidIt>
850836
_NODISCARD auto operator<=>(const sub_match<_BidIt>& _Left, const _Iter_value_t<_BidIt>& _Right) {
851-
return static_cast<sub_match<_BidIt>::_Comparison_category>(_Left._Compare(_STD addressof(_Right), 1) <=> 0);
837+
using _Comparison_category = _Get_comparison_category_t<char_traits<_Iter_value_t<_BidIt>>>;
838+
return static_cast<_Comparison_category>(_Left._Compare(_STD addressof(_Right), 1) <=> 0);
852839
}
853840
#else // ^^^ _HAS_CXX20 / !_HAS_CXX20 vvv
854841
template <class _BidIt>
@@ -917,7 +904,8 @@ _NODISCARD bool operator==(
917904
_EXPORT_STD template <class _BidIt, class _Traits, class _Alloc>
918905
_NODISCARD auto operator<=>(
919906
const sub_match<_BidIt>& _Left, const basic_string<_Iter_value_t<_BidIt>, _Traits, _Alloc>& _Right) {
920-
return static_cast<sub_match<_BidIt>::_Comparison_category>(_Left._Compare(_Right.data(), _Right.size()) <=> 0);
907+
using _Comparison_category = _Get_comparison_category_t<char_traits<_Iter_value_t<_BidIt>>>;
908+
return static_cast<_Comparison_category>(_Left._Compare(_Right.data(), _Right.size()) <=> 0);
921909
}
922910
#else // ^^^ _HAS_CXX20 / !_HAS_CXX20 vvv
923911
template <class _BidIt, class _Traits, class _Alloc>

0 commit comments

Comments
 (0)