diff --git a/include/internal/catch_tostring.cpp b/include/internal/catch_tostring.cpp index dc6f3af5..568d96e7 100644 --- a/include/internal/catch_tostring.cpp +++ b/include/internal/catch_tostring.cpp @@ -216,6 +216,56 @@ std::string StringMaker::convert(double value) { return fpToString(value, 10); } +// Separate std::chrono::duration specialization +#if defined(CATCH_CONFIG_ENABLE_CHRONO_STRINGMAKER) +#include + +std::string ratio_string::symbol() { + return "a"; +} + +std::string ratio_string::symbol() { + return "f"; +} + +std::string ratio_string::symbol() { + return "p"; +} + +std::string ratio_string::symbol() { + return "n"; +} + +std::string ratio_string::symbol() { + return "u"; +} + +std::string ratio_string::symbol() { + return "m"; +} + + +std::string time_t_toString(time_t const& toConvert) { + +#ifdef _MSC_VER + std::tm timeInfo = {}; + gmtime_s(&timeInfo, &toConvert); +#else + std::tm* timeInfo = std::gmtime(&toConvert); +#endif + + auto const timeStampSize = sizeof("2017-01-16T17:06:45Z"); + char timeStamp[timeStampSize]; + const char * const fmt = "%Y-%m-%dT%H:%M:%SZ"; + +#ifdef _MSC_VER + std::strftime(timeStamp, timeStampSize, fmt, &timeInfo); +#else + std::strftime(timeStamp, timeStampSize, fmt, timeInfo); +#endif + return std::string(timeStamp, timeStampSize); +} +#endif // CATCH_CONFIG_ENABLE_CHRONO_STRINGMAKER } // end namespace Catch diff --git a/include/internal/catch_tostring.h b/include/internal/catch_tostring.h index 40d61479..b60fd9fd 100644 --- a/include/internal/catch_tostring.h +++ b/include/internal/catch_tostring.h @@ -347,10 +347,13 @@ namespace Catch { // Separate std::chrono::duration specialization #if defined(CATCH_CONFIG_ENABLE_CHRONO_STRINGMAKER) -#include #include #include +namespace Catch { + +std::string time_t_toString(time_t const& toConvert); + template struct ratio_string { static std::string symbol(); @@ -365,30 +368,30 @@ std::string ratio_string::symbol() { } template <> struct ratio_string { - static std::string symbol() { return "a"; } + static std::string symbol(); }; template <> struct ratio_string { - static std::string symbol() { return "f"; } + static std::string symbol(); }; template <> struct ratio_string { - static std::string symbol() { return "p"; } + static std::string symbol(); }; template <> struct ratio_string { - static std::string symbol() { return "n"; } + static std::string symbol(); }; template <> struct ratio_string { - static std::string symbol() { return "u"; } + static std::string symbol(); }; template <> struct ratio_string { - static std::string symbol() { return "m"; } + static std::string symbol(); }; -namespace Catch { + //////////// // std::chrono::duration specializations template @@ -433,32 +436,16 @@ namespace Catch { return ::Catch::Detail::stringify(time_point.time_since_epoch()) + " since epoch"; } }; + // std::chrono::time_point specialization template struct StringMaker> { static std::string convert(std::chrono::time_point const& time_point) { auto converted = std::chrono::system_clock::to_time_t(time_point); - -#ifdef _MSC_VER - std::tm timeInfo = {}; - gmtime_s(&timeInfo, &converted); -#else - std::tm* timeInfo = std::gmtime(&converted); -#endif - - auto const timeStampSize = sizeof("2017-01-16T17:06:45Z"); - char timeStamp[timeStampSize]; - const char * const fmt = "%Y-%m-%dT%H:%M:%SZ"; - -#ifdef _MSC_VER - std::strftime(timeStamp, timeStampSize, fmt, &timeInfo); -#else - std::strftime(timeStamp, timeStampSize, fmt, timeInfo); -#endif - return std::string(timeStamp); + return time_t_toString(converted); } }; -} +} // namespace Catch #endif // CATCH_CONFIG_ENABLE_CHRONO_STRINGMAKER