I\'m creating a timeline UI control, and time on this timeline always starts at zero, like a stopwatch. I thought of using std::chrono::steady_clock to keep the start and end ti
Here is an example custom chrono clock that is based on steady_clock and counts time since the first time it is called (approximately):
#include "chrono_io.h"
#include <chrono>
#include <iostream>
struct MyClock
{
using duration = std::chrono::steady_clock::duration;
using rep = duration::rep;
using period = duration::period;
using time_point = std::chrono::time_point<MyClock>;
static constexpr bool is_steady = true;
static time_point now() noexcept
{
using namespace std::chrono;
static auto epoch = steady_clock::now();
return time_point{steady_clock::now() - epoch};
}
};
int
main()
{
using namespace date;
std::cout << MyClock::now().time_since_epoch() << '\n';
std::cout << MyClock::now().time_since_epoch() << '\n';
std::cout << MyClock::now().time_since_epoch() << '\n';
std::cout << MyClock::now().time_since_epoch() << '\n';
}
One just needs to define the nested types duration, rep and period which it can just steal from steady_clock, and then create it's own time_point. One should not use steady_clock's time_point because the epoch of MyClock and steady_clock are different, and you don't want to accidentally mix those two time_point's in arithmetic.
Since MyClock is based on steady_clock, it is_steady.
And the now() function stores the current time epoch in a static (evaluated the first time it is called), and then just finds the time since the epoch each time it is called. This subtraction creates a duration, which can be used to construct a MyClock::time_point.
I'm using "chrono_io.h" just because I'm lazy in my formatting. You don't need that header to create your own custom clock. This does nothing but make it easier to print out durations.
This program just output for me:
1618ns
82680ns
86277ns
88425ns