/*
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
}
}
}