Index: Source/core/dom/SpaceSplitString.h |
diff --git a/Source/core/dom/SpaceSplitString.h b/Source/core/dom/SpaceSplitString.h |
index 6c98ec9827dd7b3fd28224bfc61b681570547092..c5f47adb6c6173cd23969dcff3e9af3013490683 100644 |
--- a/Source/core/dom/SpaceSplitString.h |
+++ b/Source/core/dom/SpaceSplitString.h |
@@ -27,12 +27,32 @@ |
namespace blink { |
- class SpaceSplitStringData : public RefCounted<SpaceSplitStringData> { |
+class SpaceSplitString { |
+public: |
+ SpaceSplitString() { } |
+ SpaceSplitString(const AtomicString& string, bool shouldFoldCase) { set(string, shouldFoldCase); } |
+ |
+ bool operator!=(const SpaceSplitString& other) const { return m_data != other.m_data; } |
+ |
+ void set(const AtomicString&, bool shouldFoldCase); |
+ void clear() { m_data.clear(); } |
+ |
+ bool contains(const AtomicString& string) const { return m_data && m_data->contains(string); } |
+ bool containsAll(const SpaceSplitString& names) const { return !names.m_data || (m_data && m_data->containsAll(*names.m_data)); } |
+ void add(const AtomicString&); |
+ bool remove(const AtomicString&); |
+ |
+ size_t size() const { return m_data ? m_data->size() : 0; } |
+ bool isNull() const { return !m_data; } |
+ const AtomicString& operator[](size_t i) const { ASSERT_WITH_SECURITY_IMPLICATION(i < size()); return (*m_data)[i]; } |
+ |
+private: |
+ class Data : public RefCounted<Data> { |
public: |
- static PassRefPtr<SpaceSplitStringData> create(const AtomicString&); |
- static PassRefPtr<SpaceSplitStringData> createUnique(const SpaceSplitStringData&); |
+ static PassRefPtr<Data> create(const AtomicString&); |
+ static PassRefPtr<Data> createUnique(const Data&); |
- ~SpaceSplitStringData(); |
+ ~Data(); |
bool contains(const AtomicString& string) |
{ |
@@ -44,7 +64,7 @@ namespace blink { |
return false; |
} |
- bool containsAll(SpaceSplitStringData&); |
+ bool containsAll(Data&); |
void add(const AtomicString&); |
void remove(unsigned index); |
@@ -54,8 +74,8 @@ namespace blink { |
const AtomicString& operator[](size_t i) { ASSERT_WITH_SECURITY_IMPLICATION(i < size()); return m_vector[i]; } |
private: |
- explicit SpaceSplitStringData(const AtomicString&); |
- explicit SpaceSplitStringData(const SpaceSplitStringData&); |
+ explicit Data(const AtomicString&); |
+ explicit Data(const Data&); |
void createVector(const String&); |
template <typename CharacterType> |
@@ -64,35 +84,18 @@ namespace blink { |
AtomicString m_keyString; |
Vector<AtomicString, 4> m_vector; |
}; |
+ typedef HashMap<AtomicString, Data*> DataMap; |
- class SpaceSplitString { |
- public: |
- SpaceSplitString() { } |
- SpaceSplitString(const AtomicString& string, bool shouldFoldCase) { set(string, shouldFoldCase); } |
- |
- bool operator!=(const SpaceSplitString& other) const { return m_data != other.m_data; } |
+ static DataMap& sharedDataMap(); |
- void set(const AtomicString&, bool shouldFoldCase); |
- void clear() { m_data.clear(); } |
+ void ensureUnique() |
+ { |
+ if (m_data && !m_data->isUnique()) |
+ m_data = Data::createUnique(*m_data); |
+ } |
- bool contains(const AtomicString& string) const { return m_data && m_data->contains(string); } |
- bool containsAll(const SpaceSplitString& names) const { return !names.m_data || (m_data && m_data->containsAll(*names.m_data)); } |
- void add(const AtomicString&); |
- bool remove(const AtomicString&); |
- |
- size_t size() const { return m_data ? m_data->size() : 0; } |
- bool isNull() const { return !m_data; } |
- const AtomicString& operator[](size_t i) const { ASSERT_WITH_SECURITY_IMPLICATION(i < size()); return (*m_data)[i]; } |
- |
- private: |
- void ensureUnique() |
- { |
- if (m_data && !m_data->isUnique()) |
- m_data = SpaceSplitStringData::createUnique(*m_data); |
- } |
- |
- RefPtr<SpaceSplitStringData> m_data; |
- }; |
+ RefPtr<Data> m_data; |
+}; |
} // namespace blink |