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, 2009, 2010, 2012, 2013 Apple Inc.
All rights reserved. | 3 * Copyright (C) 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2012, 2013 Apple Inc.
All rights reserved. |
4 * | 4 * |
5 * This library is free software; you can redistribute it and/or | 5 * This library is free software; you can redistribute it and/or |
6 * modify it under the terms of the GNU Library General Public | 6 * modify it under the terms of the GNU Library General Public |
7 * License as published by the Free Software Foundation; either | 7 * License as published by the Free Software Foundation; either |
8 * version 2 of the License, or (at your option) any later version. | 8 * version 2 of the License, or (at your option) any later version. |
9 * | 9 * |
10 * This library is distributed in the hope that it will be useful, | 10 * This library is distributed in the hope that it will be useful, |
(...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
78 KeepTrailingZeros, | 78 KeepTrailingZeros, |
79 TruncateTrailingZeros | 79 TruncateTrailingZeros |
80 }; | 80 }; |
81 | 81 |
82 enum UTF8ConversionMode { | 82 enum UTF8ConversionMode { |
83 LenientUTF8Conversion, | 83 LenientUTF8Conversion, |
84 StrictUTF8Conversion, | 84 StrictUTF8Conversion, |
85 StrictUTF8ConversionReplacingUnpairedSurrogatesWithFFFD | 85 StrictUTF8ConversionReplacingUnpairedSurrogatesWithFFFD |
86 }; | 86 }; |
87 | 87 |
| 88 #define DISPATCH_CASE_OP(caseSensitivity, op, args) \ |
| 89 ((caseSensitivity == TextCaseSensitive) ? op args : \ |
| 90 op##IgnoringCase args) |
| 91 |
88 template<bool isSpecialCharacter(UChar), typename CharacterType> | 92 template<bool isSpecialCharacter(UChar), typename CharacterType> |
89 bool isAllSpecialCharacters(const CharacterType*, size_t); | 93 bool isAllSpecialCharacters(const CharacterType*, size_t); |
90 | 94 |
91 // You can find documentation about this class in this doc: | 95 // You can find documentation about this class in this doc: |
92 // https://docs.google.com/document/d/1kOCUlJdh2WJMJGDf-WoEQhmnjKLaOYRbiHz5TiGJl
14/edit?usp=sharing | 96 // https://docs.google.com/document/d/1kOCUlJdh2WJMJGDf-WoEQhmnjKLaOYRbiHz5TiGJl
14/edit?usp=sharing |
93 class WTF_EXPORT String { | 97 class WTF_EXPORT String { |
94 public: | 98 public: |
95 // Construct a null string, distinguishable from an empty string. | 99 // Construct a null string, distinguishable from an empty string. |
96 String() { } | 100 String() { } |
97 | 101 |
(...skipping 131 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
229 // Case insensitive string matching. | 233 // Case insensitive string matching. |
230 size_t findIgnoringCase(const LChar* str, unsigned start = 0) const | 234 size_t findIgnoringCase(const LChar* str, unsigned start = 0) const |
231 { return m_impl ? m_impl->findIgnoringCase(str, start) : kNotFound; } | 235 { return m_impl ? m_impl->findIgnoringCase(str, start) : kNotFound; } |
232 size_t findIgnoringCase(const String& str, unsigned start = 0) const | 236 size_t findIgnoringCase(const String& str, unsigned start = 0) const |
233 { return m_impl ? m_impl->findIgnoringCase(str.impl(), start) : kNotFoun
d; } | 237 { return m_impl ? m_impl->findIgnoringCase(str.impl(), start) : kNotFoun
d; } |
234 size_t reverseFindIgnoringCase(const String& str, unsigned start = UINT_MAX)
const | 238 size_t reverseFindIgnoringCase(const String& str, unsigned start = UINT_MAX)
const |
235 { return m_impl ? m_impl->reverseFindIgnoringCase(str.impl(), start) : k
NotFound; } | 239 { return m_impl ? m_impl->reverseFindIgnoringCase(str.impl(), start) : k
NotFound; } |
236 | 240 |
237 // Wrappers for find & reverseFind adding dynamic sensitivity check. | 241 // Wrappers for find & reverseFind adding dynamic sensitivity check. |
238 size_t find(const LChar* str, unsigned start, TextCaseSensitivity caseSensit
ivity) const | 242 size_t find(const LChar* str, unsigned start, TextCaseSensitivity caseSensit
ivity) const |
239 { return (caseSensitivity == TextCaseSensitive) ? find(str, start) : fin
dIgnoringCase(str, start); } | 243 { return DISPATCH_CASE_OP(caseSensitivity, find, (str, start)); } |
240 size_t find(const String& str, unsigned start, TextCaseSensitivity caseSensi
tivity) const | 244 size_t find(const String& str, unsigned start, TextCaseSensitivity caseSensi
tivity) const |
241 { return (caseSensitivity == TextCaseSensitive) ? find(str, start) : fin
dIgnoringCase(str, start); } | 245 { return DISPATCH_CASE_OP(caseSensitivity, find, (str, start)); } |
242 size_t reverseFind(const String& str, unsigned start, TextCaseSensitivity ca
seSensitivity) const | 246 size_t reverseFind(const String& str, unsigned start, TextCaseSensitivity ca
seSensitivity) const |
243 { return (caseSensitivity == TextCaseSensitive) ? reverseFind(str, start
) : reverseFindIgnoringCase(str, start); } | 247 { return (caseSensitivity == TextCaseSensitive) ? reverseFind(str, start
) : reverseFindIgnoringCase(str, start); } |
244 | 248 |
245 Vector<UChar> charactersWithNullTermination() const; | 249 Vector<UChar> charactersWithNullTermination() const; |
246 unsigned copyTo(UChar* buffer, unsigned pos, unsigned maxLength) const; | 250 unsigned copyTo(UChar* buffer, unsigned pos, unsigned maxLength) const; |
247 | 251 |
248 template<size_t inlineCapacity> | 252 template<size_t inlineCapacity> |
249 void appendTo(Vector<UChar, inlineCapacity>&, unsigned pos = 0, unsigned len
= UINT_MAX) const; | 253 void appendTo(Vector<UChar, inlineCapacity>&, unsigned pos = 0, unsigned len
= UINT_MAX) const; |
250 | 254 |
251 template<typename BufferType> | 255 template<typename BufferType> |
252 void appendTo(BufferType&, unsigned pos = 0, unsigned len = UINT_MAX) const; | 256 void appendTo(BufferType&, unsigned pos = 0, unsigned len = UINT_MAX) const; |
253 | 257 |
254 template<size_t inlineCapacity> | 258 template<size_t inlineCapacity> |
255 void prependTo(Vector<UChar, inlineCapacity>&, unsigned pos = 0, unsigned le
n = UINT_MAX) const; | 259 void prependTo(Vector<UChar, inlineCapacity>&, unsigned pos = 0, unsigned le
n = UINT_MAX) const; |
256 | 260 |
257 UChar32 characterStartingAt(unsigned) const; | 261 UChar32 characterStartingAt(unsigned) const; |
258 template<typename CharacterType> | 262 template<typename CharacterType> |
259 bool contains(CharacterType c) const { return find(c) != kNotFound; } | 263 bool contains(CharacterType c) const { return find(c) != kNotFound; } |
260 bool contains(const LChar* str, TextCaseSensitivity caseSensitivity = TextCa
seSensitive) const { return find(str, 0, caseSensitivity) != kNotFound; } | 264 bool contains(const LChar* str, TextCaseSensitivity caseSensitivity = TextCa
seSensitive) const { return find(str, 0, caseSensitivity) != kNotFound; } |
261 bool contains(const String& str, TextCaseSensitivity caseSensitivity = TextC
aseSensitive) const { return find(str, 0, caseSensitivity) != kNotFound; } | 265 bool contains(const String& str, TextCaseSensitivity caseSensitivity = TextC
aseSensitive) const { return find(str, 0, caseSensitivity) != kNotFound; } |
262 | 266 |
263 bool startsWith(const String& s, TextCaseSensitivity caseSensitivity = TextC
aseSensitive) const | 267 bool startsWith(const String& s, TextCaseSensitivity caseSensitivity = TextC
aseSensitive) const |
264 { return m_impl ? m_impl->startsWith(s.impl(), caseSensitivity) : s.isEm
pty(); } | 268 { return m_impl ? DISPATCH_CASE_OP(caseSensitivity, m_impl->startsWith,
(s.impl())) : s.isEmpty(); } |
265 bool startsWith(UChar character) const | 269 bool startsWith(UChar character) const |
266 { return m_impl ? m_impl->startsWith(character) : false; } | 270 { return m_impl ? m_impl->startsWith(character) : false; } |
267 template<unsigned matchLength> | 271 template<unsigned matchLength> |
268 bool startsWith(const char (&prefix)[matchLength]) const | 272 bool startsWith(const char (&prefix)[matchLength]) const |
269 { return m_impl ? m_impl->startsWith(prefix, matchLength - 1) : !matchLe
ngth; } | 273 { return m_impl ? m_impl->startsWith(prefix, matchLength - 1) : !matchLe
ngth; } |
270 | 274 |
271 bool endsWith(const String& s, TextCaseSensitivity caseSensitivity = TextCas
eSensitive) const | 275 bool endsWith(const String& s, TextCaseSensitivity caseSensitivity = TextCas
eSensitive) const |
272 { return m_impl ? m_impl->endsWith(s.impl(), caseSensitivity) : s.isEmpt
y(); } | 276 { return m_impl ? DISPATCH_CASE_OP(caseSensitivity, m_impl->endsWith, (s
.impl())) : s.isEmpty(); } |
273 bool endsWith(UChar character) const | 277 bool endsWith(UChar character) const |
274 { return m_impl ? m_impl->endsWith(character) : false; } | 278 { return m_impl ? m_impl->endsWith(character) : false; } |
275 template<unsigned matchLength> | 279 template<unsigned matchLength> |
276 bool endsWith(const char (&prefix)[matchLength]) const | 280 bool endsWith(const char (&prefix)[matchLength]) const |
277 { return m_impl ? m_impl->endsWith(prefix, matchLength - 1) : !matchLeng
th; } | 281 { return m_impl ? m_impl->endsWith(prefix, matchLength - 1) : !matchLeng
th; } |
278 | 282 |
279 void append(const String&); | 283 void append(const String&); |
280 void append(LChar); | 284 void append(LChar); |
281 void append(char c) { append(static_cast<LChar>(c)); } | 285 void append(char c) { append(static_cast<LChar>(c)); } |
282 void append(UChar); | 286 void append(UChar); |
(...skipping 176 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
459 | 463 |
460 template <typename CharacterType> | 464 template <typename CharacterType> |
461 void removeInternal(const CharacterType*, unsigned, int); | 465 void removeInternal(const CharacterType*, unsigned, int); |
462 | 466 |
463 template <typename CharacterType> | 467 template <typename CharacterType> |
464 void appendInternal(CharacterType); | 468 void appendInternal(CharacterType); |
465 | 469 |
466 RefPtr<StringImpl> m_impl; | 470 RefPtr<StringImpl> m_impl; |
467 }; | 471 }; |
468 | 472 |
| 473 #undef DISPATCH_CASE_OP |
| 474 |
469 inline bool operator==(const String& a, const String& b) { return equal(a.impl()
, b.impl()); } | 475 inline bool operator==(const String& a, const String& b) { return equal(a.impl()
, b.impl()); } |
470 inline bool operator==(const String& a, const LChar* b) { return equal(a.impl(),
b); } | 476 inline bool operator==(const String& a, const LChar* b) { return equal(a.impl(),
b); } |
471 inline bool operator==(const String& a, const char* b) { return equal(a.impl(),
reinterpret_cast<const LChar*>(b)); } | 477 inline bool operator==(const String& a, const char* b) { return equal(a.impl(),
reinterpret_cast<const LChar*>(b)); } |
472 inline bool operator==(const LChar* a, const String& b) { return equal(a, b.impl
()); } | 478 inline bool operator==(const LChar* a, const String& b) { return equal(a, b.impl
()); } |
473 inline bool operator==(const char* a, const String& b) { return equal(reinterpre
t_cast<const LChar*>(a), b.impl()); } | 479 inline bool operator==(const char* a, const String& b) { return equal(reinterpre
t_cast<const LChar*>(a), b.impl()); } |
474 template<size_t inlineCapacity> | 480 template<size_t inlineCapacity> |
475 inline bool operator==(const Vector<char, inlineCapacity>& a, const String& b) {
return equal(b.impl(), a.data(), a.size()); } | 481 inline bool operator==(const Vector<char, inlineCapacity>& a, const String& b) {
return equal(b.impl(), a.data(), a.size()); } |
476 template<size_t inlineCapacity> | 482 template<size_t inlineCapacity> |
477 inline bool operator==(const String& a, const Vector<char, inlineCapacity>& b) {
return b == a; } | 483 inline bool operator==(const String& a, const Vector<char, inlineCapacity>& b) {
return b == a; } |
478 | 484 |
(...skipping 214 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
693 using WTF::charactersToFloat; | 699 using WTF::charactersToFloat; |
694 using WTF::equal; | 700 using WTF::equal; |
695 using WTF::equalIgnoringCase; | 701 using WTF::equalIgnoringCase; |
696 using WTF::find; | 702 using WTF::find; |
697 using WTF::isAllSpecialCharacters; | 703 using WTF::isAllSpecialCharacters; |
698 using WTF::isSpaceOrNewline; | 704 using WTF::isSpaceOrNewline; |
699 using WTF::reverseFind; | 705 using WTF::reverseFind; |
700 | 706 |
701 #include "wtf/text/AtomicString.h" | 707 #include "wtf/text/AtomicString.h" |
702 #endif // WTFString_h | 708 #endif // WTFString_h |
OLD | NEW |