Index: compiled/String.h |
diff --git a/compiled/String.h b/compiled/String.h |
index d30b49b0abec49006e0a98648008f21a3d1e47a9..88bb093007792864ca98c3b0e2f28b2f2c5bde82 100644 |
--- a/compiled/String.h |
+++ b/compiled/String.h |
@@ -37,13 +37,28 @@ ABP_NS_BEGIN |
inline void String_assert_writable(bool isWritable); |
+// hacky because without templates |
+#ifdef ABP_UTF8_STRING |
+#define ABP_TEXT(val) val |
hub
2018/03/13 21:29:16
Can't we make this macro shorter? Things are getti
sergei
2018/03/14 10:17:10
I'm afraid it can clash with some another macro, s
|
+struct StringTraits |
+{ |
+ typedef char char_type; |
+}; |
+#else |
+#define ABP_TEXT(val) u##val |
+struct StringTraits |
+{ |
+ typedef char16_t char_type; |
+}; |
+#endif |
+ |
class String |
{ |
friend class DependentString; |
friend class OwnedString; |
public: |
- typedef char16_t value_type; |
+ typedef StringTraits::char_type value_type; |
typedef size_t size_type; |
// Type flags, stored in the top 2 bits of the mLen member |
@@ -198,8 +213,8 @@ public: |
// This should be more efficient with a lookup table but I couldn't measure |
// any performance difference. |
- if (currChar >= u'A' && currChar <= u'Z') |
- mBuf[i] = currChar + u'a' - u'A'; |
+ if (currChar >= ABP_TEXT('A') && currChar <= ABP_TEXT('Z')) |
+ mBuf[i] = currChar + ABP_TEXT('a') - ABP_TEXT('A'); |
else if (currChar >= 128) |
{ |
mBuf[i] = CharToLower(currChar); |
@@ -211,8 +226,12 @@ public: |
#ifdef INSIDE_TESTS |
inline std::ostream& operator<<(std::ostream& os, const String& str) |
{ |
+#ifdef ABP_UTF8_STRING |
+ os.write(str.data(), str.length()); |
+#else |
std::wstring_convert<std::codecvt_utf8<char16_t>, char16_t> converter; |
os << converter.to_bytes(str.data(), str.data() + str.length()); |
+#endif |
return os; |
} |
#endif |
@@ -296,7 +315,7 @@ inline DependentString operator "" _str(const String::value_type* str, |
inline void String_assert_writable(bool isWritable) |
{ |
- assert2(isWritable, u"Writing access to a read-only string"_str); |
+ assert2(isWritable, ABP_TEXT("Writing access to a read-only string"_str)); |
} |
class OwnedString : public String |
@@ -394,23 +413,25 @@ public: |
if (!sourceLen) |
return; |
- assert2(source, u"Null buffer passed to OwnedString.append()"_str); |
+ assert2(source, ABP_TEXT("Null buffer passed to OwnedString.append()"_str)); |
size_t oldLength = length(); |
grow(sourceLen); |
std::memcpy(mBuf + oldLength, source, sizeof(value_type) * sourceLen); |
} |
+#ifndef ABP_UTF8_STRING |
void append(const char* source, size_type sourceLen) |
{ |
if (!sourceLen) |
return; |
- assert2(source, u"Null buffer passed to OwnedString.append()"_str); |
+ assert2(source, ABP_TEXT("Null buffer passed to OwnedString.append()"_str)); |
size_t oldLength = length(); |
grow(sourceLen); |
for (size_t i = 0; i < sourceLen; i++) |
mBuf[oldLength + i] = source[i]; |
} |
+#endif // !ABP_UTF8_STRING |
void append(const String& str) |
{ |
@@ -442,11 +463,11 @@ public: |
grow((negative ? 1 : 0) + size); |
if (negative) |
- mBuf[pos++] = '-'; |
+ mBuf[pos++] = ABP_TEXT('-'); |
for (int i = size - 1; i >= 0; i--) |
{ |
- mBuf[pos + i] = '0' + (num % 10); |
+ mBuf[pos + i] = ABP_TEXT('0') + (num % 10); |
num /= 10; |
} |
} |
@@ -474,7 +495,7 @@ struct LexicalCastImpl<bool> |
{ |
static bool Convert(const String& value) |
{ |
- return value == u"true"_str; |
+ return value == ABP_TEXT("true"_str); |
} |
}; |
@@ -488,7 +509,7 @@ struct LexicalCastImpl |
if (len == 0) |
return 0; |
String::size_type pos = 0; |
- bool negative = std::numeric_limits<T>::is_signed && value[0] == u'-'; |
+ bool negative = std::numeric_limits<T>::is_signed && value[0] == ABP_TEXT('-'); |
if (negative) |
{ |
++pos; |
@@ -497,7 +518,7 @@ struct LexicalCastImpl |
for (; pos < len; ++pos) |
{ |
auto c = value[pos]; |
- if (c < u'0' || c > u'9') |
+ if (c < ABP_TEXT('0') || c > ABP_TEXT('9')) |
return 0; |
// isDangerous is the optimization because there is no need for some checks |
// when the values are far from edge cases. |
@@ -514,7 +535,7 @@ struct LexicalCastImpl |
return 0; |
} |
result *= 10; |
- uint8_t digit = c - u'0'; |
+ uint8_t digit = c - ABP_TEXT('0'); |
if (isDangerous && (std::numeric_limits<T>::max() - digit < result - (negative ? 1 : 0))) |
{ |
return 0; |