//////////////////////////////////////////////////////////// // // SFML - Simple and Fast Multimedia Library // Copyright (C) 2007-2025 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without any express or implied warranty. // In no event will the authors be held liable for any damages arising from the use of this software. // // Permission is granted to anyone to use this software for any purpose, // including commercial applications, and to alter it and redistribute it freely, // subject to the following restrictions: // // 1. The origin of this software must not be misrepresented; // you must not claim that you wrote the original software. // If you use this software in a product, an acknowledgment // in the product documentation would be appreciated but is not required. // // 2. Altered source versions must be plainly marked as such, // and must not be misrepresented as being the original software. // // 3. This notice may not be removed or altered from any source distribution. // //////////////////////////////////////////////////////////// #pragma once //////////////////////////////////////////////////////////// // Headers //////////////////////////////////////////////////////////// #include #include namespace sf { //////////////////////////////////////////////////////////// /// \brief Represents a time value /// //////////////////////////////////////////////////////////// class Time { public: //////////////////////////////////////////////////////////// /// \brief Default constructor /// /// Sets the time value to zero. /// //////////////////////////////////////////////////////////// constexpr Time() = default; //////////////////////////////////////////////////////////// /// \brief Construct from `std::chrono::duration` /// //////////////////////////////////////////////////////////// template constexpr Time(const std::chrono::duration& duration); //////////////////////////////////////////////////////////// /// \brief Return the time value as a number of seconds /// /// \return Time in seconds /// /// \see `asMilliseconds`, `asMicroseconds` /// //////////////////////////////////////////////////////////// [[nodiscard]] constexpr float asSeconds() const; //////////////////////////////////////////////////////////// /// \brief Return the time value as a number of milliseconds /// /// \return Time in milliseconds /// /// \see `asSeconds`, `asMicroseconds` /// //////////////////////////////////////////////////////////// [[nodiscard]] constexpr std::int32_t asMilliseconds() const; //////////////////////////////////////////////////////////// /// \brief Return the time value as a number of microseconds /// /// \return Time in microseconds /// /// \see `asSeconds`, `asMilliseconds` /// //////////////////////////////////////////////////////////// [[nodiscard]] constexpr std::int64_t asMicroseconds() const; //////////////////////////////////////////////////////////// /// \brief Return the time value as a `std::chrono::duration` /// /// \return Time in microseconds /// //////////////////////////////////////////////////////////// [[nodiscard]] constexpr std::chrono::microseconds toDuration() const; //////////////////////////////////////////////////////////// /// \brief Implicit conversion to `std::chrono::duration` /// /// \return Duration in microseconds /// //////////////////////////////////////////////////////////// template constexpr operator std::chrono::duration() const; //////////////////////////////////////////////////////////// // Static member data //////////////////////////////////////////////////////////// // NOLINTNEXTLINE(readability-identifier-naming) static const Time Zero; //!< Predefined "zero" time value private: //////////////////////////////////////////////////////////// // Member data //////////////////////////////////////////////////////////// std::chrono::microseconds m_microseconds{}; //!< Time value stored as microseconds }; //////////////////////////////////////////////////////////// /// \relates Time /// \brief Construct a time value from a number of seconds /// /// \param amount Number of seconds /// /// \return Time value constructed from the amount of seconds /// /// \see `milliseconds`, `microseconds` /// //////////////////////////////////////////////////////////// [[nodiscard]] constexpr Time seconds(float amount); //////////////////////////////////////////////////////////// /// \relates Time /// \brief Construct a time value from a number of milliseconds /// /// \param amount Number of milliseconds /// /// \return Time value constructed from the amount of milliseconds /// /// \see `seconds`, `microseconds` /// //////////////////////////////////////////////////////////// [[nodiscard]] constexpr Time milliseconds(std::int32_t amount); //////////////////////////////////////////////////////////// /// \relates Time /// \brief Construct a time value from a number of microseconds /// /// \param amount Number of microseconds /// /// \return Time value constructed from the amount of microseconds /// /// \see `seconds`, `milliseconds` /// //////////////////////////////////////////////////////////// [[nodiscard]] constexpr Time microseconds(std::int64_t amount); //////////////////////////////////////////////////////////// /// \relates Time /// \brief Overload of `operator==` to compare two time values /// /// \param left Left operand (a time) /// \param right Right operand (a time) /// /// \return `true` if both time values are equal /// //////////////////////////////////////////////////////////// [[nodiscard]] constexpr bool operator==(Time left, Time right); //////////////////////////////////////////////////////////// /// \relates Time /// \brief Overload of `operator!=` to compare two time values /// /// \param left Left operand (a time) /// \param right Right operand (a time) /// /// \return `true` if both time values are different /// //////////////////////////////////////////////////////////// [[nodiscard]] constexpr bool operator!=(Time left, Time right); //////////////////////////////////////////////////////////// /// \relates Time /// \brief Overload of `operator<` to compare two time values /// /// \param left Left operand (a time) /// \param right Right operand (a time) /// /// \return `true` if `left` is lesser than `right` /// //////////////////////////////////////////////////////////// [[nodiscard]] constexpr bool operator<(Time left, Time right); //////////////////////////////////////////////////////////// /// \relates Time /// \brief Overload of `operator>` to compare two time values /// /// \param left Left operand (a time) /// \param right Right operand (a time) /// /// \return `true` if `left` is greater than `right` /// //////////////////////////////////////////////////////////// [[nodiscard]] constexpr bool operator>(Time left, Time right); //////////////////////////////////////////////////////////// /// \relates Time /// \brief Overload of `operator<=` to compare two time values /// /// \param left Left operand (a time) /// \param right Right operand (a time) /// /// \return `true` if `left` is lesser or equal than `right` /// //////////////////////////////////////////////////////////// [[nodiscard]] constexpr bool operator<=(Time left, Time right); //////////////////////////////////////////////////////////// /// \relates Time /// \brief Overload of `operator>=` to compare two time values /// /// \param left Left operand (a time) /// \param right Right operand (a time) /// /// \return `true` if `left` is greater or equal than `right` /// //////////////////////////////////////////////////////////// [[nodiscard]] constexpr bool operator>=(Time left, Time right); //////////////////////////////////////////////////////////// /// \relates Time /// \brief Overload of unary `operator-` to negate a time value /// /// \param right Right operand (a time) /// /// \return Opposite of the time value /// //////////////////////////////////////////////////////////// [[nodiscard]] constexpr Time operator-(Time right); //////////////////////////////////////////////////////////// /// \relates Time /// \brief Overload of binary `operator+` to add two time values /// /// \param left Left operand (a time) /// \param right Right operand (a time) /// /// \return Sum of the two times values /// //////////////////////////////////////////////////////////// [[nodiscard]] constexpr Time operator+(Time left, Time right); //////////////////////////////////////////////////////////// /// \relates Time /// \brief Overload of binary `operator+=` to add/assign two time values /// /// \param left Left operand (a time) /// \param right Right operand (a time) /// /// \return Sum of the two times values /// //////////////////////////////////////////////////////////// constexpr Time& operator+=(Time& left, Time right); //////////////////////////////////////////////////////////// /// \relates Time /// \brief Overload of binary `operator-` to subtract two time values /// /// \param left Left operand (a time) /// \param right Right operand (a time) /// /// \return Difference of the two times values /// //////////////////////////////////////////////////////////// [[nodiscard]] constexpr Time operator-(Time left, Time right); //////////////////////////////////////////////////////////// /// \relates Time /// \brief Overload of binary `operator-=` to subtract/assign two time values /// /// \param left Left operand (a time) /// \param right Right operand (a time) /// /// \return Difference of the two times values /// //////////////////////////////////////////////////////////// constexpr Time& operator-=(Time& left, Time right); //////////////////////////////////////////////////////////// /// \relates Time /// \brief Overload of binary `operator*` to scale a time value /// /// \param left Left operand (a time) /// \param right Right operand (a number) /// /// \return `left` multiplied by `right` /// //////////////////////////////////////////////////////////// [[nodiscard]] constexpr Time operator*(Time left, float right); //////////////////////////////////////////////////////////// /// \relates Time /// \brief Overload of binary `operator*` to scale a time value /// /// \param left Left operand (a time) /// \param right Right operand (a number) /// /// \return `left` multiplied by `right` /// //////////////////////////////////////////////////////////// [[nodiscard]] constexpr Time operator*(Time left, std::int64_t right); //////////////////////////////////////////////////////////// /// \relates Time /// \brief Overload of binary `operator*` to scale a time value /// /// \param left Left operand (a number) /// \param right Right operand (a time) /// /// \return `left` multiplied by `right` /// //////////////////////////////////////////////////////////// [[nodiscard]] constexpr Time operator*(float left, Time right); //////////////////////////////////////////////////////////// /// \relates Time /// \brief Overload of binary `operator*` to scale a time value /// /// \param left Left operand (a number) /// \param right Right operand (a time) /// /// \return `left` multiplied by `right` /// //////////////////////////////////////////////////////////// [[nodiscard]] constexpr Time operator*(std::int64_t left, Time right); //////////////////////////////////////////////////////////// /// \relates Time /// \brief Overload of binary `operator*=` to scale/assign a time value /// /// \param left Left operand (a time) /// \param right Right operand (a number) /// /// \return `left` multiplied by `right` /// //////////////////////////////////////////////////////////// constexpr Time& operator*=(Time& left, float right); //////////////////////////////////////////////////////////// /// \relates Time /// \brief Overload of binary `operator*=` to scale/assign a time value /// /// \param left Left operand (a time) /// \param right Right operand (a number) /// /// \return `left` multiplied by `right` /// //////////////////////////////////////////////////////////// constexpr Time& operator*=(Time& left, std::int64_t right); //////////////////////////////////////////////////////////// /// \relates Time /// \brief Overload of binary `operator/` to scale a time value /// /// \param left Left operand (a time) /// \param right Right operand (a number) /// /// \return `left` divided by `right` /// //////////////////////////////////////////////////////////// [[nodiscard]] constexpr Time operator/(Time left, float right); //////////////////////////////////////////////////////////// /// \relates Time /// \brief Overload of binary `operator/` to scale a time value /// /// \param left Left operand (a time) /// \param right Right operand (a number) /// /// \return `left` divided by `right` /// //////////////////////////////////////////////////////////// [[nodiscard]] constexpr Time operator/(Time left, std::int64_t right); //////////////////////////////////////////////////////////// /// \relates Time /// \brief Overload of binary `operator/=` to scale/assign a time value /// /// \param left Left operand (a time) /// \param right Right operand (a number) /// /// \return `left` divided by `right` /// //////////////////////////////////////////////////////////// constexpr Time& operator/=(Time& left, float right); //////////////////////////////////////////////////////////// /// \relates Time /// \brief Overload of binary `operator/=` to scale/assign a time value /// /// \param left Left operand (a time) /// \param right Right operand (a number) /// /// \return `left` divided by `right` /// //////////////////////////////////////////////////////////// constexpr Time& operator/=(Time& left, std::int64_t right); //////////////////////////////////////////////////////////// /// \relates Time /// \brief Overload of binary `operator/` to compute the ratio of two time values /// /// \param left Left operand (a time) /// \param right Right operand (a time) /// /// \return `left` divided by `right` /// //////////////////////////////////////////////////////////// [[nodiscard]] constexpr float operator/(Time left, Time right); //////////////////////////////////////////////////////////// /// \relates Time /// \brief Overload of binary `operator%` to compute remainder of a time value /// /// \param left Left operand (a time) /// \param right Right operand (a time) /// /// \return `left` modulo `right` /// //////////////////////////////////////////////////////////// [[nodiscard]] constexpr Time operator%(Time left, Time right); //////////////////////////////////////////////////////////// /// \relates Time /// \brief Overload of binary `operator%=` to compute/assign remainder of a time value /// /// \param left Left operand (a time) /// \param right Right operand (a time) /// /// \return `left` modulo `right` /// //////////////////////////////////////////////////////////// constexpr Time& operator%=(Time& left, Time right); } // namespace sf #include //////////////////////////////////////////////////////////// /// \class sf::Time /// \ingroup system /// /// `sf::Time` encapsulates a time value in a flexible way. /// It allows to define a time value either as a number of /// seconds, milliseconds or microseconds. It also works the /// other way round: you can read a time value as either /// a number of seconds, milliseconds or microseconds. It /// even interoperates with the `` header. You can /// construct an `sf::Time` from a `chrono::duration` and read /// any `sf::Time` as a chrono::duration. /// /// By using such a flexible interface, the API doesn't /// impose any fixed type or resolution for time values, /// and let the user choose its own favorite representation. /// /// Time values support the usual mathematical operations: /// you can add or subtract two times, multiply or divide /// a time by a number, compare two times, etc. /// /// Since they represent a time span and not an absolute time /// value, times can also be negative. /// /// Usage example: /// \code /// sf::Time t1 = sf::seconds(0.1f); /// std::int32_t milli = t1.asMilliseconds(); // 100 /// /// sf::Time t2 = sf::milliseconds(30); /// std::int64_t micro = t2.asMicroseconds(); // 30'000 /// /// sf::Time t3 = sf::microseconds(-800'000); /// float sec = t3.asSeconds(); // -0.8 /// /// sf::Time t4 = std::chrono::milliseconds(250); /// std::chrono::microseconds micro2 = t4.toDuration(); // 250'000us /// \endcode /// /// \code /// void update(sf::Time elapsed) /// { /// position += speed * elapsed.asSeconds(); /// } /// /// update(sf::milliseconds(100)); /// \endcode /// /// \see `sf::Clock` /// ////////////////////////////////////////////////////////////