#pragma once
#include <wtf/Assertions.h>
#include <wtf/text/LChar.h>
namespace WTF {
template<typename CharacterType> constexpr bool isASCII(CharacterType);
template<typename CharacterType> bool isASCIIAlpha(CharacterType);
template<typename CharacterType> bool isASCIIAlphanumeric(CharacterType);
template<typename CharacterType> bool isASCIIBinaryDigit(CharacterType);
template<typename CharacterType> bool isASCIIDigit(CharacterType);
template<typename CharacterType> bool isASCIIHexDigit(CharacterType);
template<typename CharacterType> bool isASCIILower(CharacterType);
template<typename CharacterType> bool isASCIIOctalDigit(CharacterType);
template<typename CharacterType> bool isASCIIPrintable(CharacterType);
template<typename CharacterType> bool isASCIISpace(CharacterType);
template<typename CharacterType> bool isASCIIUpper(CharacterType);
template<typename CharacterType> CharacterType toASCIILower(CharacterType);
template<typename CharacterType> CharacterType toASCIIUpper(CharacterType);
template<typename CharacterType> uint8_t toASCIIHexValue(CharacterType);
template<typename CharacterType> uint8_t toASCIIHexValue(CharacterType firstCharacter, CharacterType secondCharacter);
char lowerNibbleToASCIIHexDigit(uint8_t);
char upperNibbleToASCIIHexDigit(uint8_t);
char lowerNibbleToLowercaseASCIIHexDigit(uint8_t);
char upperNibbleToLowercaseASCIIHexDigit(uint8_t);
template<typename CharacterType> bool isASCIIAlphaCaselessEqual(CharacterType, char expectedASCIILowercaseLetter);
template<typename CharacterType> CharacterType toASCIILowerUnchecked(CharacterType);
extern WTF_EXPORT_PRIVATE const unsigned char asciiCaseFoldTable[256];
template<typename CharacterType> constexpr bool isASCII(CharacterType character)
{
return !(character & ~0x7F);
}
template<typename CharacterType> inline bool isASCIILower(CharacterType character)
{
return character >= 'a' && character <= 'z';
}
template<typename CharacterType> inline CharacterType toASCIILowerUnchecked(CharacterType character)
{
return character | 0x20;
}
template<typename CharacterType> inline bool isASCIIAlpha(CharacterType character)
{
return isASCIILower(toASCIILowerUnchecked(character));
}
template<typename CharacterType> inline bool isASCIIDigit(CharacterType character)
{
return character >= '0' && character <= '9';
}
template<typename CharacterType> inline bool isASCIIAlphanumeric(CharacterType character)
{
return isASCIIDigit(character) || isASCIIAlpha(character);
}
template<typename CharacterType> inline bool isASCIIHexDigit(CharacterType character)
{
return isASCIIDigit(character) || (toASCIILowerUnchecked(character) >= 'a' && toASCIILowerUnchecked(character) <= 'f');
}
template<typename CharacterType> inline bool isASCIIBinaryDigit(CharacterType character)
{
return character == '0' || character == '1';
}
template<typename CharacterType> inline bool isASCIIOctalDigit(CharacterType character)
{
return character >= '0' && character <= '7';
}
template<typename CharacterType> inline bool isASCIIPrintable(CharacterType character)
{
return character >= ' ' && character <= '~';
}
template<typename CharacterType> inline bool isASCIISpace(CharacterType character)
{
return character <= ' ' && (character == ' ' || (character <= 0xD && character >= 0x9));
}
template<typename CharacterType> inline bool isASCIIUpper(CharacterType character)
{
return character >= 'A' && character <= 'Z';
}
template<typename CharacterType> inline CharacterType toASCIILower(CharacterType character)
{
return character | (isASCIIUpper(character) << 5);
}
template<> inline char toASCIILower(char character)
{
return static_cast<char>(asciiCaseFoldTable[static_cast<uint8_t>(character)]);
}
template<> inline LChar toASCIILower(LChar character)
{
return asciiCaseFoldTable[character];
}
template<typename CharacterType> inline CharacterType toASCIIUpper(CharacterType character)
{
return character & ~(isASCIILower(character) << 5);
}
template<typename CharacterType> inline uint8_t toASCIIHexValue(CharacterType character)
{
ASSERT(isASCIIHexDigit(character));
return character < 'A' ? character - '0' : (character - 'A' + 10) & 0xF;
}
template<typename CharacterType> inline uint8_t toASCIIHexValue(CharacterType firstCharacter, CharacterType secondCharacter)
{
return toASCIIHexValue(firstCharacter) << 4 | toASCIIHexValue(secondCharacter);
}
inline char lowerNibbleToASCIIHexDigit(uint8_t value)
{
uint8_t nibble = value & 0xF;
return nibble + (nibble < 10 ? '0' : 'A' - 10);
}
inline char upperNibbleToASCIIHexDigit(uint8_t value)
{
uint8_t nibble = value >> 4;
return nibble + (nibble < 10 ? '0' : 'A' - 10);
}
inline char lowerNibbleToLowercaseASCIIHexDigit(uint8_t value)
{
uint8_t nibble = value & 0xF;
return nibble + (nibble < 10 ? '0' : 'a' - 10);
}
inline char upperNibbleToLowercaseASCIIHexDigit(uint8_t value)
{
uint8_t nibble = value >> 4;
return nibble + (nibble < 10 ? '0' : 'a' - 10);
}
template<typename CharacterType> inline bool isASCIIAlphaCaselessEqual(CharacterType inputCharacter, char expectedASCIILowercaseLetter)
{
ASSERT(toASCIILowerUnchecked(expectedASCIILowercaseLetter) == expectedASCIILowercaseLetter);
return LIKELY(toASCIILowerUnchecked(inputCharacter) == expectedASCIILowercaseLetter);
}
template<typename CharacterType> inline bool isASCIIDigitOrPunctuation(CharacterType charCode)
{
return (charCode >= '!' && charCode <= '@') || (charCode >= '[' && charCode <= '`') || (charCode >= '{' && charCode <= '~');
}
}
using WTF::isASCII;
using WTF::isASCIIAlpha;
using WTF::isASCIIAlphaCaselessEqual;
using WTF::isASCIIAlphanumeric;
using WTF::isASCIIBinaryDigit;
using WTF::isASCIIDigit;
using WTF::isASCIIDigitOrPunctuation;
using WTF::isASCIIHexDigit;
using WTF::isASCIILower;
using WTF::isASCIIOctalDigit;
using WTF::isASCIIPrintable;
using WTF::isASCIISpace;
using WTF::isASCIIUpper;
using WTF::lowerNibbleToASCIIHexDigit;
using WTF::lowerNibbleToLowercaseASCIIHexDigit;
using WTF::toASCIIHexValue;
using WTF::toASCIILower;
using WTF::toASCIILowerUnchecked;
using WTF::toASCIIUpper;
using WTF::upperNibbleToASCIIHexDigit;
using WTF::upperNibbleToLowercaseASCIIHexDigit;