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