Modified: trunk/Source/WTF/wtf/text/StringConcatenate.h (141341 => 141342)
--- trunk/Source/WTF/wtf/text/StringConcatenate.h 2013-01-31 00:49:05 UTC (rev 141341)
+++ trunk/Source/WTF/wtf/text/StringConcatenate.h 2013-01-31 00:50:24 UTC (rev 141342)
@@ -164,8 +164,7 @@
void writeTo(UChar* destination)
{
- for (unsigned i = 0; i < m_length; ++i)
- destination[i] = m_buffer[i];
+ StringImpl::copyChars(destination, m_buffer, m_length);
}
private:
@@ -259,8 +258,7 @@
void writeTo(UChar* destination)
{
- for (unsigned i = 0; i < m_length; ++i)
- destination[i] = m_buffer[i];
+ StringImpl::copyChars(destination, m_buffer, m_length);
}
private:
@@ -269,6 +267,34 @@
};
template<>
+class StringTypeAdapter<ASCIILiteral> {
+public:
+ StringTypeAdapter<ASCIILiteral>(ASCIILiteral buffer)
+ : m_buffer(reinterpret_cast<const LChar*>(static_cast<const char*>(buffer)))
+ , m_length(strlen(buffer))
+ {
+ }
+
+ size_t length() { return m_length; }
+
+ bool is8Bit() { return true; }
+
+ void writeTo(LChar* destination)
+ {
+ memcpy(destination, m_buffer, static_cast<size_t>(m_length));
+ }
+
+ void writeTo(UChar* destination)
+ {
+ StringImpl::copyChars(destination, m_buffer, m_length);
+ }
+
+private:
+ const LChar* m_buffer;
+ unsigned m_length;
+};
+
+template<>
class StringTypeAdapter<Vector<char> > {
public:
StringTypeAdapter<Vector<char> >(const Vector<char>& buffer)
Modified: trunk/Source/WTF/wtf/text/StringOperators.h (141341 => 141342)
--- trunk/Source/WTF/wtf/text/StringOperators.h 2013-01-31 00:49:05 UTC (rev 141341)
+++ trunk/Source/WTF/wtf/text/StringOperators.h 2013-01-31 00:50:24 UTC (rev 141342)
@@ -112,7 +112,7 @@
}
template<typename U, typename V>
-StringAppend<const char*, StringAppend<U, V> > operator+(const char* string1, const StringAppend<U, V>& string2)
+inline StringAppend<const char*, StringAppend<U, V> > operator+(const char* string1, const StringAppend<U, V>& string2)
{
return StringAppend<const char*, StringAppend<U, V> >(string1, string2);
}
@@ -128,11 +128,27 @@
}
template<typename U, typename V>
-StringAppend<const UChar*, StringAppend<U, V> > operator+(const UChar* string1, const StringAppend<U, V>& string2)
+inline StringAppend<const UChar*, StringAppend<U, V> > operator+(const UChar* string1, const StringAppend<U, V>& string2)
{
return StringAppend<const UChar*, StringAppend<U, V> >(string1, string2);
}
+inline StringAppend<ASCIILiteral, String> operator+(const ASCIILiteral& string1, const String& string2)
+{
+ return StringAppend<ASCIILiteral, String>(string1, string2);
+}
+
+inline StringAppend<ASCIILiteral, AtomicString> operator+(const ASCIILiteral& string1, const AtomicString& string2)
+{
+ return StringAppend<ASCIILiteral, AtomicString>(string1, string2);
+}
+
+template<typename U, typename V>
+inline StringAppend<ASCIILiteral, StringAppend<U, V> > operator+(const ASCIILiteral& string1, const StringAppend<U, V>& string2)
+{
+ return StringAppend<ASCIILiteral, StringAppend<U, V> >(string1, string2);
+}
+
template<typename T>
StringAppend<String, T> operator+(const String& string1, T string2)
{
Modified: trunk/Tools/TestWebKitAPI/Tests/WTF/StringOperators.cpp (141341 => 141342)
--- trunk/Tools/TestWebKitAPI/Tests/WTF/StringOperators.cpp 2013-01-31 00:49:05 UTC (rev 141341)
+++ trunk/Tools/TestWebKitAPI/Tests/WTF/StringOperators.cpp 2013-01-31 00:50:24 UTC (rev 141342)
@@ -45,6 +45,7 @@
{
String string("String");
AtomicString atomicString("AtomicString");
+ ASCIILiteral literal("ASCIILiteral");
EXPECT_EQ(0, wtfStringCopyCount);
@@ -58,6 +59,11 @@
EXPECT_N_WTF_STRING_COPIES(1, "C string" + atomicString);
EXPECT_N_WTF_STRING_COPIES(1, atomicString + "C string");
+ EXPECT_N_WTF_STRING_COPIES(1, literal + string);
+ EXPECT_N_WTF_STRING_COPIES(1, string + literal);
+ EXPECT_N_WTF_STRING_COPIES(1, literal + atomicString);
+ EXPECT_N_WTF_STRING_COPIES(1, atomicString + literal);
+
EXPECT_N_WTF_STRING_COPIES(2, "C string" + string + "C string" + string);
EXPECT_N_WTF_STRING_COPIES(2, "C string" + (string + "C string" + string));
EXPECT_N_WTF_STRING_COPIES(2, ("C string" + string) + ("C string" + string));
@@ -65,6 +71,41 @@
EXPECT_N_WTF_STRING_COPIES(2, string + ("C string" + string + "C string"));
EXPECT_N_WTF_STRING_COPIES(2, (string + "C string") + (string + "C string"));
+ EXPECT_N_WTF_STRING_COPIES(2, literal + string + literal + string);
+ EXPECT_N_WTF_STRING_COPIES(2, literal + (string + literal + string));
+ EXPECT_N_WTF_STRING_COPIES(2, (literal + string) + (literal + string));
+ EXPECT_N_WTF_STRING_COPIES(2, string + literal + string + literal);
+ EXPECT_N_WTF_STRING_COPIES(2, string + (literal + string + literal));
+ EXPECT_N_WTF_STRING_COPIES(2, (string + literal) + (string + literal));
+
+ EXPECT_N_WTF_STRING_COPIES(2, literal + string + "C string" + string);
+ EXPECT_N_WTF_STRING_COPIES(2, literal + (string + "C string" + string));
+ EXPECT_N_WTF_STRING_COPIES(2, (literal + string) + ("C string" + string));
+ EXPECT_N_WTF_STRING_COPIES(2, "C string" + string + literal + string);
+ EXPECT_N_WTF_STRING_COPIES(2, "C string" + (string + literal + string));
+ EXPECT_N_WTF_STRING_COPIES(2, ("C string" + string) + (literal + string));
+
+ EXPECT_N_WTF_STRING_COPIES(2, literal + atomicString + "C string" + atomicString);
+ EXPECT_N_WTF_STRING_COPIES(2, literal + (atomicString + "C string" + atomicString));
+ EXPECT_N_WTF_STRING_COPIES(2, (literal + atomicString) + ("C string" + atomicString));
+ EXPECT_N_WTF_STRING_COPIES(2, "C string" + atomicString + literal + atomicString);
+ EXPECT_N_WTF_STRING_COPIES(2, "C string" + (atomicString + literal + atomicString));
+ EXPECT_N_WTF_STRING_COPIES(2, ("C string" + atomicString) + (literal + atomicString));
+
+ EXPECT_N_WTF_STRING_COPIES(2, literal + atomicString + "C string" + string);
+ EXPECT_N_WTF_STRING_COPIES(2, literal + (atomicString + "C string" + string));
+ EXPECT_N_WTF_STRING_COPIES(2, (literal + atomicString) + ("C string" + string));
+ EXPECT_N_WTF_STRING_COPIES(2, "C string" + atomicString + literal + string);
+ EXPECT_N_WTF_STRING_COPIES(2, "C string" + (atomicString + literal + string));
+ EXPECT_N_WTF_STRING_COPIES(2, ("C string" + atomicString) + (literal + string));
+
+ EXPECT_N_WTF_STRING_COPIES(2, literal + string + "C string" + atomicString);
+ EXPECT_N_WTF_STRING_COPIES(2, literal + (string + "C string" + atomicString));
+ EXPECT_N_WTF_STRING_COPIES(2, (literal + string) + ("C string" + atomicString));
+ EXPECT_N_WTF_STRING_COPIES(2, "C string" + string + literal + atomicString);
+ EXPECT_N_WTF_STRING_COPIES(2, "C string" + (string + literal + atomicString));
+ EXPECT_N_WTF_STRING_COPIES(2, ("C string" + string) + (literal + atomicString));
+
EXPECT_N_WTF_STRING_COPIES(2, "C string" + atomicString + "C string" + atomicString);
EXPECT_N_WTF_STRING_COPIES(2, "C string" + (atomicString + "C string" + atomicString));
EXPECT_N_WTF_STRING_COPIES(2, ("C string" + atomicString) + ("C string" + atomicString));
@@ -72,6 +113,13 @@
EXPECT_N_WTF_STRING_COPIES(2, atomicString + ("C string" + atomicString + "C string"));
EXPECT_N_WTF_STRING_COPIES(2, (atomicString + "C string") + (atomicString + "C string"));
+ EXPECT_N_WTF_STRING_COPIES(2, literal + atomicString + literal + atomicString);
+ EXPECT_N_WTF_STRING_COPIES(2, literal + (atomicString + literal + atomicString));
+ EXPECT_N_WTF_STRING_COPIES(2, (literal + atomicString) + (literal + atomicString));
+ EXPECT_N_WTF_STRING_COPIES(2, atomicString + literal + atomicString + literal);
+ EXPECT_N_WTF_STRING_COPIES(2, atomicString + (literal + atomicString + literal));
+ EXPECT_N_WTF_STRING_COPIES(2, (atomicString + literal) + (atomicString + literal));
+
EXPECT_N_WTF_STRING_COPIES(2, "C string" + string + "C string" + atomicString);
EXPECT_N_WTF_STRING_COPIES(2, "C string" + (string + "C string" + atomicString));
EXPECT_N_WTF_STRING_COPIES(2, ("C string" + string) + ("C string" + atomicString));
@@ -79,6 +127,13 @@
EXPECT_N_WTF_STRING_COPIES(2, string + ("C string" + atomicString + "C string"));
EXPECT_N_WTF_STRING_COPIES(2, (string + "C string") + (atomicString + "C string"));
+ EXPECT_N_WTF_STRING_COPIES(2, literal + string + literal + atomicString);
+ EXPECT_N_WTF_STRING_COPIES(2, literal + (string + literal + atomicString));
+ EXPECT_N_WTF_STRING_COPIES(2, (literal + string) + (literal + atomicString));
+ EXPECT_N_WTF_STRING_COPIES(2, string + literal + atomicString + literal);
+ EXPECT_N_WTF_STRING_COPIES(2, string + (literal + atomicString + literal));
+ EXPECT_N_WTF_STRING_COPIES(2, (string + literal) + (atomicString + literal));
+
EXPECT_N_WTF_STRING_COPIES(2, "C string" + atomicString + "C string" + string);
EXPECT_N_WTF_STRING_COPIES(2, "C string" + (atomicString + "C string" + string));
EXPECT_N_WTF_STRING_COPIES(2, ("C string" + atomicString) + ("C string" + string));
@@ -86,6 +141,13 @@
EXPECT_N_WTF_STRING_COPIES(2, atomicString + ("C string" + string + "C string"));
EXPECT_N_WTF_STRING_COPIES(2, (atomicString + "C string") + (string + "C string"));
+ EXPECT_N_WTF_STRING_COPIES(2, literal + atomicString + literal + string);
+ EXPECT_N_WTF_STRING_COPIES(2, literal + (atomicString + literal + string));
+ EXPECT_N_WTF_STRING_COPIES(2, (literal + atomicString) + (literal + string));
+ EXPECT_N_WTF_STRING_COPIES(2, atomicString + literal + string + literal);
+ EXPECT_N_WTF_STRING_COPIES(2, atomicString + (literal + string + literal));
+ EXPECT_N_WTF_STRING_COPIES(2, (atomicString + literal) + (string + literal));
+
#if COMPILER(MSVC)
EXPECT_N_WTF_STRING_COPIES(1, L"wide string" + string);
EXPECT_N_WTF_STRING_COPIES(1, string + L"wide string");