@@ -266,7 +266,7 @@ struct _Cmp_collate { // functor to compare for equality following collating tra
266
266
267
267
template <class _RxTraits>
268
268
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
270
270
using _Elem = typename _RxTraits::char_type;
271
271
272
272
explicit _Cmp_icase_translateleft(const _RxTraits& _Tr) noexcept : _Traits(_Tr) {}
@@ -3675,6 +3675,20 @@ _BidIt1 _Compare_translate_left(_BidIt1 _Begin1, _BidIt1 _End1, _BidIt2 _Begin2,
3675
3675
}
3676
3676
}
3677
3677
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
+
3678
3692
template <class _Elem>
3679
3693
bool _Lookup_range(unsigned int _Ch, const _Buf<_Elem>* _Bufptr) { // check whether _Ch is in _Buf
3680
3694
using _Uelem = make_unsigned_t<_Elem>;
@@ -4165,15 +4179,9 @@ _BidIt _Matcher2<_BidIt, _Elem, _RxTraits, _It, _Alloc>::_Skip(
4165
4179
case _N_str:
4166
4180
{ // check for string match
4167
4181
_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);
4177
4185
}
4178
4186
4179
4187
case _N_class:
0 commit comments