diff options
author | Max Kellermann <max@duempel.org> | 2014-08-28 06:28:14 +0200 |
---|---|---|
committer | Max Kellermann <max@duempel.org> | 2014-08-28 06:42:04 +0200 |
commit | c2001a725978b665f0b22a4ad3865293754efd38 (patch) | |
tree | fe6a1cdf3c3d53c7aabf93dccfba3f9a8ab91815 /src/Chrono.hxx | |
parent | 78f911ac1911e0ebdab3afd26683653d416c08f0 (diff) | |
download | mpd-c2001a725978b665f0b22a4ad3865293754efd38.tar.gz mpd-c2001a725978b665f0b22a4ad3865293754efd38.tar.xz mpd-c2001a725978b665f0b22a4ad3865293754efd38.zip |
Chrono: add class SignedSongTime
Diffstat (limited to '')
-rw-r--r-- | src/Chrono.hxx | 64 |
1 files changed, 64 insertions, 0 deletions
diff --git a/src/Chrono.hxx b/src/Chrono.hxx index f20edaf59..9832a680f 100644 --- a/src/Chrono.hxx +++ b/src/Chrono.hxx @@ -83,4 +83,68 @@ public: } }; +/** + * A variant of #SongTime that is based on a signed integer. It can + * be used for relative values. + */ +class SignedSongTime : public std::chrono::duration<std::int32_t, std::milli> { + typedef std::chrono::duration<std::int32_t, std::milli> Base; + typedef Base::rep rep; + +public: + SignedSongTime() = default; + + template<typename T> + explicit constexpr SignedSongTime(T t):Base(t) {} + + /** + * This constructor allows implicit conversion from the base + * class to this class. It is necessary because all of + * std::chrono::duration's operators return another + * std::chrono::duration and not an instance of this class. + */ + constexpr SignedSongTime(Base b):Base(b) {} + + static constexpr SignedSongTime FromS(int s) { + return SignedSongTime(rep(s) * 1000); + } + + static constexpr SignedSongTime FromS(float s) { + return SignedSongTime(rep(s * 1000)); + } + + static constexpr SignedSongTime FromS(double s) { + return SignedSongTime(rep(s * 1000)); + } + + static constexpr SignedSongTime FromMS(rep ms) { + return SignedSongTime(ms); + } + + constexpr rep ToMS() const { + return count(); + } + + template<typename T=rep> + constexpr T ToScale(unsigned base) const { + return count() * T(base) / 1000; + } + + constexpr double ToDoubleS() const { + return double(count()) / 1000.; + }; + + constexpr bool IsZero() const { + return count() == 0; + } + + constexpr bool IsPositive() const { + return count() > 0; + } + + constexpr bool IsNegative() const { + return count() < 0; + } +}; + #endif |