Bug 1449082 - Make NS_IsAscii constexpr. r=froydnj
MozReview-Commit-ID: GbXFwCzUwgV
--- a/xpcom/base/nsCRTGlue.cpp
+++ b/xpcom/base/nsCRTGlue.cpp
@@ -212,22 +212,16 @@ NS_IsUpper(char aChar)
bool
NS_IsLower(char aChar)
{
return aChar != (char)nsLowerUpperUtils::kLower2Upper[(unsigned char)aChar];
}
bool
-NS_IsAscii(char16_t aChar)
-{
- return (0x0080 > aChar);
-}
-
-bool
NS_IsAscii(const char16_t* aString)
{
while (*aString) {
if (0x0080 <= *aString) {
return false;
}
aString++;
}
@@ -254,38 +248,16 @@ NS_IsAscii(const char* aString, uint32_t
if (0x80 & *aString) {
return false;
}
++aString;
}
return true;
}
-bool
-NS_IsAsciiAlpha(char16_t aChar)
-{
- return (aChar >= 'A' && aChar <= 'Z') ||
- (aChar >= 'a' && aChar <= 'z');
-}
-
-bool
-NS_IsAsciiWhitespace(char16_t aChar)
-{
- return aChar == ' ' ||
- aChar == '\r' ||
- aChar == '\n' ||
- aChar == '\t';
-}
-
-bool
-NS_IsAsciiDigit(char16_t aChar)
-{
- return aChar >= '0' && aChar <= '9';
-}
-
#ifndef XPCOM_GLUE_AVOID_NSPR
void
NS_MakeRandomString(char* aBuf, int32_t aBufLen)
{
#define TABLE_SIZE 36
static const char table[] = {
'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j',
--- a/xpcom/base/nsCRTGlue.h
+++ b/xpcom/base/nsCRTGlue.h
@@ -93,24 +93,74 @@ inline char
NS_ToLower(char aChar)
{
return (char)nsLowerUpperUtils::kUpper2Lower[(unsigned char)aChar];
}
bool NS_IsUpper(char aChar);
bool NS_IsLower(char aChar);
-bool NS_IsAscii(char16_t aChar);
+constexpr bool
+NS_IsAscii(char16_t aChar)
+{
+ return (0x0080 > aChar);
+}
+
bool NS_IsAscii(const char16_t* aString);
-bool NS_IsAsciiAlpha(char16_t aChar);
-bool NS_IsAsciiDigit(char16_t aChar);
-bool NS_IsAsciiWhitespace(char16_t aChar);
bool NS_IsAscii(const char* aString);
bool NS_IsAscii(const char* aString, uint32_t aLength);
+// These three functions are `constexpr` alternatives to NS_IsAscii. It should
+// only be used for compile-time computation because it uses recursion.
+// XXX: once support for GCC 4.9 is dropped, this function should be removed
+// and NS_IsAscii should be made `constexpr`.
+constexpr bool
+NS_ConstExprIsAscii(const char16_t* aString)
+{
+ return !*aString ? true :
+ !NS_IsAscii(*aString) ? false : NS_ConstExprIsAscii(aString + 1);
+}
+
+constexpr bool
+NS_ConstExprIsAscii(const char* aString)
+{
+ return !*aString ? true :
+ !NS_IsAscii(*aString) ? false : NS_ConstExprIsAscii(aString + 1);
+}
+
+constexpr bool
+NS_ConstExprIsAscii(const char* aString, uint32_t aLength)
+{
+ return aLength == 0 ? true :
+ !NS_IsAscii(*aString) ? false :
+ NS_ConstExprIsAscii(aString + 1, aLength - 1);
+}
+
+constexpr bool
+NS_IsAsciiAlpha(char16_t aChar)
+{
+ return (aChar >= 'A' && aChar <= 'Z') ||
+ (aChar >= 'a' && aChar <= 'z');
+}
+
+constexpr bool
+NS_IsAsciiWhitespace(char16_t aChar)
+{
+ return aChar == ' ' ||
+ aChar == '\r' ||
+ aChar == '\n' ||
+ aChar == '\t';
+}
+
+constexpr bool
+NS_IsAsciiDigit(char16_t aChar)
+{
+ return aChar >= '0' && aChar <= '9';
+}
+
#ifndef XPCOM_GLUE_AVOID_NSPR
void NS_MakeRandomString(char* aBuf, int32_t aBufLen);
#endif
#define FF '\f'
#define TAB '\t'
#define CRSTR "\015"