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