Index: base/string_number_conversions.cc |
=================================================================== |
--- base/string_number_conversions.cc (revision 114929) |
+++ base/string_number_conversions.cc (working copy) |
@@ -292,6 +292,24 @@ |
static const int kBase = BASE; |
}; |
+typedef BaseIteratorRangeToNumberTraits<std::string::const_iterator, int, 10> |
+ IteratorRangeToIntTraits; |
+typedef BaseIteratorRangeToNumberTraits<string16::const_iterator, int, 10> |
+ WideIteratorRangeToIntTraits; |
+typedef BaseIteratorRangeToNumberTraits<std::string::const_iterator, int64, 10> |
+ IteratorRangeToInt64Traits; |
+typedef BaseIteratorRangeToNumberTraits<string16::const_iterator, int64, 10> |
+ WideIteratorRangeToInt64Traits; |
+ |
+typedef BaseIteratorRangeToNumberTraits<const char*, int, 10> |
+ CharBufferToIntTraits; |
+typedef BaseIteratorRangeToNumberTraits<const char16*, int, 10> |
+ WideCharBufferToIntTraits; |
+typedef BaseIteratorRangeToNumberTraits<const char*, int64, 10> |
+ CharBufferToInt64Traits; |
+typedef BaseIteratorRangeToNumberTraits<const char16*, int64, 10> |
+ WideCharBufferToInt64Traits; |
+ |
template<typename ITERATOR> |
class BaseHexIteratorRangeToIntTraits |
: public BaseIteratorRangeToNumberTraits<ITERATOR, int, 16> { |
@@ -302,8 +320,10 @@ |
} |
}; |
-typedef BaseHexIteratorRangeToIntTraits<StringPiece::const_iterator> |
+typedef BaseHexIteratorRangeToIntTraits<std::string::const_iterator> |
HexIteratorRangeToIntTraits; |
+typedef BaseHexIteratorRangeToIntTraits<const char*> |
+ HexCharBufferToIntTraits; |
template<typename STR> |
bool HexStringToBytesT(const STR& input, std::vector<uint8>* output) { |
@@ -322,30 +342,6 @@ |
return true; |
} |
-template <typename VALUE, int BASE> |
-class StringPieceToNumberTraits |
- : public BaseIteratorRangeToNumberTraits<StringPiece::const_iterator, |
- VALUE, |
- BASE> {}; |
- |
-template <typename VALUE> |
-bool StringToIntImpl(const StringPiece& input, VALUE* output) { |
- return IteratorRangeToNumber<StringPieceToNumberTraits<VALUE, 10> >::Invoke( |
- input.begin(), input.end(), output); |
-} |
- |
-template <typename VALUE, int BASE> |
-class StringPiece16ToNumberTraits |
- : public BaseIteratorRangeToNumberTraits<StringPiece16::const_iterator, |
- VALUE, |
- BASE> {}; |
- |
-template <typename VALUE> |
-bool String16ToIntImpl(const StringPiece16& input, VALUE* output) { |
- return IteratorRangeToNumber<StringPiece16ToNumberTraits<VALUE, 10> >::Invoke( |
- input.begin(), input.end(), output); |
-} |
- |
} // namespace |
std::string IntToString(int value) { |
@@ -394,22 +390,91 @@ |
return std::string(buffer); |
} |
-bool StringToInt(const StringPiece& input, int* output) { |
- return StringToIntImpl(input, output); |
+bool StringToInt(const std::string& input, int* output) { |
+ return IteratorRangeToNumber<IteratorRangeToIntTraits>::Invoke(input.begin(), |
+ input.end(), |
+ output); |
} |
-bool StringToInt(const StringPiece16& input, int* output) { |
- return String16ToIntImpl(input, output); |
+bool StringToInt(std::string::const_iterator begin, |
+ std::string::const_iterator end, |
+ int* output) { |
+ return IteratorRangeToNumber<IteratorRangeToIntTraits>::Invoke(begin, |
+ end, |
+ output); |
} |
-bool StringToInt64(const StringPiece& input, int64* output) { |
- return StringToIntImpl(input, output); |
+#if !defined(STD_STRING_ITERATOR_IS_CHAR_POINTER) |
+bool StringToInt(const char* begin, const char* end, int* output) { |
+ return IteratorRangeToNumber<CharBufferToIntTraits>::Invoke(begin, |
+ end, |
+ output); |
} |
+#endif |
-bool StringToInt64(const StringPiece16& input, int64* output) { |
- return String16ToIntImpl(input, output); |
+bool StringToInt(const string16& input, int* output) { |
+ return IteratorRangeToNumber<WideIteratorRangeToIntTraits>::Invoke( |
+ input.begin(), input.end(), output); |
} |
+bool StringToInt(string16::const_iterator begin, |
+ string16::const_iterator end, |
+ int* output) { |
+ return IteratorRangeToNumber<WideIteratorRangeToIntTraits>::Invoke(begin, |
+ end, |
+ output); |
+} |
+ |
+#if !defined(BASE_STRING16_ITERATOR_IS_CHAR16_POINTER) |
+bool StringToInt(const char16* begin, const char16* end, int* output) { |
+ return IteratorRangeToNumber<WideCharBufferToIntTraits>::Invoke(begin, |
+ end, |
+ output); |
+} |
+#endif |
+ |
+bool StringToInt64(const std::string& input, int64* output) { |
+ return IteratorRangeToNumber<IteratorRangeToInt64Traits>::Invoke( |
+ input.begin(), input.end(), output); |
+} |
+ |
+bool StringToInt64(std::string::const_iterator begin, |
+ std::string::const_iterator end, |
+ int64* output) { |
+ return IteratorRangeToNumber<IteratorRangeToInt64Traits>::Invoke(begin, |
+ end, |
+ output); |
+} |
+ |
+#if !defined(STD_STRING_ITERATOR_IS_CHAR_POINTER) |
+bool StringToInt64(const char* begin, const char* end, int64* output) { |
+ return IteratorRangeToNumber<CharBufferToInt64Traits>::Invoke(begin, |
+ end, |
+ output); |
+} |
+#endif |
+ |
+bool StringToInt64(const string16& input, int64* output) { |
+ return IteratorRangeToNumber<WideIteratorRangeToInt64Traits>::Invoke( |
+ input.begin(), input.end(), output); |
+} |
+ |
+bool StringToInt64(string16::const_iterator begin, |
+ string16::const_iterator end, |
+ int64* output) { |
+ return IteratorRangeToNumber<WideIteratorRangeToInt64Traits>::Invoke(begin, |
+ end, |
+ output); |
+} |
+ |
+#if !defined(BASE_STRING16_ITERATOR_IS_CHAR16_POINTER) |
+bool StringToInt64(const char16* begin, const char16* end, int64* output) { |
+ return IteratorRangeToNumber<WideCharBufferToInt64Traits>::Invoke(begin, |
+ end, |
+ output); |
+} |
+#endif |
+ |
bool StringToDouble(const std::string& input, double* output) { |
errno = 0; // Thread-safe? It is on at least Mac, Linux, and Windows. |
char* endptr = NULL; |
@@ -452,11 +517,27 @@ |
return ret; |
} |
-bool HexStringToInt(const StringPiece& input, int* output) { |
+bool HexStringToInt(const std::string& input, int* output) { |
return IteratorRangeToNumber<HexIteratorRangeToIntTraits>::Invoke( |
input.begin(), input.end(), output); |
} |
+bool HexStringToInt(std::string::const_iterator begin, |
+ std::string::const_iterator end, |
+ int* output) { |
+ return IteratorRangeToNumber<HexIteratorRangeToIntTraits>::Invoke(begin, |
+ end, |
+ output); |
+} |
+ |
+#if !defined(STD_STRING_ITERATOR_IS_CHAR_POINTER) |
+bool HexStringToInt(const char* begin, const char* end, int* output) { |
+ return IteratorRangeToNumber<HexCharBufferToIntTraits>::Invoke(begin, |
+ end, |
+ output); |
+} |
+#endif |
+ |
bool HexStringToBytes(const std::string& input, std::vector<uint8>* output) { |
return HexStringToBytesT(input, output); |
} |