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