| 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);
 | 
|  }
 | 
| 
 |