static inline void tokenizeSpaceSplitString(TokenProcessor& tokenProcessor, const String& string) { ASSERT(!string.isNull()); const StringImpl* stringImpl = string.impl(); if (stringImpl->is8Bit()) tokenizeSpaceSplitString(tokenProcessor, stringImpl->characters8(), stringImpl->length()); else tokenizeSpaceSplitString(tokenProcessor, stringImpl->characters16(), stringImpl->length()); }
bool SpaceSplitString::spaceSplitStringContainsValue(const String& inputString, const char* value, unsigned valueLength, bool shouldFoldCase) { if (inputString.isNull()) return false; TokenIsEqualToCStringTokenProcessor tokenProcessor(value, valueLength); tokenizeSpaceSplitString(tokenProcessor, shouldFoldCase ? inputString.impl()->convertToASCIILowercase() : inputString); return tokenProcessor.referenceStringWasFound(); }
inline PassRefPtr<SpaceSplitStringData> SpaceSplitStringData::create(const AtomicString& keyString, unsigned tokenCount) { ASSERT(tokenCount); RELEASE_ASSERT(tokenCount < (std::numeric_limits<unsigned>::max() - sizeof(SpaceSplitStringData)) / sizeof(AtomicString)); unsigned sizeToAllocate = sizeof(SpaceSplitStringData) + tokenCount * sizeof(AtomicString); SpaceSplitStringData* spaceSplitStringData = static_cast<SpaceSplitStringData*>(fastMalloc(sizeToAllocate)); new (NotNull, spaceSplitStringData) SpaceSplitStringData(keyString, tokenCount); AtomicString* tokenArrayStart = spaceSplitStringData->tokenArrayStart(); TokenAtomicStringInitializer tokenInitializer(tokenArrayStart); tokenizeSpaceSplitString(tokenInitializer, keyString); ASSERT(static_cast<unsigned>(tokenInitializer.nextMemoryBucket() - tokenArrayStart) == tokenCount); ASSERT(reinterpret_cast<const char*>(tokenInitializer.nextMemoryBucket()) == reinterpret_cast<const char*>(spaceSplitStringData) + sizeToAllocate); return adoptRef(spaceSplitStringData); }
PassRefPtr<SpaceSplitStringData> SpaceSplitStringData::create(const AtomicString& keyString) { ASSERT(isMainThread()); ASSERT(!keyString.isNull()); auto addResult = spaceSplitStringTable().add(keyString, nullptr); if (!addResult.isNewEntry) return addResult.iterator->value; // Nothing in the cache? Let's create a new SpaceSplitStringData if the input has something useful. // 1) We find the number of strings in the input to know how much size we need to allocate. TokenCounter tokenCounter; tokenizeSpaceSplitString(tokenCounter, keyString); unsigned tokenCount = tokenCounter.tokenCount(); if (!tokenCount) return nullptr; RefPtr<SpaceSplitStringData> spaceSplitStringData = create(keyString, tokenCount); addResult.iterator->value = spaceSplitStringData.get(); return spaceSplitStringData.release(); }