#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();
    };
 
 	template<class Clock>
    class Timer
    {
        using SysClock = Clock;
        using Time     = Clock::time_point;
        using Duration = Clock::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();
        }
    };
    
    using NTimer = Timer<std::chrono::sys_clock>;
    using HRTimer = Timer<HighResClock>;
 
    