// Timing a block of code: steady_clock, subtract, convert for a human.
// The measurement changes every run, so this prints only what the standard
// lets us PROVE about it — never the number itself.
#include <chrono>
#include <iostream>
#include <thread>
#include <type_traits>

namespace sc = std::chrono;
using namespace std::chrono_literals;

int main() {
    std::cout << std::boolalpha;

    auto start = sc::steady_clock::now();
    std::this_thread::sleep_for(20ms);                // the "work": at least 20 ms, by contract
    auto elapsed = sc::steady_clock::now() - start;   // a duration, in the clock's own unit

    std::cout << "elapsed >= 20ms: " << (elapsed >= 20ms) << '\n';              // true
    std::cout << "elapsed is a steady_clock::duration: "
              << std::is_same_v<decltype(elapsed), sc::steady_clock::duration> << '\n';  // true

    // For a person: fractional milliseconds, with nothing rounded away.
    sc::duration<double, std::milli> as_ms = elapsed;
    std::cout << "as_ms.count() >= 20.0: " << (as_ms.count() >= 20.0) << '\n';  // true

    // For a log: whole microseconds, truncated on purpose.
    auto as_us = sc::duration_cast<sc::microseconds>(elapsed);
    std::cout << "as_us >= 20000us: " << (as_us >= 20000us) << '\n';           // true
}
