Skip to content

Commit c1ce930

Browse files
authored
<regex>: Use std::search() in skip heuristic (#5586)
1 parent 96f154a commit c1ce930

File tree

1 file changed

+18
-10
lines changed

1 file changed

+18
-10
lines changed

stl/inc/regex

Lines changed: 18 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -266,7 +266,7 @@ struct _Cmp_collate { // functor to compare for equality following collating tra
266266

267267
template <class _RxTraits>
268268
struct _Cmp_icase_translateleft {
269-
// functor to compare for equality following collating translation of the left character
269+
// functor to compare for equality following case-insensitive translation of the left character
270270
using _Elem = typename _RxTraits::char_type;
271271

272272
explicit _Cmp_icase_translateleft(const _RxTraits& _Tr) noexcept : _Traits(_Tr) {}
@@ -3675,6 +3675,20 @@ _BidIt1 _Compare_translate_left(_BidIt1 _Begin1, _BidIt1 _End1, _BidIt2 _Begin2,
36753675
}
36763676
}
36773677

3678+
template <class _BidIt1, class _BidIt2, class _RxTraits>
3679+
_BidIt1 _Search_translate_left(_BidIt1 _Begin1, _BidIt1 _End1, _BidIt2 _Begin2, _BidIt2 _End2, const _RxTraits& _Traits,
3680+
regex_constants::syntax_option_type _Sflags) {
3681+
// searching the right character sequence in the left sequence,
3682+
// after translating characters in the left sequence according to syntax options
3683+
if (_Sflags & regex_constants::icase) {
3684+
return _STD search(_Begin1, _End1, _Begin2, _End2, _Cmp_icase_translateleft<_RxTraits>{_Traits});
3685+
} else if (_Sflags & regex_constants::collate) {
3686+
return _STD search(_Begin1, _End1, _Begin2, _End2, _Cmp_collate_translateleft<_RxTraits>{_Traits});
3687+
} else {
3688+
return _STD search(_Begin1, _End1, _Begin2, _End2, equal_to<typename _RxTraits::char_type>{});
3689+
}
3690+
}
3691+
36783692
template <class _Elem>
36793693
bool _Lookup_range(unsigned int _Ch, const _Buf<_Elem>* _Bufptr) { // check whether _Ch is in _Buf
36803694
using _Uelem = make_unsigned_t<_Elem>;
@@ -4165,15 +4179,9 @@ _BidIt _Matcher2<_BidIt, _Elem, _RxTraits, _It, _Alloc>::_Skip(
41654179
case _N_str:
41664180
{ // check for string match
41674181
_Node_str<_Elem>* _Node = static_cast<_Node_str<_Elem>*>(_Nx);
4168-
for (; _First_arg != _Last; ++_First_arg) { // look for starting match
4169-
_BidIt _Next = _First_arg;
4170-
if (_STD _Compare_translate_left(
4171-
_First_arg, ++_Next, _Node->_Data._Str(), _Node->_Data._Str() + 1, _Traits, _Sflags)
4172-
!= _First_arg) {
4173-
break;
4174-
}
4175-
}
4176-
return _First_arg;
4182+
auto _Str = _Node->_Data._Str();
4183+
return _STD _Search_translate_left(
4184+
_First_arg, _Last, _Str, _Str + _Node->_Data._Size(), _Traits, _Sflags);
41774185
}
41784186

41794187
case _N_class:

0 commit comments

Comments
 (0)