AimRT/install_x64/include/unifex/win32/filetime_clock.hpp
2025-01-12 19:51:34 +08:00

123 lines
3.5 KiB
C++

/*
* Copyright (c) Facebook, Inc. and its affiliates.
*
* Licensed under the Apache License Version 2.0 with LLVM Exceptions
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* https://llvm.org/LICENSE.txt
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#pragma once
#include <chrono>
#include <cstdint>
#include <unifex/detail/prologue.hpp>
namespace unifex::win32 {
class filetime_clock {
public:
using rep = std::int64_t;
using ratio = std::ratio<1, 10'000'000>; // 100ns
using duration = std::chrono::duration<rep, ratio>;
static constexpr bool is_steady = false;
class time_point {
public:
using duration = filetime_clock::duration;
constexpr time_point() noexcept : ticks_(0) {}
constexpr time_point(const time_point&) noexcept = default;
time_point& operator=(const time_point&) noexcept = default;
std::uint64_t get_ticks() const noexcept {
return ticks_;
}
static constexpr time_point max() noexcept {
time_point tp;
tp.ticks_ = std::numeric_limits<std::int64_t>::max();
return tp;
}
static constexpr time_point min() noexcept {
return time_point{};
}
static time_point from_ticks(std::uint64_t ticks) noexcept {
time_point tp;
tp.ticks_ = ticks;
return tp;
}
template <typename Rep, typename Ratio>
time_point& operator+=(
const std::chrono::duration<Rep, Ratio>& d) noexcept {
ticks_ += std::chrono::duration_cast<duration>(d).count();
return *this;
}
template <typename Rep, typename Ratio>
time_point& operator-=(
const std::chrono::duration<Rep, Ratio>& d) noexcept {
ticks_ -= std::chrono::duration_cast<duration>(d).count();
return *this;
}
friend duration operator-(time_point a, time_point b) noexcept {
return duration{a.ticks_} - duration{b.ticks_};
}
template <typename Rep, typename Ratio>
friend time_point operator+(time_point t, std::chrono::duration<Rep, Ratio> d) noexcept {
time_point tp = t;
tp += d;
return tp;
}
friend bool operator==(time_point a, time_point b) noexcept {
return a.ticks_ == b.ticks_;
}
friend bool operator!=(time_point a, time_point b) noexcept {
return a.ticks_ != b.ticks_;
}
friend bool operator<(time_point a, time_point b) noexcept {
return a.ticks_ < b.ticks_;
}
friend bool operator>(time_point a, time_point b) noexcept {
return a.ticks_ > b.ticks_;
}
friend bool operator<=(time_point a, time_point b) noexcept {
return a.ticks_ <= b.ticks_;
}
friend bool operator>=(time_point a, time_point b) noexcept {
return a.ticks_ >= b.ticks_;
}
private:
// Ticks since Jan 1, 1601 (UTC)
std::uint64_t ticks_;
};
static time_point now() noexcept;
};
} // namespace unifex::win32
#include <unifex/detail/epilogue.hpp>