| 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, |
| 11 * but WITHOUT ANY WARRANTY; without even the implied warranty of | 11 * but WITHOUT ANY WARRANTY; without even the implied warranty of |
| 12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | 12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
| 13 * Library General Public License for more details. | 13 * Library General Public License for more details. |
| 14 * | 14 * |
| 15 * You should have received a copy of the GNU Library General Public License | 15 * You should have received a copy of the GNU Library General Public License |
| 16 * along with this library; see the file COPYING.LIB. If not, write to | 16 * along with this library; see the file COPYING.LIB. If not, write to |
| 17 * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, | 17 * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, |
| 18 * Boston, MA 02110-1301, USA. | 18 * Boston, MA 02110-1301, USA. |
| 19 * | 19 * |
| 20 */ | 20 */ |
| 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 { PositiveNumber, NegativeNumber }; |
| 31 PositiveNumber, | 31 |
| 32 NegativeNumber | 32 template <typename T> |
| 33 struct ConversionTrait; |
| 34 |
| 35 template <> |
| 36 struct ConversionTrait<String> { |
| 37 typedef PassRefPtr<StringImpl> ReturnType; |
| 38 typedef void AdditionalArgumentType; |
| 39 static inline ReturnType flush(LChar* characters, unsigned length, void*) { |
| 40 return StringImpl::create(characters, length); |
| 41 } |
| 42 }; |
| 43 template <> |
| 44 struct ConversionTrait<StringBuilder> { |
| 45 typedef void ReturnType; |
| 46 typedef StringBuilder AdditionalArgumentType; |
| 47 static inline ReturnType flush(LChar* characters, |
| 48 unsigned length, |
| 49 StringBuilder* stringBuilder) { |
| 50 stringBuilder->append(characters, length); |
| 51 } |
| 52 }; |
| 53 template <> |
| 54 struct ConversionTrait<AtomicString> { |
| 55 typedef AtomicString ReturnType; |
| 56 typedef void AdditionalArgumentType; |
| 57 static inline ReturnType flush(LChar* characters, unsigned length, void*) { |
| 58 return AtomicString(characters, length); |
| 59 } |
| 33 }; | 60 }; |
| 34 | 61 |
| 35 template<typename T> struct ConversionTrait; | 62 template <typename T> |
| 63 struct UnsignedIntegerTrait; |
| 36 | 64 |
| 37 template<> struct ConversionTrait<String> { | 65 template <> |
| 38 typedef PassRefPtr<StringImpl> ReturnType; | 66 struct UnsignedIntegerTrait<int> { |
| 39 typedef void AdditionalArgumentType; | 67 typedef unsigned Type; |
| 40 static inline ReturnType flush(LChar* characters, unsigned length, void*) {
return StringImpl::create(characters, length); } | |
| 41 }; | 68 }; |
| 42 template<> struct ConversionTrait<StringBuilder> { | 69 template <> |
| 43 typedef void ReturnType; | 70 struct UnsignedIntegerTrait<long> { |
| 44 typedef StringBuilder AdditionalArgumentType; | 71 typedef unsigned long Type; |
| 45 static inline ReturnType flush(LChar* characters, unsigned length, StringBui
lder* stringBuilder) { stringBuilder->append(characters, length); } | |
| 46 }; | 72 }; |
| 47 template<> struct ConversionTrait<AtomicString> { | 73 template <> |
| 48 typedef AtomicString ReturnType; | 74 struct UnsignedIntegerTrait<long long> { |
| 49 typedef void AdditionalArgumentType; | 75 typedef unsigned long long Type; |
| 50 static inline ReturnType flush(LChar* characters, unsigned length, void*) {
return AtomicString(characters, length); } | |
| 51 }; | 76 }; |
| 52 | 77 |
| 53 template<typename T> struct UnsignedIntegerTrait; | 78 template <typename T, |
| 79 typename UnsignedIntegerType, |
| 80 PositiveOrNegativeNumber NumberType> |
| 81 static typename ConversionTrait<T>::ReturnType numberToStringImpl( |
| 82 UnsignedIntegerType number, |
| 83 typename ConversionTrait<T>::AdditionalArgumentType* additionalArgument) { |
| 84 LChar buf[sizeof(UnsignedIntegerType) * 3 + 1]; |
| 85 LChar* end = buf + WTF_ARRAY_LENGTH(buf); |
| 86 LChar* p = end; |
| 54 | 87 |
| 55 template<> struct UnsignedIntegerTrait<int> { | 88 do { |
| 56 typedef unsigned Type; | 89 *--p = static_cast<LChar>((number % 10) + '0'); |
| 57 }; | 90 number /= 10; |
| 58 template<> struct UnsignedIntegerTrait<long> { | 91 } while (number); |
| 59 typedef unsigned long Type; | |
| 60 }; | |
| 61 template<> struct UnsignedIntegerTrait<long long> { | |
| 62 typedef unsigned long long Type; | |
| 63 }; | |
| 64 | 92 |
| 65 template<typename T, typename UnsignedIntegerType, PositiveOrNegativeNumber Numb
erType> | 93 if (NumberType == NegativeNumber) |
| 66 static typename ConversionTrait<T>::ReturnType numberToStringImpl(UnsignedIntege
rType number, typename ConversionTrait<T>::AdditionalArgumentType* additionalArg
ument) | 94 *--p = '-'; |
| 67 { | |
| 68 LChar buf[sizeof(UnsignedIntegerType) * 3 + 1]; | |
| 69 LChar* end = buf + WTF_ARRAY_LENGTH(buf); | |
| 70 LChar* p = end; | |
| 71 | 95 |
| 72 do { | 96 return ConversionTrait<T>::flush(p, static_cast<unsigned>(end - p), |
| 73 *--p = static_cast<LChar>((number % 10) + '0'); | 97 additionalArgument); |
| 74 number /= 10; | |
| 75 } while (number); | |
| 76 | |
| 77 if (NumberType == NegativeNumber) | |
| 78 *--p = '-'; | |
| 79 | |
| 80 return ConversionTrait<T>::flush(p, static_cast<unsigned>(end - p), addition
alArgument); | |
| 81 } | 98 } |
| 82 | 99 |
| 83 template<typename T, typename SignedIntegerType> | 100 template <typename T, typename SignedIntegerType> |
| 84 inline typename ConversionTrait<T>::ReturnType numberToStringSigned(SignedIntege
rType number, typename ConversionTrait<T>::AdditionalArgumentType* additionalArg
ument = 0) | 101 inline typename ConversionTrait<T>::ReturnType numberToStringSigned( |
| 85 { | 102 SignedIntegerType number, |
| 86 if (number < 0) | 103 typename ConversionTrait<T>::AdditionalArgumentType* additionalArgument = |
| 87 return numberToStringImpl<T, typename UnsignedIntegerTrait<SignedInteger
Type>::Type, NegativeNumber>(-number, additionalArgument); | 104 0) { |
| 88 return numberToStringImpl<T, typename UnsignedIntegerTrait<SignedIntegerType
>::Type, PositiveNumber>(number, additionalArgument); | 105 if (number < 0) |
| 106 return numberToStringImpl< |
| 107 T, typename UnsignedIntegerTrait<SignedIntegerType>::Type, |
| 108 NegativeNumber>(-number, additionalArgument); |
| 109 return numberToStringImpl< |
| 110 T, typename UnsignedIntegerTrait<SignedIntegerType>::Type, |
| 111 PositiveNumber>(number, additionalArgument); |
| 89 } | 112 } |
| 90 | 113 |
| 91 template<typename T, typename UnsignedIntegerType> | 114 template <typename T, typename UnsignedIntegerType> |
| 92 inline typename ConversionTrait<T>::ReturnType numberToStringUnsigned(UnsignedIn
tegerType number, typename ConversionTrait<T>::AdditionalArgumentType* additiona
lArgument = 0) | 115 inline typename ConversionTrait<T>::ReturnType numberToStringUnsigned( |
| 93 { | 116 UnsignedIntegerType number, |
| 94 return numberToStringImpl<T, UnsignedIntegerType, PositiveNumber>(number, ad
ditionalArgument); | 117 typename ConversionTrait<T>::AdditionalArgumentType* additionalArgument = |
| 118 0) { |
| 119 return numberToStringImpl<T, UnsignedIntegerType, PositiveNumber>( |
| 120 number, additionalArgument); |
| 95 } | 121 } |
| 96 | 122 |
| 97 } // namespace WTF | 123 } // namespace WTF |
| 98 | 124 |
| 99 #endif // IntegerToStringConversion_h | 125 #endif // IntegerToStringConversion_h |
| OLD | NEW |