blob: d5283f26fd5b90a754d40077b2ee9bbb12748248 [file] [log] [blame]
// Copyright 2016 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef WTF_AtomicStringTable_h
#define WTF_AtomicStringTable_h
#include "wtf/Allocator.h"
#include "wtf/HashSet.h"
#include "wtf/WTFExport.h"
#include "wtf/WTFThreadData.h"
#include "wtf/text/StringHash.h"
#include "wtf/text/StringImpl.h"
namespace WTF {
// The underlying storage that keeps the map of unique AtomicStrings. This is
// not thread safe and each WTFThreadData has one.
class WTF_EXPORT AtomicStringTable final {
USING_FAST_MALLOC(AtomicStringTable);
WTF_MAKE_NONCOPYABLE(AtomicStringTable);
public:
AtomicStringTable();
~AtomicStringTable();
// Gets the shared table for the current thread.
static AtomicStringTable& instance()
{
return wtfThreadData().getAtomicStringTable();
}
// Used by system initialization to preallocate enough storage for all of
// the static strings.
void reserveCapacity(unsigned size);
// Inserting strings into the table. Note that the return value from adding
// a UChar string may be an LChar string as the table will attempt to
// convert the string to save memory if possible.
StringImpl* add(StringImpl*);
PassRefPtr<StringImpl> add(const LChar* chars, unsigned length);
PassRefPtr<StringImpl> add(const UChar* chars, unsigned length);
// Adding UTF8.
// Returns null if the characters contain invalid utf8 sequences.
// Pass null for the charactersEnd to automatically detect the length.
PassRefPtr<StringImpl> addUTF8(const char* charactersStart, const char* charactersEnd);
// This is for ~StringImpl to unregister a string before destruction since
// the table is holding weak pointers. It should not be used directly.
void remove(StringImpl*);
private:
template<typename T, typename HashTranslator>
inline PassRefPtr<StringImpl> addToStringTable(const T& value);
HashSet<StringImpl*> m_table;
};
} // namespace WTF
using WTF::AtomicStringTable;
#endif