1 // Copyright 2012 The Chromium Authors
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #include "base/strings/string_number_conversions.h"
6
7 #include <iterator>
8 #include <string>
9
10 #include "base/containers/span.h"
11 #include "base/logging.h"
12 #include "base/strings/string_number_conversions_internal.h"
13 #include "base/strings/string_piece.h"
14
15 namespace base {
16
NumberToString(int value)17 std::string NumberToString(int value) {
18 return internal::IntToStringT<std::string>(value);
19 }
20
NumberToString16(int value)21 std::u16string NumberToString16(int value) {
22 return internal::IntToStringT<std::u16string>(value);
23 }
24
NumberToString(unsigned value)25 std::string NumberToString(unsigned value) {
26 return internal::IntToStringT<std::string>(value);
27 }
28
NumberToString16(unsigned value)29 std::u16string NumberToString16(unsigned value) {
30 return internal::IntToStringT<std::u16string>(value);
31 }
32
NumberToString(long value)33 std::string NumberToString(long value) {
34 return internal::IntToStringT<std::string>(value);
35 }
36
NumberToString16(long value)37 std::u16string NumberToString16(long value) {
38 return internal::IntToStringT<std::u16string>(value);
39 }
40
NumberToString(unsigned long value)41 std::string NumberToString(unsigned long value) {
42 return internal::IntToStringT<std::string>(value);
43 }
44
NumberToString16(unsigned long value)45 std::u16string NumberToString16(unsigned long value) {
46 return internal::IntToStringT<std::u16string>(value);
47 }
48
NumberToString(long long value)49 std::string NumberToString(long long value) {
50 return internal::IntToStringT<std::string>(value);
51 }
52
NumberToString16(long long value)53 std::u16string NumberToString16(long long value) {
54 return internal::IntToStringT<std::u16string>(value);
55 }
56
NumberToString(unsigned long long value)57 std::string NumberToString(unsigned long long value) {
58 return internal::IntToStringT<std::string>(value);
59 }
60
NumberToString16(unsigned long long value)61 std::u16string NumberToString16(unsigned long long value) {
62 return internal::IntToStringT<std::u16string>(value);
63 }
64
NumberToString(double value)65 std::string NumberToString(double value) {
66 return internal::DoubleToStringT<std::string>(value);
67 }
68
NumberToString16(double value)69 std::u16string NumberToString16(double value) {
70 return internal::DoubleToStringT<std::u16string>(value);
71 }
72
StringToInt(StringPiece input,int * output)73 bool StringToInt(StringPiece input, int* output) {
74 return internal::StringToIntImpl(input, *output);
75 }
76
StringToInt(StringPiece16 input,int * output)77 bool StringToInt(StringPiece16 input, int* output) {
78 return internal::StringToIntImpl(input, *output);
79 }
80
StringToUint(StringPiece input,unsigned * output)81 bool StringToUint(StringPiece input, unsigned* output) {
82 return internal::StringToIntImpl(input, *output);
83 }
84
StringToUint(StringPiece16 input,unsigned * output)85 bool StringToUint(StringPiece16 input, unsigned* output) {
86 return internal::StringToIntImpl(input, *output);
87 }
88
StringToInt64(StringPiece input,int64_t * output)89 bool StringToInt64(StringPiece input, int64_t* output) {
90 return internal::StringToIntImpl(input, *output);
91 }
92
StringToInt64(StringPiece16 input,int64_t * output)93 bool StringToInt64(StringPiece16 input, int64_t* output) {
94 return internal::StringToIntImpl(input, *output);
95 }
96
StringToUint64(StringPiece input,uint64_t * output)97 bool StringToUint64(StringPiece input, uint64_t* output) {
98 return internal::StringToIntImpl(input, *output);
99 }
100
StringToUint64(StringPiece16 input,uint64_t * output)101 bool StringToUint64(StringPiece16 input, uint64_t* output) {
102 return internal::StringToIntImpl(input, *output);
103 }
104
StringToSizeT(StringPiece input,size_t * output)105 bool StringToSizeT(StringPiece input, size_t* output) {
106 return internal::StringToIntImpl(input, *output);
107 }
108
StringToSizeT(StringPiece16 input,size_t * output)109 bool StringToSizeT(StringPiece16 input, size_t* output) {
110 return internal::StringToIntImpl(input, *output);
111 }
112
StringToDouble(StringPiece input,double * output)113 bool StringToDouble(StringPiece input, double* output) {
114 return internal::StringToDoubleImpl(input, input.data(), *output);
115 }
116
StringToDouble(StringPiece16 input,double * output)117 bool StringToDouble(StringPiece16 input, double* output) {
118 return internal::StringToDoubleImpl(
119 input, reinterpret_cast<const uint16_t*>(input.data()), *output);
120 }
121
HexEncode(const void * bytes,size_t size)122 std::string HexEncode(const void* bytes, size_t size) {
123 static const char kHexChars[] = "0123456789ABCDEF";
124
125 // Each input byte creates two output hex characters.
126 std::string ret(size * 2, '\0');
127
128 for (size_t i = 0; i < size; ++i) {
129 char b = reinterpret_cast<const char*>(bytes)[i];
130 ret[(i * 2)] = kHexChars[(b >> 4) & 0xf];
131 ret[(i * 2) + 1] = kHexChars[b & 0xf];
132 }
133 return ret;
134 }
135
HexEncode(base::span<const uint8_t> bytes)136 std::string HexEncode(base::span<const uint8_t> bytes) {
137 return HexEncode(bytes.data(), bytes.size());
138 }
139
HexStringToInt(StringPiece input,int * output)140 bool HexStringToInt(StringPiece input, int* output) {
141 return internal::HexStringToIntImpl(input, *output);
142 }
143
HexStringToUInt(StringPiece input,uint32_t * output)144 bool HexStringToUInt(StringPiece input, uint32_t* output) {
145 return internal::HexStringToIntImpl(input, *output);
146 }
147
HexStringToInt64(StringPiece input,int64_t * output)148 bool HexStringToInt64(StringPiece input, int64_t* output) {
149 return internal::HexStringToIntImpl(input, *output);
150 }
151
HexStringToUInt64(StringPiece input,uint64_t * output)152 bool HexStringToUInt64(StringPiece input, uint64_t* output) {
153 return internal::HexStringToIntImpl(input, *output);
154 }
155
HexStringToBytes(StringPiece input,std::vector<uint8_t> * output)156 bool HexStringToBytes(StringPiece input, std::vector<uint8_t>* output) {
157 DCHECK(output->empty());
158 return internal::HexStringToByteContainer<uint8_t>(
159 input, std::back_inserter(*output));
160 }
161
HexStringToString(StringPiece input,std::string * output)162 bool HexStringToString(StringPiece input, std::string* output) {
163 DCHECK(output->empty());
164 return internal::HexStringToByteContainer<char>(input,
165 std::back_inserter(*output));
166 }
167
HexStringToSpan(StringPiece input,base::span<uint8_t> output)168 bool HexStringToSpan(StringPiece input, base::span<uint8_t> output) {
169 if (input.size() / 2 != output.size())
170 return false;
171
172 return internal::HexStringToByteContainer<uint8_t>(input, output.begin());
173 }
174
175 } // namespace base
176