| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright (C) 2012 Apple Inc. All Rights Reserved. | 2 * Copyright (C) 2012 Apple Inc. All Rights Reserved. |
| 3 * Copyright (C) 2012 Patrick Gansterer <paroga@paroga.com> | 3 * Copyright (C) 2012 Patrick Gansterer <paroga@paroga.com> |
| 4 * | 4 * |
| 5 * This library is free software; you can redistribute it and/or | 5 * This library is free software; you can redistribute it and/or |
| 6 * modify it under the terms of the GNU Library General Public | 6 * modify it under the terms of the GNU Library General Public |
| 7 * License as published by the Free Software Foundation; either | 7 * License as published by the Free Software Foundation; either |
| 8 * version 2 of the License, or (at your option) any later version. | 8 * version 2 of the License, or (at your option) any later version. |
| 9 * | 9 * |
| 10 * This library is distributed in the hope that it will be useful, | 10 * This library is distributed in the hope that it will be useful, |
| (...skipping 10 matching lines...) Expand all Loading... |
| 21 | 21 |
| 22 #ifndef IntegerToStringConversion_h | 22 #ifndef IntegerToStringConversion_h |
| 23 #define IntegerToStringConversion_h | 23 #define IntegerToStringConversion_h |
| 24 | 24 |
| 25 #include "wtf/text/StringBuilder.h" | 25 #include "wtf/text/StringBuilder.h" |
| 26 #include "wtf/text/StringImpl.h" | 26 #include "wtf/text/StringImpl.h" |
| 27 | 27 |
| 28 namespace WTF { | 28 namespace WTF { |
| 29 | 29 |
| 30 enum PositiveOrNegativeNumber { | 30 enum PositiveOrNegativeNumber { |
| 31 PositiveNumber, | 31 PositiveNumber, |
| 32 NegativeNumber | 32 NegativeNumber |
| 33 }; | 33 }; |
| 34 | 34 |
| 35 template<typename T> struct ConversionTrait; | 35 template <typename T> |
| 36 struct ConversionTrait; |
| 36 | 37 |
| 37 template<> struct ConversionTrait<String> { | 38 template <> |
| 38 typedef PassRefPtr<StringImpl> ReturnType; | 39 struct ConversionTrait<String> { |
| 39 typedef void AdditionalArgumentType; | 40 typedef PassRefPtr<StringImpl> ReturnType; |
| 40 static inline ReturnType flush(LChar* characters, unsigned length, void*) {
return StringImpl::create(characters, length); } | 41 typedef void AdditionalArgumentType; |
| 42 static inline ReturnType flush(LChar* characters, unsigned length, void*) { re
turn StringImpl::create(characters, length); } |
| 41 }; | 43 }; |
| 42 template<> struct ConversionTrait<StringBuilder> { | 44 template <> |
| 43 typedef void ReturnType; | 45 struct ConversionTrait<StringBuilder> { |
| 44 typedef StringBuilder AdditionalArgumentType; | 46 typedef void ReturnType; |
| 45 static inline ReturnType flush(LChar* characters, unsigned length, StringBui
lder* stringBuilder) { stringBuilder->append(characters, length); } | 47 typedef StringBuilder AdditionalArgumentType; |
| 48 static inline ReturnType flush(LChar* characters, unsigned length, StringBuild
er* stringBuilder) { stringBuilder->append(characters, length); } |
| 46 }; | 49 }; |
| 47 template<> struct ConversionTrait<AtomicString> { | 50 template <> |
| 48 typedef AtomicString ReturnType; | 51 struct ConversionTrait<AtomicString> { |
| 49 typedef void AdditionalArgumentType; | 52 typedef AtomicString ReturnType; |
| 50 static inline ReturnType flush(LChar* characters, unsigned length, void*) {
return AtomicString(characters, length); } | 53 typedef void AdditionalArgumentType; |
| 54 static inline ReturnType flush(LChar* characters, unsigned length, void*) { re
turn AtomicString(characters, length); } |
| 51 }; | 55 }; |
| 52 | 56 |
| 53 template<typename T> struct UnsignedIntegerTrait; | 57 template <typename T> |
| 58 struct UnsignedIntegerTrait; |
| 54 | 59 |
| 55 template<> struct UnsignedIntegerTrait<int> { | 60 template <> |
| 56 typedef unsigned Type; | 61 struct UnsignedIntegerTrait<int> { |
| 62 typedef unsigned Type; |
| 57 }; | 63 }; |
| 58 template<> struct UnsignedIntegerTrait<long> { | 64 template <> |
| 59 typedef unsigned long Type; | 65 struct UnsignedIntegerTrait<long> { |
| 66 typedef unsigned long Type; |
| 60 }; | 67 }; |
| 61 template<> struct UnsignedIntegerTrait<long long> { | 68 template <> |
| 62 typedef unsigned long long Type; | 69 struct UnsignedIntegerTrait<long long> { |
| 70 typedef unsigned long long Type; |
| 63 }; | 71 }; |
| 64 | 72 |
| 65 template<typename T, typename UnsignedIntegerType, PositiveOrNegativeNumber Numb
erType> | 73 template <typename T, typename UnsignedIntegerType, PositiveOrNegativeNumber Num
berType> |
| 66 static typename ConversionTrait<T>::ReturnType numberToStringImpl(UnsignedIntege
rType number, typename ConversionTrait<T>::AdditionalArgumentType* additionalArg
ument) | 74 static typename ConversionTrait<T>::ReturnType numberToStringImpl(UnsignedIntege
rType number, typename ConversionTrait<T>::AdditionalArgumentType* additionalArg
ument) { |
| 67 { | 75 LChar buf[sizeof(UnsignedIntegerType) * 3 + 1]; |
| 68 LChar buf[sizeof(UnsignedIntegerType) * 3 + 1]; | 76 LChar* end = buf + WTF_ARRAY_LENGTH(buf); |
| 69 LChar* end = buf + WTF_ARRAY_LENGTH(buf); | 77 LChar* p = end; |
| 70 LChar* p = end; | |
| 71 | 78 |
| 72 do { | 79 do { |
| 73 *--p = static_cast<LChar>((number % 10) + '0'); | 80 *--p = static_cast<LChar>((number % 10) + '0'); |
| 74 number /= 10; | 81 number /= 10; |
| 75 } while (number); | 82 } while (number); |
| 76 | 83 |
| 77 if (NumberType == NegativeNumber) | 84 if (NumberType == NegativeNumber) |
| 78 *--p = '-'; | 85 *--p = '-'; |
| 79 | 86 |
| 80 return ConversionTrait<T>::flush(p, static_cast<unsigned>(end - p), addition
alArgument); | 87 return ConversionTrait<T>::flush(p, static_cast<unsigned>(end - p), additional
Argument); |
| 81 } | 88 } |
| 82 | 89 |
| 83 template<typename T, typename SignedIntegerType> | 90 template <typename T, typename SignedIntegerType> |
| 84 inline typename ConversionTrait<T>::ReturnType numberToStringSigned(SignedIntege
rType number, typename ConversionTrait<T>::AdditionalArgumentType* additionalArg
ument = 0) | 91 inline typename ConversionTrait<T>::ReturnType numberToStringSigned(SignedIntege
rType number, typename ConversionTrait<T>::AdditionalArgumentType* additionalArg
ument = 0) { |
| 85 { | 92 if (number < 0) |
| 86 if (number < 0) | 93 return numberToStringImpl<T, typename UnsignedIntegerTrait<SignedIntegerType
>::Type, NegativeNumber>(-number, additionalArgument); |
| 87 return numberToStringImpl<T, typename UnsignedIntegerTrait<SignedInteger
Type>::Type, NegativeNumber>(-number, additionalArgument); | 94 return numberToStringImpl<T, typename UnsignedIntegerTrait<SignedIntegerType>:
:Type, PositiveNumber>(number, additionalArgument); |
| 88 return numberToStringImpl<T, typename UnsignedIntegerTrait<SignedIntegerType
>::Type, PositiveNumber>(number, additionalArgument); | |
| 89 } | 95 } |
| 90 | 96 |
| 91 template<typename T, typename UnsignedIntegerType> | 97 template <typename T, typename UnsignedIntegerType> |
| 92 inline typename ConversionTrait<T>::ReturnType numberToStringUnsigned(UnsignedIn
tegerType number, typename ConversionTrait<T>::AdditionalArgumentType* additiona
lArgument = 0) | 98 inline typename ConversionTrait<T>::ReturnType numberToStringUnsigned(UnsignedIn
tegerType number, typename ConversionTrait<T>::AdditionalArgumentType* additiona
lArgument = 0) { |
| 93 { | 99 return numberToStringImpl<T, UnsignedIntegerType, PositiveNumber>(number, addi
tionalArgument); |
| 94 return numberToStringImpl<T, UnsignedIntegerType, PositiveNumber>(number, ad
ditionalArgument); | |
| 95 } | 100 } |
| 96 | 101 |
| 97 } // namespace WTF | 102 } // namespace WTF |
| 98 | 103 |
| 99 #endif // IntegerToStringConversion_h | 104 #endif // IntegerToStringConversion_h |
| OLD | NEW |