Index: Source/wtf/text/StringConcatenate.cpp |
diff --git a/Source/wtf/text/StringConcatenate.cpp b/Source/wtf/text/StringConcatenate.cpp |
new file mode 100644 |
index 0000000000000000000000000000000000000000..ae083e53dae07f245117a963b71a8d38cdea72bf |
--- /dev/null |
+++ b/Source/wtf/text/StringConcatenate.cpp |
@@ -0,0 +1,150 @@ |
+/* |
+ * Copyright 2014 The Chromium Authors. All rights reserved. |
+ * Use of this source code is governed by a BSD-style license that can be |
+ * found in the LICENSE file. |
+ */ |
+ |
+#include "config.h" |
+#include "StringConcatenate.h" |
+ |
+// This macro is helpful for testing how many intermediate Strings are created while evaluating an |
+// expression containing operator+. |
+#ifndef WTF_STRINGTYPEADAPTER_COPIED_WTF_STRING |
+#define WTF_STRINGTYPEADAPTER_COPIED_WTF_STRING() ((void)0) |
+#endif |
+ |
+void WTF::StringTypeAdapter<char*>::writeTo(LChar* destination) |
+{ |
+ for (unsigned i = 0; i < m_length; ++i) |
+ destination[i] = static_cast<LChar>(m_buffer[i]); |
+} |
+ |
+void WTF::StringTypeAdapter<char*>::writeTo(UChar* destination) |
+{ |
+ for (unsigned i = 0; i < m_length; ++i) { |
+ unsigned char c = m_buffer[i]; |
+ destination[i] = c; |
+ } |
+} |
+ |
+WTF::StringTypeAdapter<LChar*>::StringTypeAdapter(LChar* buffer) |
+ : m_buffer(buffer) |
+ , m_length(strlen(reinterpret_cast<char*>(buffer))) |
+{ |
+} |
+ |
+void WTF::StringTypeAdapter<LChar*>::writeTo(LChar* destination) |
+{ |
+ memcpy(destination, m_buffer, m_length * sizeof(LChar)); |
+} |
+ |
+void WTF::StringTypeAdapter<LChar*>::writeTo(UChar* destination) |
+{ |
+ StringImpl::copyChars(destination, m_buffer, m_length); |
+} |
+ |
+WTF::StringTypeAdapter<const UChar*>::StringTypeAdapter(const UChar* buffer) |
+ : m_buffer(buffer) |
+{ |
+ size_t len = 0; |
+ while (m_buffer[len] != UChar(0)) |
+ ++len; |
+ |
+ RELEASE_ASSERT(len <= std::numeric_limits<unsigned>::max()); |
+ |
+ m_length = len; |
+} |
+ |
+void WTF::StringTypeAdapter<const UChar*>::writeTo(UChar* destination) |
+{ |
+ memcpy(destination, m_buffer, m_length * sizeof(UChar)); |
+} |
+ |
+WTF::StringTypeAdapter<const char*>::StringTypeAdapter(const char* buffer) |
+: m_buffer(buffer) |
+, m_length(strlen(buffer)) |
+{ |
+} |
+ |
+void WTF::StringTypeAdapter<const char*>::writeTo(LChar* destination) |
+{ |
+ memcpy(destination, m_buffer, static_cast<size_t>(m_length) * sizeof(LChar)); |
+} |
+ |
+void WTF::StringTypeAdapter<const char*>::writeTo(UChar* destination) |
+{ |
+ for (unsigned i = 0; i < m_length; ++i) { |
+ unsigned char c = m_buffer[i]; |
+ destination[i] = c; |
+ } |
+} |
+ |
+WTF::StringTypeAdapter<const LChar*>::StringTypeAdapter(const LChar* buffer) |
+: m_buffer(buffer) |
+, m_length(strlen(reinterpret_cast<const char*>(buffer))) |
+{ |
+} |
+ |
+void WTF::StringTypeAdapter<const LChar*>::writeTo(LChar* destination) |
+{ |
+ memcpy(destination, m_buffer, static_cast<size_t>(m_length) * sizeof(LChar)); |
+} |
+ |
+void WTF::StringTypeAdapter<const LChar*>::writeTo(UChar* destination) |
+{ |
+ StringImpl::copyChars(destination, m_buffer, m_length); |
+} |
+ |
+void WTF::StringTypeAdapter<Vector<char> >::writeTo(LChar* destination) |
+{ |
+ for (size_t i = 0; i < m_buffer.size(); ++i) |
+ destination[i] = static_cast<unsigned char>(m_buffer[i]); |
+} |
+ |
+void WTF::StringTypeAdapter<Vector<char> >::writeTo(UChar* destination) |
+{ |
+ for (size_t i = 0; i < m_buffer.size(); ++i) |
+ destination[i] = static_cast<unsigned char>(m_buffer[i]); |
+} |
+ |
+void WTF::StringTypeAdapter<Vector<LChar> >::writeTo(LChar* destination) |
+{ |
+ for (size_t i = 0; i < m_buffer.size(); ++i) |
+ destination[i] = m_buffer[i]; |
+} |
+ |
+void WTF::StringTypeAdapter<Vector<LChar> >::writeTo(UChar* destination) |
+{ |
+ for (size_t i = 0; i < m_buffer.size(); ++i) |
+ destination[i] = m_buffer[i]; |
+} |
+ |
+void WTF::StringTypeAdapter<String>::writeTo(LChar* destination) |
+{ |
+ unsigned length = m_buffer.length(); |
+ |
+ ASSERT(is8Bit()); |
+ const LChar* data = m_buffer.characters8(); |
+ for (unsigned i = 0; i < length; ++i) |
+ destination[i] = data[i]; |
+ |
+ WTF_STRINGTYPEADAPTER_COPIED_WTF_STRING(); |
+} |
+ |
+void WTF::StringTypeAdapter<String>::writeTo(UChar* destination) |
+{ |
+ unsigned length = m_buffer.length(); |
+ |
+ if (is8Bit()) { |
+ const LChar* data = m_buffer.characters8(); |
+ for (unsigned i = 0; i < length; ++i) |
+ destination[i] = data[i]; |
+ } else { |
+ const UChar* data = m_buffer.characters16(); |
+ for (unsigned i = 0; i < length; ++i) |
+ destination[i] = data[i]; |
+ } |
+ |
+ WTF_STRINGTYPEADAPTER_COPIED_WTF_STRING(); |
+} |
+ |