[PATCH] libstdc++: Call regex_traits::transform_primary() only when necessary
Jonathan Wakely
jwakely@redhat.com
Wed Dec 18 08:28:39 GMT 2024
On Sat, 16 Nov 2024 at 11:20, Luca Bacci <luca.bacci982@gmail.com> wrote:
>
> This is both a performance optimization and a partial fix for
> https://gcc.gnu.org/bugzilla/show_bug.cgi?id=98723.
>
> This commit fixes the issue for bracket expressions that do not
> depend on the locale's collation facet. Examples:
>
> * Character ranges ([a-z]) when std::regex::collate is not set
> * Character classes ([:alnum:])
> * Individual characters ([abc])
I've pushed this to trunk now, thanks for the patch.
>
> Signed-off-by: Luca Bacci <luca.bacci982@gmail.com>
> ---
> libstdc++-v3/include/bits/regex_compiler.tcc | 11 +++++++----
> 1 file changed, 7 insertions(+), 4 deletions(-)
>
> diff --git a/libstdc++-v3/include/bits/regex_compiler.tcc b/libstdc++-v3/include/bits/regex_compiler.tcc
> index 3c6cb6649df..615ada4e377 100644
> --- a/libstdc++-v3/include/bits/regex_compiler.tcc
> +++ b/libstdc++-v3/include/bits/regex_compiler.tcc
> @@ -608,10 +608,13 @@ namespace __detail
> return true;
> if (_M_traits.isctype(__ch, _M_class_set))
> return true;
> - if (std::find(_M_equiv_set.begin(), _M_equiv_set.end(),
> - _M_traits.transform_primary(&__ch, &__ch+1))
> - != _M_equiv_set.end())
> - return true;
> + if (!_M_equiv_set.empty())
> + {
> + auto __x = _M_traits.transform_primary(&__ch, &__ch+1);
> + auto __p = std::find(_M_equiv_set.begin(), _M_equiv_set.end(), __x);
> + if (__p != _M_equiv_set.end())
> + return true;
> + }
> for (auto& __it : _M_neg_class_set)
> if (!_M_traits.isctype(__ch, __it))
> return true;
> --
> 2.47.0
>
More information about the Libstdc++
mailing list