#ifndef UTIL_H #define UTIL_H #include #include #include namespace util{ template inline std::expected to_string(T value) { if constexpr (std::is_same_v || std::is_same_v || std::is_same_v) { char buffer[buffer_size]; auto res = std::to_chars(buffer, buffer + buffer_size, value); if (res.ec != std::errc()) { return std::unexpected(std::make_error_code(res.ec).message()); } return std::string(buffer, res.ptr - buffer); } else if constexpr (std::is_same_v::type, char *>) { return std::to_string(value); } } template // requires std::is_same_v inline std::expected stoi(const std::string &str) { T value; auto res = std::from_chars(str.c_str(), str.c_str() + str.size(), value); if (res.ec != std::errc()) { return std::unexpected(std::make_error_code(res.ec).message()); } return value; } inline std::string get_time_now(){ auto time_now = std::chrono::system_clock::now(); auto now_c = std::chrono::system_clock::to_time_t(time_now); char buffer[32]; #if defined(_WIN32) || defined(_WIN64) auto _ = ctime_s(buffer, 32, &now_c); #elif defined(__linux__) auto _ = ctime_r(&now_c, buffer); #endif auto result = std::string(buffer); result = string::replace_string(result, "\n", ""); return std::move(result); } } #endif