#include #include #include #include std::string to_lower(const std::string& str); template std::string join(const T& values, const std::string& delim) { std::ostringstream ss; for (const auto& v : values) { if (&v != &values[0]) ss << delim; ss << v; } return ss.str(); } template std::string join(const std::vector& values, const std::string& delim, std::function func) { std::ostringstream ss; for (const auto& v : values) { if (&v != &values[0]) ss << delim; ss << func(v); } return ss.str(); } std::string sformat(const char *fmt, ...) __attribute__ ((format (printf, 1, 2)));