On Mon, 28 Apr 2025 at 09:19, Tomasz Kaminski <tkami...@redhat.com> wrote:
>
>
>
> On Fri, Apr 25, 2025 at 9:47 PM Jonathan Wakely <jwak...@redhat.com> wrote:
>>
>> This will hardly make a dent in the very slow compile times for <regex>
>> but it seems worth doing anyway.
>>
>> libstdc++-v3/ChangeLog:
>>
>>         * include/bits/regex_compiler.h (_AnyMatcher::operator()):
>>         Replace tag dispatching with 'if constexpr'.
>>         (_AnyMatcher::_M_apply): Remove both overloads.
>>         (_BracketMatcher::operator(), _BracketMatcher::_M_ready):
>>         Replace tag dispatching with 'if constexpr'.
>>         (_BracketMatcher::_M_apply(_CharT, true_type)): Remove.
>>         (_BracketMatcher::_M_apply(_CharT, false_type)): Remove second
>>         parameter.
>>         (_BracketMatcher::_M_make_cache): Remove both overloads.
>>         * include/bits/regex_compiler.tcc (_BracketMatcher::_M_apply):
>>         Remove second parameter.
>> ---
>>
>> Tested x86_64-linux.
>>
>>  libstdc++-v3/include/bits/regex_compiler.h   | 59 +++++++++-----------
>>  libstdc++-v3/include/bits/regex_compiler.tcc |  2 +-
>>  2 files changed, 26 insertions(+), 35 deletions(-)
>>
>> diff --git a/libstdc++-v3/include/bits/regex_compiler.h 
>> b/libstdc++-v3/include/bits/regex_compiler.h
>> index f24c7e3baa6..3931790091a 100644
>> --- a/libstdc++-v3/include/bits/regex_compiler.h
>> +++ b/libstdc++-v3/include/bits/regex_compiler.h
>> @@ -376,26 +376,21 @@ namespace __detail
>>
>>        bool
>>        operator()(_CharT __ch) const
>> -      { return _M_apply(__ch, typename is_same<_CharT, char>::type()); }
>> -
>> -      bool
>> -      _M_apply(_CharT __ch, true_type) const
>>        {
>> +#pragma GCC diagnostic push
>> +#pragma GCC diagnostic ignored "-Wc++17-extensions" // if constexpr
>>         auto __c = _M_translator._M_translate(__ch);
>>         auto __n = _M_translator._M_translate('\n');
>>         auto __r = _M_translator._M_translate('\r');
>> -       return __c != __n && __c != __r;
>> -      }
>> -
>> -      bool
>> -      _M_apply(_CharT __ch, false_type) const
>> -      {
>> -       auto __c = _M_translator._M_translate(__ch);
>> -       auto __n = _M_translator._M_translate('\n');
>> -       auto __r = _M_translator._M_translate('\r');
>> -       auto __u2028 = _M_translator._M_translate(u'\u2028');
>> -       auto __u2029 = _M_translator._M_translate(u'\u2029');
>> -       return __c != __n && __c != __r && __c != __u2028 && __c != __u2029;
>
> Could we implement this as, to avoid calling _M_translate when not necessary?
> ```
> if (__c == __n || __c == __r)
>   return false;
> if constexpr (!is_same<_CharT, char>::value)
>    {
>       auto __ls = _M_translator._M_translate(u'\u2028'); // line sep
>      auto __ps = _M_translator._M_translate(u'\u2029'); // para sep
>      return __c != __ls && __c != __ps;
> }
> return true;
>
> ```


Yes, or even like this:

    const auto __c = _M_translator._M_translate(__ch);
    if (__c == _M_translator._M_translate('\n'))
      return false;
    if (__c == _M_translator._M_translate('\r'))
      return false;
    if constexpr (!is_same<_CharT, char>::value)
      {
        if (__c == _M_translator._M_translate(u'\u2028')) // line sep
          return false
        if (__c == _M_translator._M_translate(u'\u2029')) // para sep
          return false
      }
    return true;


I found some other places in <regex> that should use if-constexpr so
I'll prepare an update patch.

Reply via email to