19 template<
typename... Args>
20 std::string format(Args&& ...args) {
21 return _format(fmt_, 0, std::forward<Args>(args)...);
25 std::string _format(std::string str,
int) {
29 static bool is_int(
char ch) {
30 return ch >= 48 && ch < 58;
33 template<
typename... Args>
34 std::string _format(
const std::string& str,
int c, int8_t&& v, Args&& ...args) {
35 return _format(str, c, (int16_t) v, std::forward<Args>(args)...);
38 template<
typename T,
typename... Args>
39 std::string _format(
const std::string& str,
int c, T&& v, Args&& ...args) {
41 int max_token_size = 7;
43 for(
auto i = 0u; i < str.size(); ++i) {
45 std::string id, format;
48 for(
auto j = 1; j < max_token_size; ++j) {
51 if(k >= str.size() - 1) {
59 }
else if(ch ==
':') {
66 }
else if(ch !=
'.') {
79 if(smlt::stoi(
id) == c) {
82 if(format.size() > 1 && format[0] ==
'.') {
83 auto prec = smlt::stoi(format.substr(1));
84 ss << std::setprecision(prec) << v;
102 return _format(ss.str(), c + 1, std::forward<Args>(args)...);