67 lines
		
	
	
		
			1.8 KiB
		
	
	
	
		
			C
		
	
	
	
		
		
			
		
	
	
			67 lines
		
	
	
		
			1.8 KiB
		
	
	
	
		
			C
		
	
	
	
|  | // Copyright(c) 2015-present, Gabi Melman & spdlog contributors.
 | ||
|  | // Distributed under the MIT License (http://opensource.org/licenses/MIT)
 | ||
|  | 
 | ||
|  | #pragma once
 | ||
|  | 
 | ||
|  | #include <chrono>
 | ||
|  | #include <spdlog/fmt/fmt.h>
 | ||
|  | 
 | ||
|  | // Stopwatch support for spdlog  (using std::chrono::steady_clock).
 | ||
|  | // Displays elapsed seconds since construction as double.
 | ||
|  | //
 | ||
|  | // Usage:
 | ||
|  | //
 | ||
|  | // spdlog::stopwatch sw;
 | ||
|  | // ...
 | ||
|  | // spdlog::debug("Elapsed: {} seconds", sw);    =>  "Elapsed 0.005116733 seconds"
 | ||
|  | // spdlog::info("Elapsed: {:.6} seconds", sw);  =>  "Elapsed 0.005163 seconds"
 | ||
|  | //
 | ||
|  | //
 | ||
|  | // If other units are needed (e.g. millis instead of double), include "fmt/chrono.h" and use
 | ||
|  | // "duration_cast<..>(sw.elapsed())":
 | ||
|  | //
 | ||
|  | // #include <spdlog/fmt/chrono.h>
 | ||
|  | //..
 | ||
|  | // using std::chrono::duration_cast;
 | ||
|  | // using std::chrono::milliseconds;
 | ||
|  | // spdlog::info("Elapsed {}", duration_cast<milliseconds>(sw.elapsed())); => "Elapsed 5ms"
 | ||
|  | 
 | ||
|  | namespace spdlog { | ||
|  | class stopwatch { | ||
|  |     using clock = std::chrono::steady_clock; | ||
|  |     std::chrono::time_point<clock> start_tp_; | ||
|  | 
 | ||
|  | public: | ||
|  |     stopwatch() | ||
|  |         : start_tp_{clock::now()} {} | ||
|  | 
 | ||
|  |     std::chrono::duration<double> elapsed() const { | ||
|  |         return std::chrono::duration<double>(clock::now() - start_tp_); | ||
|  |     } | ||
|  | 
 | ||
|  |     std::chrono::milliseconds elapsed_ms() const { | ||
|  |         return std::chrono::duration_cast<std::chrono::milliseconds>(clock::now() - start_tp_); | ||
|  |     } | ||
|  | 
 | ||
|  |     void reset() { start_tp_ = clock::now(); } | ||
|  | }; | ||
|  | }  // namespace spdlog
 | ||
|  | 
 | ||
|  | // Support for fmt formatting  (e.g. "{:012.9}" or just "{}")
 | ||
|  | namespace | ||
|  | #ifdef SPDLOG_USE_STD_FORMAT
 | ||
|  |     std | ||
|  | #else
 | ||
|  |     fmt | ||
|  | #endif
 | ||
|  | { | ||
|  | 
 | ||
|  | template <> | ||
|  | struct formatter<spdlog::stopwatch> : formatter<double> { | ||
|  |     template <typename FormatContext> | ||
|  |     auto format(const spdlog::stopwatch &sw, FormatContext &ctx) const -> decltype(ctx.out()) { | ||
|  |         return formatter<double>::format(sw.elapsed().count(), ctx); | ||
|  |     } | ||
|  | }; | ||
|  | }  // namespace std
 |