15c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)/* 25c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Copyright (C) 2007, 2008, 2010, 2011, 2012 Apple Inc. All rights reserved. 35c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * 45c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * This library is free software; you can redistribute it and/or 55c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * modify it under the terms of the GNU Library General Public 65c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * License as published by the Free Software Foundation; either 75c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * version 2 of the License, or (at your option) any later version. 85c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * 95c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * This library is distributed in the hope that it will be useful, 105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * but WITHOUT ANY WARRANTY; without even the implied warranty of 115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Library General Public License for more details. 135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * 145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * You should have received a copy of the GNU Library General Public License 155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * along with this library; see the file COPYING.LIB. If not, write to 165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * the Free Software Foundation, Inc., 59 Temple Place - Suite 330, 175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Boston, MA 02111-1307, USA. 185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * 195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) */ 205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#ifndef SpaceSplitString_h 225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#define SpaceSplitString_h 235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 24e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch#include "wtf/RefCounted.h" 25e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch#include "wtf/Vector.h" 26e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch#include "wtf/text/AtomicString.h" 275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 28c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)namespace blink { 295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 309e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)class SpaceSplitString { 319e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)public: 329e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles) SpaceSplitString() { } 339e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles) SpaceSplitString(const AtomicString& string, bool shouldFoldCase) { set(string, shouldFoldCase); } 349e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles) 359e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles) bool operator!=(const SpaceSplitString& other) const { return m_data != other.m_data; } 369e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles) 379e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles) void set(const AtomicString&, bool shouldFoldCase); 389e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles) void clear() { m_data.clear(); } 399e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles) 409e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles) bool contains(const AtomicString& string) const { return m_data && m_data->contains(string); } 419e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles) bool containsAll(const SpaceSplitString& names) const { return !names.m_data || (m_data && m_data->containsAll(*names.m_data)); } 429e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles) void add(const AtomicString&); 439e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles) bool remove(const AtomicString&); 449e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles) 459e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles) size_t size() const { return m_data ? m_data->size() : 0; } 469e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles) bool isNull() const { return !m_data; } 479e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles) const AtomicString& operator[](size_t i) const { ASSERT_WITH_SECURITY_IMPLICATION(i < size()); return (*m_data)[i]; } 489e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles) 499e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)private: 509e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles) class Data : public RefCounted<Data> { 515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) public: 529e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles) static PassRefPtr<Data> create(const AtomicString&); 539e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles) static PassRefPtr<Data> createUnique(const Data&); 545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 559e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles) ~Data(); 565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) bool contains(const AtomicString& string) 585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) { 595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) size_t size = m_vector.size(); 605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) for (size_t i = 0; i < size; ++i) { 615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (m_vector[i] == string) 625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return true; 635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return false; 655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 679e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles) bool containsAll(Data&); 685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) void add(const AtomicString&); 705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) void remove(unsigned index); 715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 7202772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch bool isUnique() const { return m_keyString.isNull(); } 735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) size_t size() const { return m_vector.size(); } 74926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) const AtomicString& operator[](size_t i) { ASSERT_WITH_SECURITY_IMPLICATION(i < size()); return m_vector[i]; } 755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) private: 779e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles) explicit Data(const AtomicString&); 789e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles) explicit Data(const Data&); 795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) void createVector(const String&); 815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) template <typename CharacterType> 825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) inline void createVector(const CharacterType*, unsigned); 835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) AtomicString m_keyString; 855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) Vector<AtomicString, 4> m_vector; 865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }; 879e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles) typedef HashMap<AtomicString, Data*> DataMap; 885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 899e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles) static DataMap& sharedDataMap(); 90926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 919e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles) void ensureUnique() 929e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles) { 939e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles) if (m_data && !m_data->isUnique()) 949e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles) m_data = Data::createUnique(*m_data); 959e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles) } 965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 979e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles) RefPtr<Data> m_data; 989e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)}; 995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 100c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)} // namespace blink 1015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#endif // SpaceSplitString_h 103