Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(8)

Unified Diff: third_party/WebKit/Source/wtf/text/StringConcatenate.cpp

Issue 2315853002: Massively simplify WTF's StringConcatenate (Closed)
Patch Set: missing inlines. Created 4 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: third_party/WebKit/Source/wtf/text/StringConcatenate.cpp
diff --git a/third_party/WebKit/Source/wtf/text/StringConcatenate.cpp b/third_party/WebKit/Source/wtf/text/StringConcatenate.cpp
index 7da90e9cabd9f540cf1519e785f19c5f8f8344ce..cbcd0231c01218f93f834f9ca14902de0286b68c 100644
--- a/third_party/WebKit/Source/wtf/text/StringConcatenate.cpp
+++ b/third_party/WebKit/Source/wtf/text/StringConcatenate.cpp
@@ -6,144 +6,62 @@
#include "wtf/text/StringConcatenate.h"
+#include "wtf/CheckedNumeric.h"
+#include "wtf/text/StringImpl.h"
+
+namespace WTF {
+
// 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;
- }
-}
+namespace internal {
-WTF::StringTypeAdapter<LChar*>::StringTypeAdapter(LChar* buffer)
- : m_buffer(buffer)
- , m_length(strlen(reinterpret_cast<char*>(buffer)))
+unsigned checkedAddLength(unsigned a, unsigned b)
{
+ CheckedNumeric<unsigned> length = a;
+ length += b;
+ return length.ValueOrDie();
}
-void WTF::StringTypeAdapter<LChar*>::writeTo(LChar* destination)
-{
- memcpy(destination, m_buffer, m_length * sizeof(LChar));
-}
+} // namespace internal
-void WTF::StringTypeAdapter<LChar*>::writeTo(UChar* destination)
+void StringTypeAdapter<const UChar*>::writeTo(UChar* destination) const
{
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)
+void StringTypeAdapter<const LChar*>::writeTo(LChar* destination) const
{
StringImpl::copyChars(destination, m_buffer, m_length);
}
-void WTF::StringTypeAdapter<Vector<char>>::writeTo(LChar* destination)
+void StringTypeAdapter<const LChar*>::writeTo(UChar* destination) const
{
- 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];
+ StringImpl::copyChars(destination, m_buffer, m_length);
}
-void WTF::StringTypeAdapter<Vector<LChar>>::writeTo(UChar* destination)
-{
- for (size_t i = 0; i < m_buffer.size(); ++i)
- destination[i] = m_buffer[i];
-}
+StringTypeAdapter<const UChar*>::StringTypeAdapter(const UChar* buffer)
+ : m_buffer(buffer)
+ , m_length(lengthOfNullTerminatedString(buffer)) {}
-void WTF::StringTypeAdapter<String>::writeTo(LChar* destination)
+void StringTypeAdapter<String>::writeTo(LChar* destination) const
{
- unsigned length = m_buffer.length();
-
- ASSERT(is8Bit());
- const LChar* data = m_buffer.characters8();
- for (unsigned i = 0; i < length; ++i)
- destination[i] = data[i];
-
+ DCHECK(is8Bit());
+ StringImpl::copyChars(destination, m_buffer.characters8(), m_buffer.length());
WTF_STRINGTYPEADAPTER_COPIED_WTF_STRING();
}
-void WTF::StringTypeAdapter<String>::writeTo(UChar* destination)
+void StringTypeAdapter<String>::writeTo(UChar* destination) const
{
- 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];
- }
+ if (is8Bit())
+ StringImpl::copyChars(destination, m_buffer.characters8(), m_buffer.length());
+ else
+ StringImpl::copyChars(destination, m_buffer.characters16(), m_buffer.length());
WTF_STRINGTYPEADAPTER_COPIED_WTF_STRING();
}
+} // namespace WTF

Powered by Google App Engine
This is Rietveld 408576698