|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#pragma once |
|
|
|
#include <memory> |
|
#include <sstream> |
|
#include <string> |
|
#include <vector> |
|
|
|
namespace fastertransformer { |
|
|
|
template<typename... Args> |
|
inline std::string fmtstr(const std::string& format, Args... args) |
|
{ |
|
|
|
|
|
|
|
|
|
#if defined(_MSC_VER) |
|
#pragma warning(push) |
|
#pragma warning(warning(disable : 4996)) |
|
#elif defined(__GNUC__) || defined(__clang__) |
|
#pragma GCC diagnostic push |
|
#pragma GCC diagnostic ignored "-Wformat-security" |
|
#endif |
|
int size_s = std::snprintf(nullptr, 0, format.c_str(), args...) + 1; |
|
if (size_s <= 0) { |
|
throw std::runtime_error("Error during formatting."); |
|
} |
|
auto size = static_cast<size_t>(size_s); |
|
auto buf = std::make_unique<char[]>(size); |
|
std::snprintf(buf.get(), size, format.c_str(), args...); |
|
#if defined(_MSC_VER) |
|
#pragma warning(pop) |
|
#elif defined(__GNUC__) || defined(__clang__) |
|
#pragma GCC diagnostic pop |
|
#endif |
|
return std::string(buf.get(), buf.get() + size - 1); |
|
} |
|
} |
|
|