17242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci/*
27242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci * Copyright 2014 The Chromium Authors. All rights reserved.
37242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci * Use of this source code is governed by a BSD-style license that can be
47242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci * found in the LICENSE file.
57242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci */
67242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci
77242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci#include "config.h"
87242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci#include "StringConcatenate.h"
97242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci
107242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci// This macro is helpful for testing how many intermediate Strings are created while evaluating an
117242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci// expression containing operator+.
127242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci#ifndef WTF_STRINGTYPEADAPTER_COPIED_WTF_STRING
137242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci#define WTF_STRINGTYPEADAPTER_COPIED_WTF_STRING() ((void)0)
147242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci#endif
157242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci
167242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tuccivoid WTF::StringTypeAdapter<char*>::writeTo(LChar* destination)
177242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci{
187242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    for (unsigned i = 0; i < m_length; ++i)
197242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        destination[i] = static_cast<LChar>(m_buffer[i]);
207242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci}
217242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci
227242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tuccivoid WTF::StringTypeAdapter<char*>::writeTo(UChar* destination)
237242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci{
247242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    for (unsigned i = 0; i < m_length; ++i) {
257242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        unsigned char c = m_buffer[i];
267242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        destination[i] = c;
277242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    }
287242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci}
297242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci
307242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano TucciWTF::StringTypeAdapter<LChar*>::StringTypeAdapter(LChar* buffer)
317242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    : m_buffer(buffer)
327242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    , m_length(strlen(reinterpret_cast<char*>(buffer)))
337242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci{
347242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci}
357242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci
367242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tuccivoid WTF::StringTypeAdapter<LChar*>::writeTo(LChar* destination)
377242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci{
387242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    memcpy(destination, m_buffer, m_length * sizeof(LChar));
397242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci}
407242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci
417242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tuccivoid WTF::StringTypeAdapter<LChar*>::writeTo(UChar* destination)
427242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci{
437242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    StringImpl::copyChars(destination, m_buffer, m_length);
447242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci}
457242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci
467242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano TucciWTF::StringTypeAdapter<const UChar*>::StringTypeAdapter(const UChar* buffer)
477242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    : m_buffer(buffer)
487242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci{
497242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    size_t len = 0;
507242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    while (m_buffer[len] != UChar(0))
517242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        ++len;
527242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci
537242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    RELEASE_ASSERT(len <= std::numeric_limits<unsigned>::max());
547242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci
557242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    m_length = len;
567242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci}
577242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci
587242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tuccivoid WTF::StringTypeAdapter<const UChar*>::writeTo(UChar* destination)
597242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci{
607242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    memcpy(destination, m_buffer, m_length * sizeof(UChar));
617242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci}
627242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci
637242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano TucciWTF::StringTypeAdapter<const char*>::StringTypeAdapter(const char* buffer)
647242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci: m_buffer(buffer)
657242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci, m_length(strlen(buffer))
667242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci{
677242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci}
687242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci
697242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tuccivoid WTF::StringTypeAdapter<const char*>::writeTo(LChar* destination)
707242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci{
717242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    memcpy(destination, m_buffer, static_cast<size_t>(m_length) * sizeof(LChar));
727242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci}
737242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci
747242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tuccivoid WTF::StringTypeAdapter<const char*>::writeTo(UChar* destination)
757242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci{
767242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    for (unsigned i = 0; i < m_length; ++i) {
777242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        unsigned char c = m_buffer[i];
787242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        destination[i] = c;
797242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    }
807242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci}
817242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci
827242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano TucciWTF::StringTypeAdapter<const LChar*>::StringTypeAdapter(const LChar* buffer)
837242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci: m_buffer(buffer)
847242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci, m_length(strlen(reinterpret_cast<const char*>(buffer)))
857242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci{
867242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci}
877242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci
887242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tuccivoid WTF::StringTypeAdapter<const LChar*>::writeTo(LChar* destination)
897242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci{
907242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    memcpy(destination, m_buffer, static_cast<size_t>(m_length) * sizeof(LChar));
917242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci}
927242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci
937242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tuccivoid WTF::StringTypeAdapter<const LChar*>::writeTo(UChar* destination)
947242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci{
957242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    StringImpl::copyChars(destination, m_buffer, m_length);
967242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci}
977242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci
987242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tuccivoid WTF::StringTypeAdapter<Vector<char> >::writeTo(LChar* destination)
997242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci{
1007242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    for (size_t i = 0; i < m_buffer.size(); ++i)
1017242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        destination[i] = static_cast<unsigned char>(m_buffer[i]);
1027242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci}
1037242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci
1047242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tuccivoid WTF::StringTypeAdapter<Vector<char> >::writeTo(UChar* destination)
1057242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci{
1067242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    for (size_t i = 0; i < m_buffer.size(); ++i)
1077242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        destination[i] = static_cast<unsigned char>(m_buffer[i]);
1087242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci}
1097242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci
1107242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tuccivoid WTF::StringTypeAdapter<Vector<LChar> >::writeTo(LChar* destination)
1117242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci{
1127242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    for (size_t i = 0; i < m_buffer.size(); ++i)
1137242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        destination[i] = m_buffer[i];
1147242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci}
1157242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci
1167242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tuccivoid WTF::StringTypeAdapter<Vector<LChar> >::writeTo(UChar* destination)
1177242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci{
1187242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    for (size_t i = 0; i < m_buffer.size(); ++i)
1197242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        destination[i] = m_buffer[i];
1207242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci}
1217242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci
1227242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tuccivoid WTF::StringTypeAdapter<String>::writeTo(LChar* destination)
1237242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci{
1247242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    unsigned length = m_buffer.length();
1257242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci
1267242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    ASSERT(is8Bit());
1277242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    const LChar* data = m_buffer.characters8();
1287242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    for (unsigned i = 0; i < length; ++i)
1297242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        destination[i] = data[i];
1307242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci
1317242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    WTF_STRINGTYPEADAPTER_COPIED_WTF_STRING();
1327242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci}
1337242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci
1347242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tuccivoid WTF::StringTypeAdapter<String>::writeTo(UChar* destination)
1357242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci{
1367242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    unsigned length = m_buffer.length();
1377242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci
1387242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    if (is8Bit()) {
1397242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        const LChar* data = m_buffer.characters8();
1407242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        for (unsigned i = 0; i < length; ++i)
1417242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci            destination[i] = data[i];
1427242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    } else {
1437242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        const UChar* data = m_buffer.characters16();
1447242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        for (unsigned i = 0; i < length; ++i)
1457242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci            destination[i] = data[i];
1467242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    }
1477242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci
1487242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    WTF_STRINGTYPEADAPTER_COPIED_WTF_STRING();
1497242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci}
1507242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci
151