1/* 2 * Copyright (C) 2003, 2006, 2008, 2009, 2010, 2012 Apple Inc. All rights reserved. 3 * 4 * Redistribution and use in source and binary forms, with or without 5 * modification, are permitted provided that the following conditions 6 * are met: 7 * 1. Redistributions of source code must retain the above copyright 8 * notice, this list of conditions and the following disclaimer. 9 * 2. Redistributions in binary form must reproduce the above copyright 10 * notice, this list of conditions and the following disclaimer in the 11 * documentation and/or other materials provided with the distribution. 12 * 13 * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY 14 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 15 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 16 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR 17 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 18 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 19 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR 20 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY 21 * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 22 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 23 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 24 */ 25 26#ifndef CString_h 27#define CString_h 28 29#include <wtf/HashFunctions.h> 30#include <wtf/HashTraits.h> 31#include <wtf/PassRefPtr.h> 32#include <wtf/RefCounted.h> 33 34namespace WTF { 35 36// CStringBuffer is the ref-counted storage class for the characters in a CString. 37// The data is implicitly allocated 1 character longer than length(), as it is zero-terminated. 38class CStringBuffer : public RefCounted<CStringBuffer> { 39public: 40 const char* data() { return mutableData(); } 41 size_t length() const { return m_length; } 42 43private: 44 friend class CString; 45 46 static PassRefPtr<CStringBuffer> createUninitialized(size_t length); 47 48 CStringBuffer(size_t length) : m_length(length) { } 49 char* mutableData() { return reinterpret_cast_ptr<char*>(this + 1); } 50 51 const size_t m_length; 52}; 53 54// A container for a null-terminated char array supporting copy-on-write 55// assignment. The contained char array may be null. 56class CString { 57public: 58 CString() { } 59 WTF_EXPORT_PRIVATE CString(const char*); 60 WTF_EXPORT_PRIVATE CString(const char*, size_t length); 61 CString(CStringBuffer* buffer) : m_buffer(buffer) { } 62 WTF_EXPORT_PRIVATE static CString newUninitialized(size_t length, char*& characterBuffer); 63 CString(HashTableDeletedValueType) : m_buffer(HashTableDeletedValue) { } 64 65 const char* data() const 66 { 67 return m_buffer ? m_buffer->data() : 0; 68 } 69 WTF_EXPORT_PRIVATE char* mutableData(); 70 size_t length() const 71 { 72 return m_buffer ? m_buffer->length() : 0; 73 } 74 75 bool isNull() const { return !m_buffer; } 76 bool isSafeToSendToAnotherThread() const; 77 78 CStringBuffer* buffer() const { return m_buffer.get(); } 79 80 bool isHashTableDeletedValue() const { return m_buffer.isHashTableDeletedValue(); } 81 82 WTF_EXPORT_PRIVATE unsigned hash() const; 83 84private: 85 void copyBufferIfNeeded(); 86 void init(const char*, size_t length); 87 RefPtr<CStringBuffer> m_buffer; 88}; 89 90WTF_EXPORT_PRIVATE bool operator==(const CString& a, const CString& b); 91inline bool operator!=(const CString& a, const CString& b) { return !(a == b); } 92WTF_EXPORT_PRIVATE bool operator==(const CString& a, const char* b); 93inline bool operator!=(const CString& a, const char* b) { return !(a == b); } 94WTF_EXPORT_PRIVATE bool operator<(const CString& a, const CString& b); 95 96struct CStringHash { 97 static unsigned hash(const CString& string) { return string.hash(); } 98 WTF_EXPORT_PRIVATE static bool equal(const CString& a, const CString& b); 99 static const bool safeToCompareToEmptyOrDeleted = true; 100}; 101 102template<typename T> struct DefaultHash; 103template<> struct DefaultHash<CString> { 104 typedef CStringHash Hash; 105}; 106 107template<typename T> struct HashTraits; 108template<> struct HashTraits<CString> : SimpleClassHashTraits<CString> { }; 109 110} // namespace WTF 111 112using WTF::CString; 113 114#endif // CString_h 115