/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ /* vim: set ts=8 sts=2 et sw=2 tw=80: */ /* This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
/* Class to manage lookup of static names in a table. */
/* * caseInsensitiveHashKey is just like PLDHashTable::HashStringKey except it * uses (*s & ~0x20) instead of simply *s. This means that "aFOO" and * "afoo" and "aFoo" will all hash to the same thing. It also means * that some strings that aren't case-insensensitively equal will hash * to the same value, but it's just a hash function so it doesn't * matter.
*/ static PLDHashNumber caseInsensitiveStringHashKey(constvoid* aKey) {
PLDHashNumber h = 0; const NameTableKey* tableKey = static_cast<const NameTableKey*>(aKey); if (tableKey->mIsUnichar) { for (const char16_t* s = tableKey->mKeyStr.m2b->get(); *s != '\0'; s++) {
h = AddToHash(h, *s & ~0x20);
}
} else { for (constunsignedchar* s = reinterpret_cast<constunsignedchar*>(
tableKey->mKeyStr.m1b->get());
*s != '\0'; s++) {
h = AddToHash(h, *s & ~0x20);
}
} return h;
}
for (int32_t index = 0; index < aLength; ++index) { constchar* raw = aNames[index]; #ifdef DEBUG
{ // verify invariants of contents
nsAutoCString temp1(raw);
nsDependentCString temp2(raw);
ToLowerCase(temp1);
MOZ_ASSERT(temp1.Equals(temp2), "upper case char in table");
MOZ_ASSERT(IsAsciiNullTerminated(raw), "non-ascii string in table -- " "case-insensitive matching won't work right");
} #endif // use placement-new to initialize the string object
nsDependentCString* strPtr = &mNameArray[index]; new (strPtr) nsDependentCString(raw);
NameTableKey key(mNameArray, strPtr);
auto entry = static_cast<NameTableEntry*>(mNameTable.Add(&key, fallible)); if (!entry) { continue;
}
// If the entry already exists it's unlikely but possible that its index is // zero, in which case this assertion won't fail. But if the index is // non-zero (highly likely) then it will fail. In other words, this // assertion is likely but not guaranteed to detect if an entry is already // used.
MOZ_ASSERT(entry->mIndex == 0, "Entry already exists!");
nsStaticCaseInsensitiveNameTable::~nsStaticCaseInsensitiveNameTable() { // manually call the destructor on placement-new'ed objects for (uint32_t index = 0; index < mNameTable.EntryCount(); index++) {
mNameArray[index].~nsDependentCString();
}
free((void*)mNameArray);
MOZ_COUNT_DTOR(nsStaticCaseInsensitiveNameTable);
}
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung ist noch experimentell.