OLD | NEW |
1 /* | 1 /* |
2 * (C) 1999 Lars Knoll (knoll@kde.org) | 2 * (C) 1999 Lars Knoll (knoll@kde.org) |
3 * Copyright (C) 2004, 2005, 2006, 2007, 2008, 2010, 2012 Apple Inc. All rights | 3 * Copyright (C) 2004, 2005, 2006, 2007, 2008, 2010, 2012 Apple Inc. All rights |
4 * reserved. | 4 * reserved. |
5 * Copyright (C) 2007-2009 Torch Mobile, Inc. | 5 * Copyright (C) 2007-2009 Torch Mobile, Inc. |
6 * | 6 * |
7 * This library is free software; you can redistribute it and/or | 7 * This library is free software; you can redistribute it and/or |
8 * modify it under the terms of the GNU Library General Public | 8 * modify it under the terms of the GNU Library General Public |
9 * License as published by the Free Software Foundation; either | 9 * License as published by the Free Software Foundation; either |
10 * version 2 of the License, or (at your option) any later version. | 10 * version 2 of the License, or (at your option) any later version. |
(...skipping 92 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
103 | 103 |
104 if (impl_->Is8Bit() && string.Is8Bit()) { | 104 if (impl_->Is8Bit() && string.Is8Bit()) { |
105 LChar* data; | 105 LChar* data; |
106 CHECK_LE(string.length(), | 106 CHECK_LE(string.length(), |
107 std::numeric_limits<unsigned>::max() - impl_->length()); | 107 std::numeric_limits<unsigned>::max() - impl_->length()); |
108 RefPtr<StringImpl> new_impl = StringImpl::CreateUninitialized( | 108 RefPtr<StringImpl> new_impl = StringImpl::CreateUninitialized( |
109 impl_->length() + string.length(), data); | 109 impl_->length() + string.length(), data); |
110 memcpy(data, impl_->Characters8(), impl_->length() * sizeof(LChar)); | 110 memcpy(data, impl_->Characters8(), impl_->length() * sizeof(LChar)); |
111 memcpy(data + impl_->length(), string.Characters8(), | 111 memcpy(data + impl_->length(), string.Characters8(), |
112 string.length() * sizeof(LChar)); | 112 string.length() * sizeof(LChar)); |
113 impl_ = new_impl.Release(); | 113 impl_ = std::move(new_impl); |
114 return; | 114 return; |
115 } | 115 } |
116 | 116 |
117 UChar* data; | 117 UChar* data; |
118 CHECK_LE(string.length(), | 118 CHECK_LE(string.length(), |
119 std::numeric_limits<unsigned>::max() - impl_->length()); | 119 std::numeric_limits<unsigned>::max() - impl_->length()); |
120 RefPtr<StringImpl> new_impl = | 120 RefPtr<StringImpl> new_impl = |
121 StringImpl::CreateUninitialized(impl_->length() + string.length(), data); | 121 StringImpl::CreateUninitialized(impl_->length() + string.length(), data); |
122 | 122 |
123 if (impl_->Is8Bit()) | 123 if (impl_->Is8Bit()) |
124 StringImpl::CopyChars(data, impl_->Characters8(), impl_->length()); | 124 StringImpl::CopyChars(data, impl_->Characters8(), impl_->length()); |
125 else | 125 else |
126 StringImpl::CopyChars(data, impl_->Characters16(), impl_->length()); | 126 StringImpl::CopyChars(data, impl_->Characters16(), impl_->length()); |
127 | 127 |
128 if (string.Is8Bit()) | 128 if (string.Is8Bit()) |
129 StringImpl::CopyChars(data + impl_->length(), string.Characters8(), | 129 StringImpl::CopyChars(data + impl_->length(), string.Characters8(), |
130 string.length()); | 130 string.length()); |
131 else | 131 else |
132 StringImpl::CopyChars(data + impl_->length(), string.Characters16(), | 132 StringImpl::CopyChars(data + impl_->length(), string.Characters16(), |
133 string.length()); | 133 string.length()); |
134 | 134 |
135 impl_ = new_impl.Release(); | 135 impl_ = std::move(new_impl); |
136 } | 136 } |
137 | 137 |
138 template <typename CharacterType> | 138 template <typename CharacterType> |
139 inline void String::AppendInternal(CharacterType c) { | 139 inline void String::AppendInternal(CharacterType c) { |
140 // FIXME: This is extremely inefficient. So much so that we might want to | 140 // FIXME: This is extremely inefficient. So much so that we might want to |
141 // take this out of String's API. We can make it better by optimizing the | 141 // take this out of String's API. We can make it better by optimizing the |
142 // case where exactly one String is pointing at this StringImpl, but even | 142 // case where exactly one String is pointing at this StringImpl, but even |
143 // then it's going to require a call into the allocator every single time. | 143 // then it's going to require a call into the allocator every single time. |
144 if (!impl_) { | 144 if (!impl_) { |
145 impl_ = StringImpl::Create(&c, 1); | 145 impl_ = StringImpl::Create(&c, 1); |
146 return; | 146 return; |
147 } | 147 } |
148 | 148 |
149 // FIXME: We should be able to create an 8 bit string via this code path. | 149 // FIXME: We should be able to create an 8 bit string via this code path. |
150 UChar* data; | 150 UChar* data; |
151 CHECK_LT(impl_->length(), std::numeric_limits<unsigned>::max()); | 151 CHECK_LT(impl_->length(), std::numeric_limits<unsigned>::max()); |
152 RefPtr<StringImpl> new_impl = | 152 RefPtr<StringImpl> new_impl = |
153 StringImpl::CreateUninitialized(impl_->length() + 1, data); | 153 StringImpl::CreateUninitialized(impl_->length() + 1, data); |
154 if (impl_->Is8Bit()) | 154 if (impl_->Is8Bit()) |
155 StringImpl::CopyChars(data, impl_->Characters8(), impl_->length()); | 155 StringImpl::CopyChars(data, impl_->Characters8(), impl_->length()); |
156 else | 156 else |
157 StringImpl::CopyChars(data, impl_->Characters16(), impl_->length()); | 157 StringImpl::CopyChars(data, impl_->Characters16(), impl_->length()); |
158 data[impl_->length()] = c; | 158 data[impl_->length()] = c; |
159 impl_ = new_impl.Release(); | 159 impl_ = std::move(new_impl); |
160 } | 160 } |
161 | 161 |
162 void String::append(LChar c) { | 162 void String::append(LChar c) { |
163 AppendInternal(c); | 163 AppendInternal(c); |
164 } | 164 } |
165 | 165 |
166 void String::append(UChar c) { | 166 void String::append(UChar c) { |
167 AppendInternal(c); | 167 AppendInternal(c); |
168 } | 168 } |
169 | 169 |
(...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
223 if (position >= length()) { | 223 if (position >= length()) { |
224 if (string.Is8Bit()) | 224 if (string.Is8Bit()) |
225 append(string); | 225 append(string); |
226 else | 226 else |
227 append(string); | 227 append(string); |
228 return; | 228 return; |
229 } | 229 } |
230 | 230 |
231 DCHECK(impl_); | 231 DCHECK(impl_); |
232 if (string.Is8Bit()) | 232 if (string.Is8Bit()) |
233 impl_ = InsertInternal(impl_.Release(), string.Characters8(), | 233 impl_ = InsertInternal(std::move(impl_), string.Characters8(), |
234 string.length(), position); | 234 string.length(), position); |
235 else | 235 else |
236 impl_ = InsertInternal(impl_.Release(), string.Characters16(), | 236 impl_ = InsertInternal(std::move(impl_), string.Characters16(), |
237 string.length(), position); | 237 string.length(), position); |
238 } | 238 } |
239 | 239 |
240 UChar32 String::CharacterStartingAt(unsigned i) const { | 240 UChar32 String::CharacterStartingAt(unsigned i) const { |
241 if (!impl_ || i >= impl_->length()) | 241 if (!impl_ || i >= impl_->length()) |
242 return 0; | 242 return 0; |
243 return impl_->CharacterStartingAt(i); | 243 return impl_->CharacterStartingAt(i); |
244 } | 244 } |
245 | 245 |
246 void String::Ensure16Bit() { | 246 void String::Ensure16Bit() { |
(...skipping 577 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
824 return out << '"'; | 824 return out << '"'; |
825 } | 825 } |
826 | 826 |
827 #ifndef NDEBUG | 827 #ifndef NDEBUG |
828 void String::Show() const { | 828 void String::Show() const { |
829 DataLogF("%s\n", AsciiDebug(Impl()).data()); | 829 DataLogF("%s\n", AsciiDebug(Impl()).data()); |
830 } | 830 } |
831 #endif | 831 #endif |
832 | 832 |
833 } // namespace WTF | 833 } // namespace WTF |
OLD | NEW |