Avoid calling iswalnum for ascii characters

iswalnum can be pretty expensive as its a shared library call.
This commit is contained in:
Maxime Coste 2024-02-06 20:47:59 +11:00
parent c97add7f5a
commit 707904a91b

View File

@ -60,12 +60,23 @@ inline bool is_blank(Codepoint c) noexcept
is_horizontal_blank(c) ; is_horizontal_blank(c) ;
} }
inline bool is_basic_alpha(Codepoint c) noexcept
{
return (c >= 'a' and c <= 'z') or (c >= 'A' and c <= 'Z');
}
inline bool is_basic_digit(Codepoint c) noexcept
{
return c >= '0' and c <= '9';
}
enum WordType { Word, WORD }; enum WordType { Word, WORD };
template<WordType word_type = Word> template<WordType word_type = Word>
inline bool is_word(Codepoint c, ConstArrayView<Codepoint> extra_word_chars = {'_'}) noexcept inline bool is_word(Codepoint c, ConstArrayView<Codepoint> extra_word_chars = {'_'}) noexcept
{ {
return iswalnum((wchar_t)c) or contains(extra_word_chars, c); return (c < 128 ? is_basic_alpha(c) or is_basic_digit(c) : iswalnum((wchar_t)c)) or
contains(extra_word_chars, c);
} }
template<> template<>
@ -79,16 +90,6 @@ inline bool is_punctuation(Codepoint c, ConstArrayView<Codepoint> extra_word_cha
return not (is_word(c, extra_word_chars) or is_blank(c)); return not (is_word(c, extra_word_chars) or is_blank(c));
} }
inline bool is_basic_alpha(Codepoint c) noexcept
{
return (c >= 'a' and c <= 'z') or (c >= 'A' and c <= 'Z');
}
inline bool is_basic_digit(Codepoint c) noexcept
{
return c >= '0' and c <= '9';
}
inline bool is_identifier(Codepoint c) noexcept inline bool is_identifier(Codepoint c) noexcept
{ {
return is_basic_alpha(c) or is_basic_digit(c) or return is_basic_alpha(c) or is_basic_digit(c) or