Home | History | Annotate | Download | only in text
      1 /*
      2  * Copyright 2014 The Chromium Authors. All rights reserved.
      3  * Use of this source code is governed by a BSD-style license that can be
      4  * found in the LICENSE file.
      5  */
      6 
      7 #include "config.h"
      8 #include "StringConcatenate.h"
      9 
     10 // This macro is helpful for testing how many intermediate Strings are created while evaluating an
     11 // expression containing operator+.
     12 #ifndef WTF_STRINGTYPEADAPTER_COPIED_WTF_STRING
     13 #define WTF_STRINGTYPEADAPTER_COPIED_WTF_STRING() ((void)0)
     14 #endif
     15 
     16 void WTF::StringTypeAdapter<char*>::writeTo(LChar* destination)
     17 {
     18     for (unsigned i = 0; i < m_length; ++i)
     19         destination[i] = static_cast<LChar>(m_buffer[i]);
     20 }
     21 
     22 void WTF::StringTypeAdapter<char*>::writeTo(UChar* destination)
     23 {
     24     for (unsigned i = 0; i < m_length; ++i) {
     25         unsigned char c = m_buffer[i];
     26         destination[i] = c;
     27     }
     28 }
     29 
     30 WTF::StringTypeAdapter<LChar*>::StringTypeAdapter(LChar* buffer)
     31     : m_buffer(buffer)
     32     , m_length(strlen(reinterpret_cast<char*>(buffer)))
     33 {
     34 }
     35 
     36 void WTF::StringTypeAdapter<LChar*>::writeTo(LChar* destination)
     37 {
     38     memcpy(destination, m_buffer, m_length * sizeof(LChar));
     39 }
     40 
     41 void WTF::StringTypeAdapter<LChar*>::writeTo(UChar* destination)
     42 {
     43     StringImpl::copyChars(destination, m_buffer, m_length);
     44 }
     45 
     46 WTF::StringTypeAdapter<const UChar*>::StringTypeAdapter(const UChar* buffer)
     47     : m_buffer(buffer)
     48 {
     49     size_t len = 0;
     50     while (m_buffer[len] != UChar(0))
     51         ++len;
     52 
     53     RELEASE_ASSERT(len <= std::numeric_limits<unsigned>::max());
     54 
     55     m_length = len;
     56 }
     57 
     58 void WTF::StringTypeAdapter<const UChar*>::writeTo(UChar* destination)
     59 {
     60     memcpy(destination, m_buffer, m_length * sizeof(UChar));
     61 }
     62 
     63 WTF::StringTypeAdapter<const char*>::StringTypeAdapter(const char* buffer)
     64 : m_buffer(buffer)
     65 , m_length(strlen(buffer))
     66 {
     67 }
     68 
     69 void WTF::StringTypeAdapter<const char*>::writeTo(LChar* destination)
     70 {
     71     memcpy(destination, m_buffer, static_cast<size_t>(m_length) * sizeof(LChar));
     72 }
     73 
     74 void WTF::StringTypeAdapter<const char*>::writeTo(UChar* destination)
     75 {
     76     for (unsigned i = 0; i < m_length; ++i) {
     77         unsigned char c = m_buffer[i];
     78         destination[i] = c;
     79     }
     80 }
     81 
     82 WTF::StringTypeAdapter<const LChar*>::StringTypeAdapter(const LChar* buffer)
     83 : m_buffer(buffer)
     84 , m_length(strlen(reinterpret_cast<const char*>(buffer)))
     85 {
     86 }
     87 
     88 void WTF::StringTypeAdapter<const LChar*>::writeTo(LChar* destination)
     89 {
     90     memcpy(destination, m_buffer, static_cast<size_t>(m_length) * sizeof(LChar));
     91 }
     92 
     93 void WTF::StringTypeAdapter<const LChar*>::writeTo(UChar* destination)
     94 {
     95     StringImpl::copyChars(destination, m_buffer, m_length);
     96 }
     97 
     98 void WTF::StringTypeAdapter<Vector<char> >::writeTo(LChar* destination)
     99 {
    100     for (size_t i = 0; i < m_buffer.size(); ++i)
    101         destination[i] = static_cast<unsigned char>(m_buffer[i]);
    102 }
    103 
    104 void WTF::StringTypeAdapter<Vector<char> >::writeTo(UChar* destination)
    105 {
    106     for (size_t i = 0; i < m_buffer.size(); ++i)
    107         destination[i] = static_cast<unsigned char>(m_buffer[i]);
    108 }
    109 
    110 void WTF::StringTypeAdapter<Vector<LChar> >::writeTo(LChar* destination)
    111 {
    112     for (size_t i = 0; i < m_buffer.size(); ++i)
    113         destination[i] = m_buffer[i];
    114 }
    115 
    116 void WTF::StringTypeAdapter<Vector<LChar> >::writeTo(UChar* destination)
    117 {
    118     for (size_t i = 0; i < m_buffer.size(); ++i)
    119         destination[i] = m_buffer[i];
    120 }
    121 
    122 void WTF::StringTypeAdapter<String>::writeTo(LChar* destination)
    123 {
    124     unsigned length = m_buffer.length();
    125 
    126     ASSERT(is8Bit());
    127     const LChar* data = m_buffer.characters8();
    128     for (unsigned i = 0; i < length; ++i)
    129         destination[i] = data[i];
    130 
    131     WTF_STRINGTYPEADAPTER_COPIED_WTF_STRING();
    132 }
    133 
    134 void WTF::StringTypeAdapter<String>::writeTo(UChar* destination)
    135 {
    136     unsigned length = m_buffer.length();
    137 
    138     if (is8Bit()) {
    139         const LChar* data = m_buffer.characters8();
    140         for (unsigned i = 0; i < length; ++i)
    141             destination[i] = data[i];
    142     } else {
    143         const UChar* data = m_buffer.characters16();
    144         for (unsigned i = 0; i < length; ++i)
    145             destination[i] = data[i];
    146     }
    147 
    148     WTF_STRINGTYPEADAPTER_COPIED_WTF_STRING();
    149 }
    150 
    151