diff options
author | Lorry Tar Creator <lorry-tar-importer@lorry> | 2017-06-27 06:07:23 +0000 |
---|---|---|
committer | Lorry Tar Creator <lorry-tar-importer@lorry> | 2017-06-27 06:07:23 +0000 |
commit | 1bf1084f2b10c3b47fd1a588d85d21ed0eb41d0c (patch) | |
tree | 46dcd36c86e7fbc6e5df36deb463b33e9967a6f7 /Source/WTF/wtf/text/IntegerToStringConversion.h | |
parent | 32761a6cee1d0dee366b885b7b9c777e67885688 (diff) | |
download | WebKitGtk-tarball-master.tar.gz |
webkitgtk-2.16.5HEADwebkitgtk-2.16.5master
Diffstat (limited to 'Source/WTF/wtf/text/IntegerToStringConversion.h')
-rw-r--r-- | Source/WTF/wtf/text/IntegerToStringConversion.h | 84 |
1 files changed, 66 insertions, 18 deletions
diff --git a/Source/WTF/wtf/text/IntegerToStringConversion.h b/Source/WTF/wtf/text/IntegerToStringConversion.h index 649fb05ef..563614d4f 100644 --- a/Source/WTF/wtf/text/IntegerToStringConversion.h +++ b/Source/WTF/wtf/text/IntegerToStringConversion.h @@ -22,8 +22,6 @@ #ifndef IntegerToStringConversion_h #define IntegerToStringConversion_h -#include "StringBuilder.h" - namespace WTF { enum PositiveOrNegativeNumber { @@ -33,22 +31,6 @@ enum PositiveOrNegativeNumber { template<typename T> struct IntegerToStringConversionTrait; -template<> struct IntegerToStringConversionTrait<AtomicString> { - typedef AtomicString ReturnType; - typedef void AdditionalArgumentType; - static ReturnType flush(LChar* characters, unsigned length, void*) { return AtomicString(characters, length); } -}; -template<> struct IntegerToStringConversionTrait<String> { - typedef String ReturnType; - typedef void AdditionalArgumentType; - static ReturnType flush(LChar* characters, unsigned length, void*) { return String(characters, length); } -}; -template<> struct IntegerToStringConversionTrait<StringBuilder> { - typedef void ReturnType; - typedef StringBuilder AdditionalArgumentType; - static ReturnType flush(LChar* characters, unsigned length, StringBuilder* stringBuilder) { stringBuilder->append(characters, length); } -}; - template<typename T, typename UnsignedIntegerType, PositiveOrNegativeNumber NumberType, typename AdditionalArgumentType> static typename IntegerToStringConversionTrait<T>::ReturnType numberToStringImpl(UnsignedIntegerType number, AdditionalArgumentType additionalArgument) { @@ -81,6 +63,72 @@ inline typename IntegerToStringConversionTrait<T>::ReturnType numberToStringUnsi return numberToStringImpl<T, UnsignedIntegerType, PositiveNumber>(number, additionalArgument); } + +template<typename CharacterType, typename UnsignedIntegerType, PositiveOrNegativeNumber NumberType> +static void writeNumberToBufferImpl(UnsignedIntegerType number, CharacterType* destination) +{ + LChar buf[sizeof(UnsignedIntegerType) * 3 + 1]; + LChar* end = buf + WTF_ARRAY_LENGTH(buf); + LChar* p = end; + + do { + *--p = static_cast<LChar>((number % 10) + '0'); + number /= 10; + } while (number); + + if (NumberType == NegativeNumber) + *--p = '-'; + + while (p < end) + *destination++ = static_cast<CharacterType>(*p++); +} + +template<typename CharacterType, typename SignedIntegerType> +inline void writeNumberToBufferSigned(SignedIntegerType number, CharacterType* destination) +{ + if (number < 0) + return writeNumberToBufferImpl<CharacterType, typename std::make_unsigned<SignedIntegerType>::type, NegativeNumber>(-number, destination); + return writeNumberToBufferImpl<CharacterType, typename std::make_unsigned<SignedIntegerType>::type, PositiveNumber>(number, destination); +} + +template<typename CharacterType, typename UnsignedIntegerType> +inline void writeNumberToBufferUnsigned(UnsignedIntegerType number, CharacterType* destination) +{ + return writeNumberToBufferImpl<CharacterType, UnsignedIntegerType, PositiveNumber>(number, destination); +} + + +template<typename UnsignedIntegerType, PositiveOrNegativeNumber NumberType> +static unsigned lengthOfNumberAsStringImpl(UnsignedIntegerType number) +{ + unsigned length = 0; + + do { + ++length; + number /= 10; + } while (number); + + if (NumberType == NegativeNumber) + ++length; + + return length; +} + +template<typename SignedIntegerType> +inline unsigned lengthOfNumberAsStringSigned(SignedIntegerType number) +{ + if (number < 0) + return lengthOfNumberAsStringImpl<typename std::make_unsigned<SignedIntegerType>::type, NegativeNumber>(-number); + return lengthOfNumberAsStringImpl<typename std::make_unsigned<SignedIntegerType>::type, PositiveNumber>(number); +} + +template<typename UnsignedIntegerType> +inline unsigned lengthOfNumberAsStringUnsigned(UnsignedIntegerType number) +{ + return lengthOfNumberAsStringImpl<UnsignedIntegerType, PositiveNumber>(number); +} + + } // namespace WTF #endif // IntegerToStringConversion_h |