2 * Copyright (C) 2004, 2005, 2006, 2008 Apple Inc. All rights reserved.
4 * This library is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU Library General Public
6 * License as published by the Free Software Foundation; either
7 * version 2 of the License, or (at your option) any later version.
9 * This library is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 * Library General Public License for more details.
14 * You should have received a copy of the GNU Library General Public License
15 * along with this library; see the file COPYING.LIB. If not, write to
16 * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
17 * Boston, MA 02110-1301, USA.
21 #ifndef AtomicString_h
22 #define AtomicString_h
24 #include "AtomicStringImpl.h"
25 #include "WTFString.h"
27 // Define 'NO_IMPLICIT_ATOMICSTRING' before including this header,
28 // to disallow (expensive) implicit String-->AtomicString conversions.
29 #ifdef NO_IMPLICIT_ATOMICSTRING
30 #define ATOMICSTRING_CONVERSION explicit
32 #define ATOMICSTRING_CONVERSION
35 // FIXME: This is a temporary layering violation while we move string code to WTF.
36 // Landing the file moves in one patch, will follow on with patches to change the namespaces.
39 struct AtomicStringHash
;
46 AtomicString(const char* s
) : m_string(add(s
)) { }
47 AtomicString(const UChar
* s
, unsigned length
) : m_string(add(s
, length
)) { }
48 AtomicString(const UChar
* s
, unsigned length
, unsigned existingHash
) : m_string(add(s
, length
, existingHash
)) { }
49 AtomicString(const UChar
* s
) : m_string(add(s
)) { }
50 ATOMICSTRING_CONVERSION
AtomicString(StringImpl
* imp
) : m_string(add(imp
)) { }
51 AtomicString(AtomicStringImpl
* imp
) : m_string(imp
) { }
52 ATOMICSTRING_CONVERSION
AtomicString(const String
& s
) : m_string(add(s
.impl())) { }
54 // Hash table deleted values, which are only constructed and never copied or destroyed.
55 AtomicString(WTF::HashTableDeletedValueType
) : m_string(WTF::HashTableDeletedValue
) { }
56 bool isHashTableDeletedValue() const { return m_string
.isHashTableDeletedValue(); }
58 static AtomicStringImpl
* find(const UChar
* s
, unsigned length
, unsigned existingHash
);
60 operator const String
&() const { return m_string
; }
61 const String
& string() const { return m_string
; };
63 AtomicStringImpl
* impl() const { return static_cast<AtomicStringImpl
*>(m_string
.impl()); }
65 const UChar
* characters() const { return m_string
.characters(); }
66 unsigned length() const { return m_string
.length(); }
68 UChar
operator[](unsigned int i
) const { return m_string
[i
]; }
70 bool contains(UChar c
) const { return m_string
.contains(c
); }
71 bool contains(const char* s
, bool caseSensitive
= true) const
72 { return m_string
.contains(s
, caseSensitive
); }
73 bool contains(const String
& s
, bool caseSensitive
= true) const
74 { return m_string
.contains(s
, caseSensitive
); }
76 int find(UChar c
, int start
= 0) const { return m_string
.find(c
, start
); }
77 int find(const char* s
, int start
= 0, bool caseSentitive
= true) const
78 { return m_string
.find(s
, start
, caseSentitive
); }
79 int find(const String
& s
, int start
= 0, bool caseSentitive
= true) const
80 { return m_string
.find(s
, start
, caseSentitive
); }
82 bool startsWith(const String
& s
, bool caseSensitive
= true) const
83 { return m_string
.startsWith(s
, caseSensitive
); }
84 bool endsWith(const String
& s
, bool caseSensitive
= true) const
85 { return m_string
.endsWith(s
, caseSensitive
); }
87 AtomicString
lower() const;
88 AtomicString
upper() const { return AtomicString(impl()->upper()); }
90 int toInt(bool* ok
= 0) const { return m_string
.toInt(ok
); }
91 double toDouble(bool* ok
= 0) const { return m_string
.toDouble(ok
); }
92 float toFloat(bool* ok
= 0) const { return m_string
.toFloat(ok
); }
93 bool percentage(int& p
) const { return m_string
.percentage(p
); }
95 bool isNull() const { return m_string
.isNull(); }
96 bool isEmpty() const { return m_string
.isEmpty(); }
98 static void remove(StringImpl
*);
101 AtomicString(CFStringRef s
) : m_string(add(String(s
).impl())) { }
102 CFStringRef
createCFString() const { return m_string
.createCFString(); }
105 AtomicString(NSString
* s
) : m_string(add(String(s
).impl())) { }
106 operator NSString
*() const { return m_string
; }
109 AtomicString(const QString
& s
) : m_string(add(String(s
).impl())) { }
110 operator QString() const { return m_string
; }
116 static PassRefPtr
<StringImpl
> add(const char*);
117 static PassRefPtr
<StringImpl
> add(const UChar
*, unsigned length
);
118 static PassRefPtr
<StringImpl
> add(const UChar
*, unsigned length
, unsigned existingHash
);
119 static PassRefPtr
<StringImpl
> add(const UChar
*);
120 ALWAYS_INLINE PassRefPtr
<StringImpl
> add(StringImpl
* r
)
122 if (!r
|| r
->isAtomic())
124 return addSlowCase(r
);
126 static PassRefPtr
<StringImpl
> addSlowCase(StringImpl
*);
129 inline bool operator==(const AtomicString
& a
, const AtomicString
& b
) { return a
.impl() == b
.impl(); }
130 bool operator==(const AtomicString
& a
, const char* b
);
131 inline bool operator==(const AtomicString
& a
, const String
& b
) { return equal(a
.impl(), b
.impl()); }
132 inline bool operator==(const char* a
, const AtomicString
& b
) { return b
== a
; }
133 inline bool operator==(const String
& a
, const AtomicString
& b
) { return equal(a
.impl(), b
.impl()); }
135 inline bool operator!=(const AtomicString
& a
, const AtomicString
& b
) { return a
.impl() != b
.impl(); }
136 inline bool operator!=(const AtomicString
& a
, const char *b
) { return !(a
== b
); }
137 inline bool operator!=(const AtomicString
& a
, const String
& b
) { return !equal(a
.impl(), b
.impl()); }
138 inline bool operator!=(const char* a
, const AtomicString
& b
) { return !(b
== a
); }
139 inline bool operator!=(const String
& a
, const AtomicString
& b
) { return !equal(a
.impl(), b
.impl()); }
141 inline bool equalIgnoringCase(const AtomicString
& a
, const AtomicString
& b
) { return equalIgnoringCase(a
.impl(), b
.impl()); }
142 inline bool equalIgnoringCase(const AtomicString
& a
, const char* b
) { return equalIgnoringCase(a
.impl(), b
); }
143 inline bool equalIgnoringCase(const AtomicString
& a
, const String
& b
) { return equalIgnoringCase(a
.impl(), b
.impl()); }
144 inline bool equalIgnoringCase(const char* a
, const AtomicString
& b
) { return equalIgnoringCase(a
, b
.impl()); }
145 inline bool equalIgnoringCase(const String
& a
, const AtomicString
& b
) { return equalIgnoringCase(a
.impl(), b
.impl()); }
147 // Define external global variables for the commonly used atomic strings.
148 // These are only usable from the main thread.
149 #ifndef ATOMICSTRING_HIDE_GLOBALS
150 extern const JS_EXPORTDATA AtomicString nullAtom
;
151 extern const JS_EXPORTDATA AtomicString emptyAtom
;
152 extern const JS_EXPORTDATA AtomicString textAtom
;
153 extern const JS_EXPORTDATA AtomicString commentAtom
;
154 extern const JS_EXPORTDATA AtomicString starAtom
;
155 extern const JS_EXPORTDATA AtomicString xmlAtom
;
156 extern const JS_EXPORTDATA AtomicString xmlnsAtom
;
159 } // namespace WebCore
164 // AtomicStringHash is the default hash for AtomicString
165 template<typename T
> struct DefaultHash
;
166 template<> struct DefaultHash
<WebCore::AtomicString
> {
167 typedef WebCore::AtomicStringHash Hash
;
172 #endif // AtomicString_h