/* This file is part of Fennix Kernel. Fennix Kernel is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Fennix Kernel is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Fennix Kernel. If not, see . */ #pragma once #include #include namespace std { namespace chrono { template > class duration { private: Rep _rep; std::ratio _period; public: using rep = Rep; using period = Period; constexpr duration() = default; duration(const duration &) = default; template constexpr explicit duration(const Rep2 &r) { _rep = r; } template constexpr duration(const duration &d); duration &operator=(const duration &other) = default; constexpr Rep count() const { return _rep; } static constexpr duration zero() noexcept; static constexpr duration min() noexcept; static constexpr duration max() noexcept; constexpr std::common_type_t operator+() const; constexpr std::common_type_t operator-() const; constexpr duration operator++(int) { return duration(_rep++); } constexpr duration operator--(int) { return duration(_rep--); } constexpr duration &operator++() { ++_rep; return *this; } constexpr duration &operator--() { --_rep; return *this; } constexpr duration &operator+=(const duration &d) { _rep += d.count(); return *this; } constexpr duration &operator-=(const duration &d) { _rep -= d.count(); return *this; } constexpr duration &operator*=(const Rep &rhs) { _rep *= rhs; return *this; } constexpr duration &operator/=(const Rep &rhs) { _rep /= rhs; return *this; } constexpr duration &operator%=(const Rep &rhs) { _rep %= rhs; return *this; } constexpr duration &operator%=(const duration &rhs) { _rep %= rhs.count(); return *this; } }; template class time_point; using nanoseconds = std::chrono::duration; using microseconds = std::chrono::duration; using milliseconds = std::chrono::duration; using seconds = std::chrono::duration; using minutes = std::chrono::duration>; using hours = std::chrono::duration>; using days = std::chrono::duration>; using weeks = std::chrono::duration>; using months = std::chrono::duration>; using years = std::chrono::duration>; template constexpr ToDuration duration_cast(const std::chrono::duration &d) { typedef typename ToDuration::rep ToRep; typedef typename ToDuration::period ToPeriod; typedef std::ratio_divide CF; typedef typename std::common_type::type CR; CR cr_count = static_cast(d.count()); CR cr_num = static_cast(CF::num); CR cr_den = static_cast(CF::den); if constexpr (CF::num == 1 && CF::den == 1) return ToDuration(static_cast(cr_count)); else if constexpr (CF::den == 1) return ToDuration(static_cast(cr_count * cr_num)); else if constexpr (CF::num == 1) return ToDuration(static_cast(cr_count / cr_den)); else return ToDuration(static_cast(cr_count * cr_num / cr_den)); } } inline namespace literals { inline namespace chrono_literals { #pragma GCC diagnostic push #pragma GCC diagnostic ignored "-Wliteral-suffix" constexpr std::chrono::hours operator""h(unsigned long long h) { return std::chrono::hours(h); } constexpr std::chrono::duration> operator""h(long double h) { return std::chrono::duration>(h); } constexpr std::chrono::minutes operator""min(unsigned long long m) { return std::chrono::minutes(m); } constexpr std::chrono::duration> operator""min(long double m) { return std::chrono::duration>(m); } constexpr std::chrono::seconds operator""s(unsigned long long s) { return std::chrono::seconds(s); } constexpr std::chrono::duration operator""s(long double s) { return std::chrono::duration(s); } constexpr std::chrono::milliseconds operator""ms(unsigned long long ms) { return std::chrono::milliseconds(ms); } constexpr std::chrono::duration operator""ms(long double ms) { return std::chrono::duration(ms); } constexpr std::chrono::microseconds operator""us(unsigned long long us) { return std::chrono::microseconds(us); } constexpr std::chrono::duration operator""us(long double us) { return std::chrono::duration(us); } constexpr std::chrono::nanoseconds operator""ns(unsigned long long ns) { return std::chrono::nanoseconds(ns); } constexpr std::chrono::duration operator""ns(long double ns) { return std::chrono::duration(ns); } #pragma GCC diagnostic pop } } }