1*c217d954SCole Faust /*
2*c217d954SCole Faust * Copyright (c) 2017-2022 Arm Limited.
3*c217d954SCole Faust *
4*c217d954SCole Faust * SPDX-License-Identifier: MIT
5*c217d954SCole Faust *
6*c217d954SCole Faust * Permission is hereby granted, free of charge, to any person obtaining a copy
7*c217d954SCole Faust * of this software and associated documentation files (the "Software"), to
8*c217d954SCole Faust * deal in the Software without restriction, including without limitation the
9*c217d954SCole Faust * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
10*c217d954SCole Faust * sell copies of the Software, and to permit persons to whom the Software is
11*c217d954SCole Faust * furnished to do so, subject to the following conditions:
12*c217d954SCole Faust *
13*c217d954SCole Faust * The above copyright notice and this permission notice shall be included in all
14*c217d954SCole Faust * copies or substantial portions of the Software.
15*c217d954SCole Faust *
16*c217d954SCole Faust * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17*c217d954SCole Faust * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18*c217d954SCole Faust * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
19*c217d954SCole Faust * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20*c217d954SCole Faust * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21*c217d954SCole Faust * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
22*c217d954SCole Faust * SOFTWARE.
23*c217d954SCole Faust */
24*c217d954SCole Faust #ifndef ARM_COMPUTE_TEST_STRINGSUPPORT
25*c217d954SCole Faust #define ARM_COMPUTE_TEST_STRINGSUPPORT
26*c217d954SCole Faust
27*c217d954SCole Faust #include <cassert>
28*c217d954SCole Faust #include <memory>
29*c217d954SCole Faust #include <sstream>
30*c217d954SCole Faust #include <string>
31*c217d954SCole Faust
32*c217d954SCole Faust namespace arm_compute
33*c217d954SCole Faust {
34*c217d954SCole Faust namespace support
35*c217d954SCole Faust {
36*c217d954SCole Faust namespace cpp11
37*c217d954SCole Faust {
38*c217d954SCole Faust enum class NumericBase
39*c217d954SCole Faust {
40*c217d954SCole Faust BASE_10,
41*c217d954SCole Faust BASE_16
42*c217d954SCole Faust };
43*c217d954SCole Faust
44*c217d954SCole Faust /** Convert string values to integer.
45*c217d954SCole Faust *
46*c217d954SCole Faust * @note This function implements the same behaviour as std::stoi. The latter
47*c217d954SCole Faust * is missing in some Android toolchains.
48*c217d954SCole Faust *
49*c217d954SCole Faust * @param[in] str String to be converted to int.
50*c217d954SCole Faust * @param[in] pos If idx is not a null pointer, the function sets the value of pos to the position of the first character in str after the number.
51*c217d954SCole Faust * @param[in] base Numeric base used to interpret the string.
52*c217d954SCole Faust *
53*c217d954SCole Faust * @return Integer representation of @p str.
54*c217d954SCole Faust */
55*c217d954SCole Faust inline int stoi(const std::string &str, std::size_t *pos = 0, NumericBase base = NumericBase::BASE_10)
56*c217d954SCole Faust {
57*c217d954SCole Faust assert(base == NumericBase::BASE_10 || base == NumericBase::BASE_16);
58*c217d954SCole Faust unsigned int x;
59*c217d954SCole Faust std::stringstream ss;
60*c217d954SCole Faust if(base == NumericBase::BASE_16)
61*c217d954SCole Faust {
62*c217d954SCole Faust ss << std::hex;
63*c217d954SCole Faust }
64*c217d954SCole Faust ss << str;
65*c217d954SCole Faust ss >> x;
66*c217d954SCole Faust
67*c217d954SCole Faust if(pos)
68*c217d954SCole Faust {
69*c217d954SCole Faust std::string s;
70*c217d954SCole Faust std::stringstream ss_p;
71*c217d954SCole Faust
72*c217d954SCole Faust ss_p << x;
73*c217d954SCole Faust ss_p >> s;
74*c217d954SCole Faust *pos = s.length();
75*c217d954SCole Faust }
76*c217d954SCole Faust
77*c217d954SCole Faust return x;
78*c217d954SCole Faust }
79*c217d954SCole Faust
80*c217d954SCole Faust /** Convert string values to unsigned long.
81*c217d954SCole Faust *
82*c217d954SCole Faust * @note This function implements the same behaviour as std::stoul. The latter
83*c217d954SCole Faust * is missing in some Android toolchains.
84*c217d954SCole Faust *
85*c217d954SCole Faust * @param[in] str String to be converted to unsigned long.
86*c217d954SCole Faust * @param[in] pos If idx is not a null pointer, the function sets the value of pos to the position of the first character in str after the number.
87*c217d954SCole Faust * @param[in] base Numeric base used to interpret the string.
88*c217d954SCole Faust *
89*c217d954SCole Faust * @return Unsigned long representation of @p str.
90*c217d954SCole Faust */
91*c217d954SCole Faust inline unsigned long stoul(const std::string &str, std::size_t *pos = 0, NumericBase base = NumericBase::BASE_10)
92*c217d954SCole Faust {
93*c217d954SCole Faust assert(base == NumericBase::BASE_10 || base == NumericBase::BASE_16);
94*c217d954SCole Faust std::stringstream stream;
95*c217d954SCole Faust unsigned long value = 0;
96*c217d954SCole Faust if(base == NumericBase::BASE_16)
97*c217d954SCole Faust {
98*c217d954SCole Faust stream << std::hex;
99*c217d954SCole Faust }
100*c217d954SCole Faust stream << str;
101*c217d954SCole Faust stream >> value;
102*c217d954SCole Faust
103*c217d954SCole Faust if(pos)
104*c217d954SCole Faust {
105*c217d954SCole Faust std::string s;
106*c217d954SCole Faust std::stringstream ss_p;
107*c217d954SCole Faust
108*c217d954SCole Faust ss_p << value;
109*c217d954SCole Faust ss_p >> s;
110*c217d954SCole Faust *pos = s.length();
111*c217d954SCole Faust }
112*c217d954SCole Faust
113*c217d954SCole Faust return value;
114*c217d954SCole Faust }
115*c217d954SCole Faust
116*c217d954SCole Faust #if(__ANDROID__ || BARE_METAL)
117*c217d954SCole Faust /** Convert integer and float values to string.
118*c217d954SCole Faust *
119*c217d954SCole Faust * @note This function implements the same behaviour as std::to_string. The
120*c217d954SCole Faust * latter is missing in some Android toolchains.
121*c217d954SCole Faust *
122*c217d954SCole Faust * @param[in] value Value to be converted to string.
123*c217d954SCole Faust *
124*c217d954SCole Faust * @return String representation of @p value.
125*c217d954SCole Faust */
126*c217d954SCole Faust template <typename T, typename std::enable_if<std::is_arithmetic<typename std::decay<T>::type>::value, int>::type = 0>
to_string(T && value)127*c217d954SCole Faust inline std::string to_string(T && value)
128*c217d954SCole Faust {
129*c217d954SCole Faust std::stringstream stream;
130*c217d954SCole Faust stream << std::forward<T>(value);
131*c217d954SCole Faust return stream.str();
132*c217d954SCole Faust }
133*c217d954SCole Faust
134*c217d954SCole Faust // Specialization for const std::string&
to_string(const std::string & value)135*c217d954SCole Faust inline std::string to_string(const std::string &value)
136*c217d954SCole Faust {
137*c217d954SCole Faust return value;
138*c217d954SCole Faust }
139*c217d954SCole Faust
140*c217d954SCole Faust /** Convert string values to float.
141*c217d954SCole Faust *
142*c217d954SCole Faust * @note This function implements the same behaviour as std::stof. The latter
143*c217d954SCole Faust * is missing in some Android toolchains.
144*c217d954SCole Faust *
145*c217d954SCole Faust * @param[in] str String to be converted to float.
146*c217d954SCole Faust *
147*c217d954SCole Faust * @return Float representation of @p str.
148*c217d954SCole Faust */
stof(const std::string & str)149*c217d954SCole Faust inline float stof(const std::string &str)
150*c217d954SCole Faust {
151*c217d954SCole Faust std::stringstream stream(str);
152*c217d954SCole Faust float value = 0.f;
153*c217d954SCole Faust stream >> value;
154*c217d954SCole Faust return value;
155*c217d954SCole Faust }
156*c217d954SCole Faust
157*c217d954SCole Faust #else /* (__ANDROID__ || BARE_METAL) */
158*c217d954SCole Faust /** Convert integer and float values to string.
159*c217d954SCole Faust *
160*c217d954SCole Faust * @note This function acts as a convenience wrapper around std::to_string. The
161*c217d954SCole Faust * latter is missing in some Android toolchains.
162*c217d954SCole Faust *
163*c217d954SCole Faust * @param[in] value Value to be converted to string.
164*c217d954SCole Faust *
165*c217d954SCole Faust * @return String representation of @p value.
166*c217d954SCole Faust */
167*c217d954SCole Faust template <typename T>
to_string(T && value)168*c217d954SCole Faust inline std::string to_string(T &&value)
169*c217d954SCole Faust {
170*c217d954SCole Faust return ::std::to_string(std::forward<T>(value));
171*c217d954SCole Faust }
172*c217d954SCole Faust
173*c217d954SCole Faust // Specialization for const std::string&
to_string(const std::string & value)174*c217d954SCole Faust inline std::string to_string(const std::string &value)
175*c217d954SCole Faust {
176*c217d954SCole Faust return value;
177*c217d954SCole Faust }
178*c217d954SCole Faust
179*c217d954SCole Faust /** Convert string values to float.
180*c217d954SCole Faust *
181*c217d954SCole Faust * @note This function acts as a convenience wrapper around std::stof. The
182*c217d954SCole Faust * latter is missing in some Android toolchains.
183*c217d954SCole Faust *
184*c217d954SCole Faust * @param[in] args Arguments forwarded to std::stof.
185*c217d954SCole Faust *
186*c217d954SCole Faust * @return Float representation of input string.
187*c217d954SCole Faust */
188*c217d954SCole Faust template <typename... Ts>
stof(Ts &&...args)189*c217d954SCole Faust int stof(Ts &&... args)
190*c217d954SCole Faust {
191*c217d954SCole Faust return ::std::stof(std::forward<Ts>(args)...);
192*c217d954SCole Faust }
193*c217d954SCole Faust
194*c217d954SCole Faust #endif /* (__ANDROID__ || BARE_METAL) */
195*c217d954SCole Faust
to_string(bool value)196*c217d954SCole Faust inline std::string to_string(bool value)
197*c217d954SCole Faust {
198*c217d954SCole Faust std::stringstream str;
199*c217d954SCole Faust str << std::boolalpha << value;
200*c217d954SCole Faust return str.str();
201*c217d954SCole Faust }
202*c217d954SCole Faust
203*c217d954SCole Faust } // namespace cpp11
204*c217d954SCole Faust } // namespace support
205*c217d954SCole Faust } // namespace arm_compute
206*c217d954SCole Faust #endif /* ARM_COMPUTE_TEST_STRINGSUPPORT */
207