From c2001a725978b665f0b22a4ad3865293754efd38 Mon Sep 17 00:00:00 2001 From: Max Kellermann Date: Thu, 28 Aug 2014 06:28:14 +0200 Subject: Chrono: add class SignedSongTime --- src/Chrono.hxx | 64 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 64 insertions(+) (limited to 'src') 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 { + typedef std::chrono::duration Base; + typedef Base::rep rep; + +public: + SignedSongTime() = default; + + template + 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 + 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 -- cgit v1.2.3