1*dbb99499SAndroid Build Coastguard Worker #ifndef BENCHMARK_STRING_UTIL_H_
2*dbb99499SAndroid Build Coastguard Worker #define BENCHMARK_STRING_UTIL_H_
3*dbb99499SAndroid Build Coastguard Worker
4*dbb99499SAndroid Build Coastguard Worker #include <sstream>
5*dbb99499SAndroid Build Coastguard Worker #include <string>
6*dbb99499SAndroid Build Coastguard Worker #include <utility>
7*dbb99499SAndroid Build Coastguard Worker #include <vector>
8*dbb99499SAndroid Build Coastguard Worker
9*dbb99499SAndroid Build Coastguard Worker #include "benchmark/benchmark.h"
10*dbb99499SAndroid Build Coastguard Worker #include "benchmark/export.h"
11*dbb99499SAndroid Build Coastguard Worker #include "check.h"
12*dbb99499SAndroid Build Coastguard Worker #include "internal_macros.h"
13*dbb99499SAndroid Build Coastguard Worker
14*dbb99499SAndroid Build Coastguard Worker namespace benchmark {
15*dbb99499SAndroid Build Coastguard Worker
16*dbb99499SAndroid Build Coastguard Worker BENCHMARK_EXPORT
17*dbb99499SAndroid Build Coastguard Worker std::string HumanReadableNumber(double n, Counter::OneK one_k);
18*dbb99499SAndroid Build Coastguard Worker
19*dbb99499SAndroid Build Coastguard Worker BENCHMARK_EXPORT
20*dbb99499SAndroid Build Coastguard Worker #if defined(__MINGW32__)
21*dbb99499SAndroid Build Coastguard Worker __attribute__((format(__MINGW_PRINTF_FORMAT, 1, 2)))
22*dbb99499SAndroid Build Coastguard Worker #elif defined(__GNUC__)
23*dbb99499SAndroid Build Coastguard Worker __attribute__((format(printf, 1, 2)))
24*dbb99499SAndroid Build Coastguard Worker #endif
25*dbb99499SAndroid Build Coastguard Worker std::string
26*dbb99499SAndroid Build Coastguard Worker StrFormat(const char* format, ...);
27*dbb99499SAndroid Build Coastguard Worker
StrCatImp(std::ostream & out)28*dbb99499SAndroid Build Coastguard Worker inline std::ostream& StrCatImp(std::ostream& out) BENCHMARK_NOEXCEPT {
29*dbb99499SAndroid Build Coastguard Worker return out;
30*dbb99499SAndroid Build Coastguard Worker }
31*dbb99499SAndroid Build Coastguard Worker
32*dbb99499SAndroid Build Coastguard Worker template <class First, class... Rest>
StrCatImp(std::ostream & out,First && f,Rest &&...rest)33*dbb99499SAndroid Build Coastguard Worker inline std::ostream& StrCatImp(std::ostream& out, First&& f, Rest&&... rest) {
34*dbb99499SAndroid Build Coastguard Worker out << std::forward<First>(f);
35*dbb99499SAndroid Build Coastguard Worker return StrCatImp(out, std::forward<Rest>(rest)...);
36*dbb99499SAndroid Build Coastguard Worker }
37*dbb99499SAndroid Build Coastguard Worker
38*dbb99499SAndroid Build Coastguard Worker template <class... Args>
StrCat(Args &&...args)39*dbb99499SAndroid Build Coastguard Worker inline std::string StrCat(Args&&... args) {
40*dbb99499SAndroid Build Coastguard Worker std::ostringstream ss;
41*dbb99499SAndroid Build Coastguard Worker StrCatImp(ss, std::forward<Args>(args)...);
42*dbb99499SAndroid Build Coastguard Worker return ss.str();
43*dbb99499SAndroid Build Coastguard Worker }
44*dbb99499SAndroid Build Coastguard Worker
45*dbb99499SAndroid Build Coastguard Worker BENCHMARK_EXPORT
46*dbb99499SAndroid Build Coastguard Worker std::vector<std::string> StrSplit(const std::string& str, char delim);
47*dbb99499SAndroid Build Coastguard Worker
48*dbb99499SAndroid Build Coastguard Worker // Disable lint checking for this block since it re-implements C functions.
49*dbb99499SAndroid Build Coastguard Worker // NOLINTBEGIN
50*dbb99499SAndroid Build Coastguard Worker #ifdef BENCHMARK_STL_ANDROID_GNUSTL
51*dbb99499SAndroid Build Coastguard Worker /*
52*dbb99499SAndroid Build Coastguard Worker * GNU STL in Android NDK lacks support for some C++11 functions, including
53*dbb99499SAndroid Build Coastguard Worker * stoul, stoi, stod. We reimplement them here using C functions strtoul,
54*dbb99499SAndroid Build Coastguard Worker * strtol, strtod. Note that reimplemented functions are in benchmark::
55*dbb99499SAndroid Build Coastguard Worker * namespace, not std:: namespace.
56*dbb99499SAndroid Build Coastguard Worker */
57*dbb99499SAndroid Build Coastguard Worker unsigned long stoul(const std::string& str, size_t* pos = nullptr,
58*dbb99499SAndroid Build Coastguard Worker int base = 10);
59*dbb99499SAndroid Build Coastguard Worker int stoi(const std::string& str, size_t* pos = nullptr, int base = 10);
60*dbb99499SAndroid Build Coastguard Worker double stod(const std::string& str, size_t* pos = nullptr);
61*dbb99499SAndroid Build Coastguard Worker #else
62*dbb99499SAndroid Build Coastguard Worker using std::stod; // NOLINT(misc-unused-using-decls)
63*dbb99499SAndroid Build Coastguard Worker using std::stoi; // NOLINT(misc-unused-using-decls)
64*dbb99499SAndroid Build Coastguard Worker using std::stoul; // NOLINT(misc-unused-using-decls)
65*dbb99499SAndroid Build Coastguard Worker #endif
66*dbb99499SAndroid Build Coastguard Worker // NOLINTEND
67*dbb99499SAndroid Build Coastguard Worker
68*dbb99499SAndroid Build Coastguard Worker } // end namespace benchmark
69*dbb99499SAndroid Build Coastguard Worker
70*dbb99499SAndroid Build Coastguard Worker #endif // BENCHMARK_STRING_UTIL_H_
71