	#include <chrono>
	#include <ctime>
	#include <cstdint>
    struct HighResClock
    {
        typedef long long                               rep;
        typedef std::nano                               period;
        typedef std::chrono::duration<rep, period>      duration;
        typedef std::chrono::time_point<HighResClock>   time_point;
        static const bool is_steady = true;
        static time_point now();
    };
    
    class Timer
    {
        using SysClock = std::chrono::system_clock;
        using Time     = Timer::SysClock::time_point;
        using Duration = Timer::SysClock::duration;
        Time start_;
    public:
        Timer();
        void Restart();

        Duration TimeElapsed() const;
        int64_t TimeElapsed_s() const;
        int64_t TimeElapsed_ms() const;
        int64_t TimeElapsed_us() const;
        int64_t TimeElapsed_ns() const;

        template<class unit>
        int64_t TimeElapsed_T() const
        {
            return std::chrono::duration_cast<unit>(TimeElapsed()).count();
        }
    };

 
    class HRTimer
    {
        using SysClock = HighResClock;
        using Time = HRTimer::SysClock::time_point;
        using Duration = HRTimer::SysClock::duration;
        Time start_;
    public:
        HRTimer();
        void Restart();

        Duration TimeElapsed() const;
        int64_t TimeElapsed_s() const;
        int64_t TimeElapsed_ms() const;
        int64_t TimeElapsed_us() const;
        int64_t TimeElapsed_ns() const;

        template<class unit>
        int64_t TimeElapsed_T() const
        {
            return std::chrono::duration_cast<unit>(TimeElapsed()).count();
        }
    };