1*c33452fbSAndroid Build Coastguard Worker /*
2*c33452fbSAndroid Build Coastguard Worker * Copyright (c) 2011-2014, Intel Corporation
3*c33452fbSAndroid Build Coastguard Worker * All rights reserved.
4*c33452fbSAndroid Build Coastguard Worker *
5*c33452fbSAndroid Build Coastguard Worker * Redistribution and use in source and binary forms, with or without modification,
6*c33452fbSAndroid Build Coastguard Worker * are permitted provided that the following conditions are met:
7*c33452fbSAndroid Build Coastguard Worker *
8*c33452fbSAndroid Build Coastguard Worker * 1. Redistributions of source code must retain the above copyright notice, this
9*c33452fbSAndroid Build Coastguard Worker * list of conditions and the following disclaimer.
10*c33452fbSAndroid Build Coastguard Worker *
11*c33452fbSAndroid Build Coastguard Worker * 2. Redistributions in binary form must reproduce the above copyright notice,
12*c33452fbSAndroid Build Coastguard Worker * this list of conditions and the following disclaimer in the documentation and/or
13*c33452fbSAndroid Build Coastguard Worker * other materials provided with the distribution.
14*c33452fbSAndroid Build Coastguard Worker *
15*c33452fbSAndroid Build Coastguard Worker * 3. Neither the name of the copyright holder nor the names of its contributors
16*c33452fbSAndroid Build Coastguard Worker * may be used to endorse or promote products derived from this software without
17*c33452fbSAndroid Build Coastguard Worker * specific prior written permission.
18*c33452fbSAndroid Build Coastguard Worker *
19*c33452fbSAndroid Build Coastguard Worker * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
20*c33452fbSAndroid Build Coastguard Worker * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
21*c33452fbSAndroid Build Coastguard Worker * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
22*c33452fbSAndroid Build Coastguard Worker * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR
23*c33452fbSAndroid Build Coastguard Worker * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
24*c33452fbSAndroid Build Coastguard Worker * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
25*c33452fbSAndroid Build Coastguard Worker * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
26*c33452fbSAndroid Build Coastguard Worker * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
27*c33452fbSAndroid Build Coastguard Worker * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
28*c33452fbSAndroid Build Coastguard Worker * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
29*c33452fbSAndroid Build Coastguard Worker */
30*c33452fbSAndroid Build Coastguard Worker
31*c33452fbSAndroid Build Coastguard Worker #pragma once
32*c33452fbSAndroid Build Coastguard Worker
33*c33452fbSAndroid Build Coastguard Worker #include <limits>
34*c33452fbSAndroid Build Coastguard Worker #include <sstream>
35*c33452fbSAndroid Build Coastguard Worker #include <string>
36*c33452fbSAndroid Build Coastguard Worker #include <stdint.h>
37*c33452fbSAndroid Build Coastguard Worker #include <cmath>
38*c33452fbSAndroid Build Coastguard Worker #include <type_traits>
39*c33452fbSAndroid Build Coastguard Worker
40*c33452fbSAndroid Build Coastguard Worker /* details namespace is here to hide implementation details to header end user. It
41*c33452fbSAndroid Build Coastguard Worker * is NOT intended to be used outside. */
42*c33452fbSAndroid Build Coastguard Worker namespace details
43*c33452fbSAndroid Build Coastguard Worker {
44*c33452fbSAndroid Build Coastguard Worker
45*c33452fbSAndroid Build Coastguard Worker /* List of allowed types for conversion */
46*c33452fbSAndroid Build Coastguard Worker template <typename T>
47*c33452fbSAndroid Build Coastguard Worker struct ConvertionAllowed : std::false_type
48*c33452fbSAndroid Build Coastguard Worker {
49*c33452fbSAndroid Build Coastguard Worker };
50*c33452fbSAndroid Build Coastguard Worker template <>
51*c33452fbSAndroid Build Coastguard Worker struct ConvertionAllowed<bool> : std::true_type
52*c33452fbSAndroid Build Coastguard Worker {
53*c33452fbSAndroid Build Coastguard Worker };
54*c33452fbSAndroid Build Coastguard Worker template <>
55*c33452fbSAndroid Build Coastguard Worker struct ConvertionAllowed<long long> : std::true_type
56*c33452fbSAndroid Build Coastguard Worker {
57*c33452fbSAndroid Build Coastguard Worker };
58*c33452fbSAndroid Build Coastguard Worker template <>
59*c33452fbSAndroid Build Coastguard Worker struct ConvertionAllowed<unsigned long long> : std::true_type
60*c33452fbSAndroid Build Coastguard Worker {
61*c33452fbSAndroid Build Coastguard Worker };
62*c33452fbSAndroid Build Coastguard Worker template <>
63*c33452fbSAndroid Build Coastguard Worker struct ConvertionAllowed<long> : std::true_type
64*c33452fbSAndroid Build Coastguard Worker {
65*c33452fbSAndroid Build Coastguard Worker };
66*c33452fbSAndroid Build Coastguard Worker template <>
67*c33452fbSAndroid Build Coastguard Worker struct ConvertionAllowed<unsigned long> : std::true_type
68*c33452fbSAndroid Build Coastguard Worker {
69*c33452fbSAndroid Build Coastguard Worker };
70*c33452fbSAndroid Build Coastguard Worker template <>
71*c33452fbSAndroid Build Coastguard Worker struct ConvertionAllowed<int> : std::true_type
72*c33452fbSAndroid Build Coastguard Worker {
73*c33452fbSAndroid Build Coastguard Worker };
74*c33452fbSAndroid Build Coastguard Worker template <>
75*c33452fbSAndroid Build Coastguard Worker struct ConvertionAllowed<unsigned int> : std::true_type
76*c33452fbSAndroid Build Coastguard Worker {
77*c33452fbSAndroid Build Coastguard Worker };
78*c33452fbSAndroid Build Coastguard Worker template <>
79*c33452fbSAndroid Build Coastguard Worker struct ConvertionAllowed<short> : std::true_type
80*c33452fbSAndroid Build Coastguard Worker {
81*c33452fbSAndroid Build Coastguard Worker };
82*c33452fbSAndroid Build Coastguard Worker template <>
83*c33452fbSAndroid Build Coastguard Worker struct ConvertionAllowed<unsigned short> : std::true_type
84*c33452fbSAndroid Build Coastguard Worker {
85*c33452fbSAndroid Build Coastguard Worker };
86*c33452fbSAndroid Build Coastguard Worker template <>
87*c33452fbSAndroid Build Coastguard Worker struct ConvertionAllowed<unsigned char> : std::true_type
88*c33452fbSAndroid Build Coastguard Worker {
89*c33452fbSAndroid Build Coastguard Worker };
90*c33452fbSAndroid Build Coastguard Worker template <>
91*c33452fbSAndroid Build Coastguard Worker struct ConvertionAllowed<signed char> : std::true_type
92*c33452fbSAndroid Build Coastguard Worker {
93*c33452fbSAndroid Build Coastguard Worker };
94*c33452fbSAndroid Build Coastguard Worker template <>
95*c33452fbSAndroid Build Coastguard Worker struct ConvertionAllowed<float> : std::true_type
96*c33452fbSAndroid Build Coastguard Worker {
97*c33452fbSAndroid Build Coastguard Worker };
98*c33452fbSAndroid Build Coastguard Worker template <>
99*c33452fbSAndroid Build Coastguard Worker struct ConvertionAllowed<double> : std::true_type
100*c33452fbSAndroid Build Coastguard Worker {
101*c33452fbSAndroid Build Coastguard Worker };
102*c33452fbSAndroid Build Coastguard Worker
103*c33452fbSAndroid Build Coastguard Worker /* Allow chars and unsigned chars to be converted via integers */
104*c33452fbSAndroid Build Coastguard Worker template <typename T, typename Via>
105*c33452fbSAndroid Build Coastguard Worker struct ConvertionAllowedVia : std::false_type
106*c33452fbSAndroid Build Coastguard Worker {
107*c33452fbSAndroid Build Coastguard Worker };
108*c33452fbSAndroid Build Coastguard Worker template <>
109*c33452fbSAndroid Build Coastguard Worker struct ConvertionAllowedVia<unsigned char, unsigned int> : std::true_type
110*c33452fbSAndroid Build Coastguard Worker {
111*c33452fbSAndroid Build Coastguard Worker };
112*c33452fbSAndroid Build Coastguard Worker template <>
113*c33452fbSAndroid Build Coastguard Worker struct ConvertionAllowedVia<signed char, int> : std::true_type
114*c33452fbSAndroid Build Coastguard Worker {
115*c33452fbSAndroid Build Coastguard Worker };
116*c33452fbSAndroid Build Coastguard Worker
117*c33452fbSAndroid Build Coastguard Worker template <typename T>
convertTo(const std::string & str,T & result)118*c33452fbSAndroid Build Coastguard Worker static inline bool convertTo(const std::string &str, T &result)
119*c33452fbSAndroid Build Coastguard Worker {
120*c33452fbSAndroid Build Coastguard Worker /* Check that conversion to that type is allowed.
121*c33452fbSAndroid Build Coastguard Worker * If this fails, this means that this template was not intended to be used
122*c33452fbSAndroid Build Coastguard Worker * with this type, thus that the result is undefined. */
123*c33452fbSAndroid Build Coastguard Worker static_assert(ConvertionAllowed<T>::value, "convertTo does not support this conversion");
124*c33452fbSAndroid Build Coastguard Worker
125*c33452fbSAndroid Build Coastguard Worker if (str.find_first_of(std::string("\r\n\t\v ")) != std::string::npos) {
126*c33452fbSAndroid Build Coastguard Worker return false;
127*c33452fbSAndroid Build Coastguard Worker }
128*c33452fbSAndroid Build Coastguard Worker
129*c33452fbSAndroid Build Coastguard Worker /* Check for a '-' in string. If type is unsigned and a - is found, the
130*c33452fbSAndroid Build Coastguard Worker * parsing fails. This is made necessary because "-1" is read as 65535 for
131*c33452fbSAndroid Build Coastguard Worker * uint16_t, for example */
132*c33452fbSAndroid Build Coastguard Worker if (str.find("-") != std::string::npos && !std::numeric_limits<T>::is_signed) {
133*c33452fbSAndroid Build Coastguard Worker return false;
134*c33452fbSAndroid Build Coastguard Worker }
135*c33452fbSAndroid Build Coastguard Worker
136*c33452fbSAndroid Build Coastguard Worker std::stringstream ss(str);
137*c33452fbSAndroid Build Coastguard Worker
138*c33452fbSAndroid Build Coastguard Worker /* Sadly, the stream conversion does not handle hexadecimal format, thus
139*c33452fbSAndroid Build Coastguard Worker * check is done manually */
140*c33452fbSAndroid Build Coastguard Worker if (str.substr(0, 2) == "0x") {
141*c33452fbSAndroid Build Coastguard Worker if (std::numeric_limits<T>::is_integer) {
142*c33452fbSAndroid Build Coastguard Worker ss >> std::hex >> result;
143*c33452fbSAndroid Build Coastguard Worker } else {
144*c33452fbSAndroid Build Coastguard Worker /* Conversion undefined for non integers */
145*c33452fbSAndroid Build Coastguard Worker return false;
146*c33452fbSAndroid Build Coastguard Worker }
147*c33452fbSAndroid Build Coastguard Worker } else {
148*c33452fbSAndroid Build Coastguard Worker ss >> result;
149*c33452fbSAndroid Build Coastguard Worker }
150*c33452fbSAndroid Build Coastguard Worker
151*c33452fbSAndroid Build Coastguard Worker return ss.eof() && !ss.fail() && !ss.bad();
152*c33452fbSAndroid Build Coastguard Worker }
153*c33452fbSAndroid Build Coastguard Worker
154*c33452fbSAndroid Build Coastguard Worker template <typename T, typename Via>
convertToVia(const std::string & str,T & result)155*c33452fbSAndroid Build Coastguard Worker static inline bool convertToVia(const std::string &str, T &result)
156*c33452fbSAndroid Build Coastguard Worker {
157*c33452fbSAndroid Build Coastguard Worker /* Check that conversion to that type is allowed.
158*c33452fbSAndroid Build Coastguard Worker * If this fails, this means that this template was not intended to be used
159*c33452fbSAndroid Build Coastguard Worker * with this type, thus that the result is undefined. */
160*c33452fbSAndroid Build Coastguard Worker static_assert(ConvertionAllowedVia<T, Via>::value,
161*c33452fbSAndroid Build Coastguard Worker "convertToVia does not support this conversion");
162*c33452fbSAndroid Build Coastguard Worker
163*c33452fbSAndroid Build Coastguard Worker /* We want to override the behaviour of convertTo<T> with that of
164*c33452fbSAndroid Build Coastguard Worker * convertTo<Via> and then safely cast the result into a T. */
165*c33452fbSAndroid Build Coastguard Worker Via res;
166*c33452fbSAndroid Build Coastguard Worker
167*c33452fbSAndroid Build Coastguard Worker if (!convertTo<Via>(str, res)) {
168*c33452fbSAndroid Build Coastguard Worker return false;
169*c33452fbSAndroid Build Coastguard Worker }
170*c33452fbSAndroid Build Coastguard Worker
171*c33452fbSAndroid Build Coastguard Worker if ((res > std::numeric_limits<T>::max()) or (res < std::numeric_limits<T>::min())) {
172*c33452fbSAndroid Build Coastguard Worker return false;
173*c33452fbSAndroid Build Coastguard Worker }
174*c33452fbSAndroid Build Coastguard Worker
175*c33452fbSAndroid Build Coastguard Worker result = static_cast<T>(res);
176*c33452fbSAndroid Build Coastguard Worker return true;
177*c33452fbSAndroid Build Coastguard Worker }
178*c33452fbSAndroid Build Coastguard Worker } // namespace details
179*c33452fbSAndroid Build Coastguard Worker
180*c33452fbSAndroid Build Coastguard Worker /**
181*c33452fbSAndroid Build Coastguard Worker * Convert a string to a given type.
182*c33452fbSAndroid Build Coastguard Worker *
183*c33452fbSAndroid Build Coastguard Worker * This template function read the value of the type T in the given string.
184*c33452fbSAndroid Build Coastguard Worker * The function does not allow to have white spaces around the value to parse
185*c33452fbSAndroid Build Coastguard Worker * and tries to parse the whole string, which means that if some bytes were not
186*c33452fbSAndroid Build Coastguard Worker * read in the string, the function fails.
187*c33452fbSAndroid Build Coastguard Worker * Hexadecimal representation (ie numbers starting with 0x) is supported only
188*c33452fbSAndroid Build Coastguard Worker * for integral types conversions.
189*c33452fbSAndroid Build Coastguard Worker * Result may be modified, even in case of failure.
190*c33452fbSAndroid Build Coastguard Worker *
191*c33452fbSAndroid Build Coastguard Worker * @param[in] str the string to parse.
192*c33452fbSAndroid Build Coastguard Worker * @param[out] result reference to object where to store the result.
193*c33452fbSAndroid Build Coastguard Worker *
194*c33452fbSAndroid Build Coastguard Worker * @return true if conversion was successful, false otherwise.
195*c33452fbSAndroid Build Coastguard Worker */
196*c33452fbSAndroid Build Coastguard Worker template <typename T>
convertTo(const std::string & str,T & result)197*c33452fbSAndroid Build Coastguard Worker static inline bool convertTo(const std::string &str, T &result)
198*c33452fbSAndroid Build Coastguard Worker {
199*c33452fbSAndroid Build Coastguard Worker return details::convertTo<T>(str, result);
200*c33452fbSAndroid Build Coastguard Worker }
201*c33452fbSAndroid Build Coastguard Worker
202*c33452fbSAndroid Build Coastguard Worker /** Specialization for unsigned char of convertTo template function.
203*c33452fbSAndroid Build Coastguard Worker *
204*c33452fbSAndroid Build Coastguard Worker * This function follows the same paradigm than it's generic version.
205*c33452fbSAndroid Build Coastguard Worker *
206*c33452fbSAndroid Build Coastguard Worker * The generic version was converting char as it was a character
207*c33452fbSAndroid Build Coastguard Worker * (unsigned char is an alias to unsigned char on most compiler).
208*c33452fbSAndroid Build Coastguard Worker * Thus converting "1" would return 49 ie '1'.
209*c33452fbSAndroid Build Coastguard Worker * As convertTo is thought as an _numerical_ convertion tool
210*c33452fbSAndroid Build Coastguard Worker * (contrary to boost::lexical_cast for example),
211*c33452fbSAndroid Build Coastguard Worker * forbid considering the input as a character and consider unsigned char
212*c33452fbSAndroid Build Coastguard Worker * (aka unsigned char) as a number exclusively.
213*c33452fbSAndroid Build Coastguard Worker *
214*c33452fbSAndroid Build Coastguard Worker * @param[in] str the string to parse.
215*c33452fbSAndroid Build Coastguard Worker * @param[out] result reference to object where to store the result.
216*c33452fbSAndroid Build Coastguard Worker *
217*c33452fbSAndroid Build Coastguard Worker * @return true if conversion was successful, false otherwise.
218*c33452fbSAndroid Build Coastguard Worker */
219*c33452fbSAndroid Build Coastguard Worker template <>
convertTo(const std::string & str,unsigned char & result)220*c33452fbSAndroid Build Coastguard Worker inline bool convertTo<unsigned char>(const std::string &str, unsigned char &result)
221*c33452fbSAndroid Build Coastguard Worker {
222*c33452fbSAndroid Build Coastguard Worker return details::convertToVia<unsigned char, unsigned int>(str, result);
223*c33452fbSAndroid Build Coastguard Worker }
224*c33452fbSAndroid Build Coastguard Worker
225*c33452fbSAndroid Build Coastguard Worker /** Specialization for signed char of convertTo template function.
226*c33452fbSAndroid Build Coastguard Worker *
227*c33452fbSAndroid Build Coastguard Worker * @see convertTo<unsigned char>
228*c33452fbSAndroid Build Coastguard Worker */
229*c33452fbSAndroid Build Coastguard Worker template <>
convertTo(const std::string & str,signed char & result)230*c33452fbSAndroid Build Coastguard Worker inline bool convertTo<signed char>(const std::string &str, signed char &result)
231*c33452fbSAndroid Build Coastguard Worker {
232*c33452fbSAndroid Build Coastguard Worker return details::convertToVia<signed char, int>(str, result);
233*c33452fbSAndroid Build Coastguard Worker }
234*c33452fbSAndroid Build Coastguard Worker /**
235*c33452fbSAndroid Build Coastguard Worker * Specialization for float of convertTo template function.
236*c33452fbSAndroid Build Coastguard Worker *
237*c33452fbSAndroid Build Coastguard Worker * This function follows the same paradigm than it's generic version and is
238*c33452fbSAndroid Build Coastguard Worker * based on it but makes furthers checks on the returned value.
239*c33452fbSAndroid Build Coastguard Worker *
240*c33452fbSAndroid Build Coastguard Worker * The specific implementation is made necessary because the stlport conversion
241*c33452fbSAndroid Build Coastguard Worker * from string to float behaves differently than GNU STL: overflow produce
242*c33452fbSAndroid Build Coastguard Worker * +/-Infinity rather than an error.
243*c33452fbSAndroid Build Coastguard Worker *
244*c33452fbSAndroid Build Coastguard Worker * @param[in] str the string to parse.
245*c33452fbSAndroid Build Coastguard Worker * @param[out] result reference to object where to store the result.
246*c33452fbSAndroid Build Coastguard Worker *
247*c33452fbSAndroid Build Coastguard Worker * @return true if conversion was successful, false otherwise.
248*c33452fbSAndroid Build Coastguard Worker */
249*c33452fbSAndroid Build Coastguard Worker template <>
convertTo(const std::string & str,float & result)250*c33452fbSAndroid Build Coastguard Worker inline bool convertTo<float>(const std::string &str, float &result)
251*c33452fbSAndroid Build Coastguard Worker {
252*c33452fbSAndroid Build Coastguard Worker if (!details::convertTo(str, result)) {
253*c33452fbSAndroid Build Coastguard Worker return false;
254*c33452fbSAndroid Build Coastguard Worker }
255*c33452fbSAndroid Build Coastguard Worker
256*c33452fbSAndroid Build Coastguard Worker if (!std::isfinite(result)) {
257*c33452fbSAndroid Build Coastguard Worker return false;
258*c33452fbSAndroid Build Coastguard Worker }
259*c33452fbSAndroid Build Coastguard Worker
260*c33452fbSAndroid Build Coastguard Worker return true;
261*c33452fbSAndroid Build Coastguard Worker }
262*c33452fbSAndroid Build Coastguard Worker
263*c33452fbSAndroid Build Coastguard Worker /**
264*c33452fbSAndroid Build Coastguard Worker * Specialization for double of convertTo template function.
265*c33452fbSAndroid Build Coastguard Worker *
266*c33452fbSAndroid Build Coastguard Worker * This function follows the same paradigm than it's generic version and is
267*c33452fbSAndroid Build Coastguard Worker * based on it but makes furthers checks on the returned value.
268*c33452fbSAndroid Build Coastguard Worker *
269*c33452fbSAndroid Build Coastguard Worker * The specific implementation is made necessary because the stlport conversion
270*c33452fbSAndroid Build Coastguard Worker * from string to double behaves differently than GNU STL: overflow produce
271*c33452fbSAndroid Build Coastguard Worker * +/-Infinity rather than an error.
272*c33452fbSAndroid Build Coastguard Worker *
273*c33452fbSAndroid Build Coastguard Worker * @param[in] str the string to parse.
274*c33452fbSAndroid Build Coastguard Worker * @param[out] result reference to object where to store the result.
275*c33452fbSAndroid Build Coastguard Worker *
276*c33452fbSAndroid Build Coastguard Worker * @return true if conversion was successful, false otherwise.
277*c33452fbSAndroid Build Coastguard Worker */
278*c33452fbSAndroid Build Coastguard Worker template <>
convertTo(const std::string & str,double & result)279*c33452fbSAndroid Build Coastguard Worker inline bool convertTo<double>(const std::string &str, double &result)
280*c33452fbSAndroid Build Coastguard Worker {
281*c33452fbSAndroid Build Coastguard Worker if (!details::convertTo(str, result)) {
282*c33452fbSAndroid Build Coastguard Worker return false;
283*c33452fbSAndroid Build Coastguard Worker }
284*c33452fbSAndroid Build Coastguard Worker
285*c33452fbSAndroid Build Coastguard Worker if (!std::isfinite(result)) {
286*c33452fbSAndroid Build Coastguard Worker return false;
287*c33452fbSAndroid Build Coastguard Worker }
288*c33452fbSAndroid Build Coastguard Worker
289*c33452fbSAndroid Build Coastguard Worker return true;
290*c33452fbSAndroid Build Coastguard Worker }
291*c33452fbSAndroid Build Coastguard Worker
292*c33452fbSAndroid Build Coastguard Worker /**
293*c33452fbSAndroid Build Coastguard Worker * Specialization for boolean of convertTo template function.
294*c33452fbSAndroid Build Coastguard Worker *
295*c33452fbSAndroid Build Coastguard Worker * This function follows the same paradigm than it's generic version.
296*c33452fbSAndroid Build Coastguard Worker * This function accepts to parse boolean as "0/1" or "false/true" or
297*c33452fbSAndroid Build Coastguard Worker * "FALSE/TRUE".
298*c33452fbSAndroid Build Coastguard Worker * The specific implementation is made necessary because the behaviour of
299*c33452fbSAndroid Build Coastguard Worker * string streams when parsing boolean values is not sufficient to fit our
300*c33452fbSAndroid Build Coastguard Worker * requirements. Indeed, parsing "true" will correctly parse the value, but the
301*c33452fbSAndroid Build Coastguard Worker * end of stream is not reached which makes the ss.eof() fails in the generic
302*c33452fbSAndroid Build Coastguard Worker * implementation.
303*c33452fbSAndroid Build Coastguard Worker *
304*c33452fbSAndroid Build Coastguard Worker * @param[in] str the string to parse.
305*c33452fbSAndroid Build Coastguard Worker * @param[out] result reference to object where to store the result.
306*c33452fbSAndroid Build Coastguard Worker *
307*c33452fbSAndroid Build Coastguard Worker * @return true if conversion was successful, false otherwise.
308*c33452fbSAndroid Build Coastguard Worker */
309*c33452fbSAndroid Build Coastguard Worker template <>
convertTo(const std::string & str,bool & result)310*c33452fbSAndroid Build Coastguard Worker inline bool convertTo<bool>(const std::string &str, bool &result)
311*c33452fbSAndroid Build Coastguard Worker {
312*c33452fbSAndroid Build Coastguard Worker if (str == "0" || str == "FALSE" || str == "false") {
313*c33452fbSAndroid Build Coastguard Worker result = false;
314*c33452fbSAndroid Build Coastguard Worker return true;
315*c33452fbSAndroid Build Coastguard Worker }
316*c33452fbSAndroid Build Coastguard Worker
317*c33452fbSAndroid Build Coastguard Worker if (str == "1" || str == "TRUE" || str == "true") {
318*c33452fbSAndroid Build Coastguard Worker result = true;
319*c33452fbSAndroid Build Coastguard Worker return true;
320*c33452fbSAndroid Build Coastguard Worker }
321*c33452fbSAndroid Build Coastguard Worker
322*c33452fbSAndroid Build Coastguard Worker return false;
323*c33452fbSAndroid Build Coastguard Worker }
324