blob: 89d76d167cb45652c10fa9231f8f82a05d32056e [file] [log] [blame]
/*
* 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 "wtf/text/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<StringView>::writeTo(LChar* destination) {
DCHECK(is8Bit());
StringImpl::copyChars(destination, m_view.characters8(), m_view.length());
WTF_STRINGTYPEADAPTER_COPIED_WTF_STRING();
}
void WTF::StringTypeAdapter<StringView>::writeTo(UChar* destination) {
if (is8Bit())
StringImpl::copyChars(destination, m_view.characters8(), m_view.length());
else
StringImpl::copyChars(destination, m_view.characters16(), m_view.length());
WTF_STRINGTYPEADAPTER_COPIED_WTF_STRING();
}