4080e683a5073ad893f8c8e1b35624e0771a6a9c
[WebKit-https.git] / WebCore / platform / PlatformString.h
1 /*
2  * This file is part of the DOM implementation for KDE.
3  *
4  * (C) 1999 Lars Knoll (knoll@kde.org)
5  * Copyright (C) 2004, 2005, 2006 Apple Computer, Inc.
6  *
7  * This library is free software; you can redistribute it and/or
8  * modify it under the terms of the GNU Library General Public
9  * License as published by the Free Software Foundation; either
10  * version 2 of the License, or (at your option) any later version.
11  *
12  * This library is distributed in the hope that it will be useful,
13  * but WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
15  * Library General Public License for more details.
16  *
17  * You should have received a copy of the GNU Library General Public License
18  * along with this library; see the file COPYING.LIB.  If not, write to
19  * the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
20  * Boston, MA 02111-1307, USA.
21  *
22  */
23
24 #ifndef String_h
25 #define String_h
26
27 // This file would be called String.h, but that conflicts with <string.h>
28 // on systems without case-sensitive file systems.
29
30 #include "StringImpl.h"
31
32 #if PLATFORM(CF)
33 #include <CoreFoundation/CoreFoundation.h>
34 #endif
35
36 #if PLATFORM(QT)
37 class QString;
38 #endif
39
40 namespace WebCore {
41
42 /**
43  * Currently, strings are explicitly shared (they behave like pointers), meaning
44  * that modifications to one instance will also modify all others. If you
45  * wish to get a String that is independent, use @ref copy(). In the future,
46  * we plan to change this to have immutable copy on write semantics.
47  */
48
49 class String {
50 public:
51     String() { } // gives null string, distinguishable from an empty string
52     String(const UChar*, unsigned length);
53     explicit String(const UChar*); // Specifically and explicitly for null terminated UTF-16
54     String(const KJS::Identifier&);
55     String(const KJS::UString&);
56     String(const char*);
57     String(const char*, unsigned length);
58     String(StringImpl* i) : m_impl(i) { }
59
60     operator KJS::Identifier() const;
61     operator KJS::UString() const;
62
63     unsigned length() const;
64     const UChar* characters() const;
65     const UChar* charactersWithNullTermination();
66     
67     UChar operator[](unsigned i) const; // if i >= length(), returns 0
68     
69     bool contains(UChar c) const { return find(c) != -1; }
70     bool contains(const char* str, bool caseSensitive = true) const { return find(str, 0, caseSensitive) != -1; }
71     bool contains(const String& str, bool caseSensitive = true) const { return find(str, 0, caseSensitive) != -1; }
72
73     int find(UChar c, int start = 0) const
74         { return m_impl ? m_impl->find(c, start) : -1; }
75     int find(const char* str, int start = 0, bool caseSensitive = true) const
76         { return m_impl ? m_impl->find(str, start, caseSensitive) : -1; }
77     int find(const String& str, int start = 0, bool caseSensitive = true) const
78         { return m_impl ? m_impl->find(str.impl(), start, caseSensitive) : -1; }
79     
80     bool startsWith(const String& s, bool caseSensitive = true) const
81         { return m_impl ? m_impl->startsWith(s.impl(), caseSensitive) : s.isEmpty(); }
82     bool endsWith(const String& s, bool caseSensitive = true) const
83         { return m_impl ? m_impl->endsWith(s.impl(), caseSensitive) : s.isEmpty(); }
84
85     void append(const String&);
86     void append(char);
87     void append(UChar);
88     void insert(const String&, unsigned pos);
89
90     String& replace(UChar a, UChar b) { if (m_impl) m_impl = m_impl->replace(a, b); return *this; }
91     String& replace(UChar a, const String& b) { if (m_impl) m_impl = m_impl->replace(a, b.impl()); return *this; }
92     String& replace(unsigned index, unsigned len, const String& b) { if (m_impl) m_impl = m_impl->replace(index, len, b.impl()); return *this; }
93
94     void truncate(unsigned len);
95     void remove(unsigned pos, int len = 1);
96
97     String substring(unsigned pos, unsigned len = UINT_MAX) const;
98     String left(unsigned len) const { return substring(0, len); }
99     String right(unsigned len) const { return substring(length() - len, len); }
100
101     // Splits the string into two. The original string gets truncated to pos, and the rest is returned.
102     String split(unsigned pos);
103
104     // Returns a lowercase/uppercase version of the string
105     String lower() const;
106     String upper() const;
107
108     // Return the string with case folded for case insensitive comparison.
109     String foldCase() const;
110
111     static String number(int);
112     static String number(unsigned);
113     static String number(long);
114     static String number(unsigned long);
115     static String number(long long);
116     static String number(unsigned long long);
117     static String number(double);
118     
119     static String sprintf(const char *, ...)
120 #if __GNUC__
121         __attribute__ ((format (printf, 1, 2)))
122 #endif
123         ;
124
125     int toInt(bool* ok = 0) const;
126     Length* toLengthArray(int& len) const;
127     Length* toCoordsArray(int& len) const;
128     bool percentage(int &_percentage) const;
129
130     String copy() const;
131
132     bool isNull()  const { return !m_impl; }
133     bool isEmpty()  const;
134
135     StringImpl* impl() const { return m_impl.get(); }
136
137 #if PLATFORM(CF)
138     String(CFStringRef);
139     CFStringRef createCFString() const { return m_impl ? m_impl->createCFString() : CFSTR(""); }
140 #endif
141
142 #ifdef __OBJC__
143     String(NSString*);
144     operator NSString*() const { if (!m_impl) return @""; return *m_impl; }
145 #endif
146
147 #if PLATFORM(QT)
148     String(const QString&);
149     operator QString() const;
150 #endif
151
152 #ifndef NDEBUG
153     // For debugging only, leaks memory.
154     Vector<char> ascii() const;
155 #endif
156
157     String(const DeprecatedString&);
158     DeprecatedString deprecatedString() const;
159     
160 private:
161     RefPtr<StringImpl> m_impl;
162 };
163
164 String operator+(const String&, const String&);
165 String operator+(const String&, const char*);
166 String operator+(const char*, const String&);
167
168 inline String& operator+=(String& a, const String& b) { a.append(b); return a; }
169
170 inline bool operator==(const String& a, const String& b) { return equal(a.impl(), b.impl()); }
171 inline bool operator==(const String& a, const char* b) { return equal(a.impl(), b); }
172 inline bool operator==(const char* a, const String& b) { return equal(a, b.impl()); }
173
174 inline bool operator!=(const String& a, const String& b) { return !equal(a.impl(), b.impl()); }
175 inline bool operator!=(const String& a, const char* b) { return !equal(a.impl(), b); }
176 inline bool operator!=(const char* a, const String& b) { return !equal(a, b.impl()); }
177
178 inline bool equalIgnoringCase(const String& a, const String& b) { return equalIgnoringCase(a.impl(), b.impl()); }
179 inline bool equalIgnoringCase(const String& a, const char* b) { return equalIgnoringCase(a.impl(), b); }
180 inline bool equalIgnoringCase(const char* a, const String& b) { return equalIgnoringCase(a, b.impl()); }
181
182 bool operator==(const String& a, const DeprecatedString& b);
183 inline bool operator==(const DeprecatedString& b, const String& a) { return a == b; }
184 inline bool operator!=(const String& a, const DeprecatedString& b) { return !(a == b); }
185 inline bool operator!=(const DeprecatedString& b, const String& a ) { return !(a == b); }
186
187 }
188
189 namespace WTF {
190
191     // StrHash is the default hash for String
192     template<typename T> struct DefaultHash;
193     template<typename T> struct StrHash;
194     template<> struct DefaultHash<WebCore::String> {
195         typedef StrHash<WebCore::String> Hash;
196     };
197
198 }
199
200 #endif