#include "config.h"
#include "AtomicString.h"
#include "IntegerToStringConversion.h"
#include "dtoa.h"
#if USE(WEB_THREAD)
#include "SpinLock.h"
#endif
namespace WTF {
AtomicString AtomicString::lower() const
{
StringImpl* impl = this->impl();
if (UNLIKELY(!impl))
return AtomicString();
RefPtr<StringImpl> lowercasedString = impl->lower();
if (LIKELY(lowercasedString == impl))
return *this;
AtomicString result;
result.m_string = AtomicStringImpl::add(lowercasedString.get());
return result;
}
AtomicString AtomicString::convertToASCIILowercase() const
{
StringImpl* impl = this->impl();
if (UNLIKELY(!impl))
return AtomicString();
unsigned length;
const unsigned localBufferSize = 100;
if (impl->is8Bit() && (length = impl->length()) <= localBufferSize) {
const LChar* characters = impl->characters8();
unsigned failingIndex;
for (unsigned i = 0; i < length; ++i) {
if (UNLIKELY(isASCIIUpper(characters[i]))) {
failingIndex = i;
goto SlowPath;
}
}
return *this;
SlowPath:
LChar localBuffer[localBufferSize];
for (unsigned i = 0; i < failingIndex; ++i)
localBuffer[i] = characters[i];
for (unsigned i = failingIndex; i < length; ++i)
localBuffer[i] = toASCIILower(characters[i]);
return AtomicString(localBuffer, length);
}
RefPtr<StringImpl> convertedString = impl->convertToASCIILowercase();
if (LIKELY(convertedString == impl))
return *this;
AtomicString result;
result.m_string = AtomicStringImpl::add(convertedString.get());
return result;
}
AtomicString AtomicString::number(int number)
{
return numberToStringSigned<AtomicString>(number);
}
AtomicString AtomicString::number(unsigned number)
{
return numberToStringUnsigned<AtomicString>(number);
}
AtomicString AtomicString::number(double number)
{
NumberToStringBuffer buffer;
return String(numberToFixedPrecisionString(number, 6, buffer, true));
}
AtomicString AtomicString::fromUTF8Internal(const char* charactersStart, const char* charactersEnd)
{
auto impl = AtomicStringImpl::addUTF8(charactersStart, charactersEnd);
if (!impl)
return nullAtom;
return impl.get();
}
#ifndef NDEBUG
void AtomicString::show() const
{
m_string.show();
}
#endif
}