Commit 854258f3 authored by Max Kellermann's avatar Max Kellermann

Chrono: override operator+ and operator-

Make sure we return the correct type. This obsoletes the cast constructor trick.
parent 26f2d7fb
...@@ -21,6 +21,7 @@ ...@@ -21,6 +21,7 @@
#define MPD_CHRONO_HXX #define MPD_CHRONO_HXX
#include <chrono> #include <chrono>
#include <utility>
#include <cstdint> #include <cstdint>
/** /**
...@@ -37,13 +38,9 @@ public: ...@@ -37,13 +38,9 @@ public:
template<typename T> template<typename T>
explicit constexpr SongTime(T t):Base(t) {} explicit constexpr SongTime(T t):Base(t) {}
/** static constexpr SongTime zero() {
* This constructor allows implicit conversion from the base return SongTime(Base::zero());
* 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 SongTime(Base b):Base(b) {}
static constexpr SongTime FromS(unsigned s) { static constexpr SongTime FromS(unsigned s) {
return SongTime(rep(s) * 1000); return SongTime(rep(s) * 1000);
...@@ -81,6 +78,14 @@ public: ...@@ -81,6 +78,14 @@ public:
constexpr bool IsPositive() const { constexpr bool IsPositive() const {
return count() > 0; return count() > 0;
} }
constexpr SongTime operator+(const SongTime &other) const {
return SongTime(*(const Base *)this + (const Base &)other);
}
constexpr SongTime operator-(const SongTime &other) const {
return SongTime(*(const Base *)this - (const Base &)other);
}
}; };
/** /**
...@@ -97,13 +102,9 @@ public: ...@@ -97,13 +102,9 @@ public:
template<typename T> template<typename T>
explicit constexpr SignedSongTime(T t):Base(t) {} explicit constexpr SignedSongTime(T t):Base(t) {}
/** static constexpr SignedSongTime zero() {
* This constructor allows implicit conversion from the base return SignedSongTime(Base::zero());
* 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) { static constexpr SignedSongTime FromS(int s) {
return SignedSongTime(rep(s) * 1000); return SignedSongTime(rep(s) * 1000);
...@@ -145,6 +146,14 @@ public: ...@@ -145,6 +146,14 @@ public:
constexpr bool IsNegative() const { constexpr bool IsNegative() const {
return count() < 0; return count() < 0;
} }
constexpr SignedSongTime operator+(const SignedSongTime &other) const {
return SignedSongTime(*(const Base *)this + (const Base &)other);
}
constexpr SignedSongTime operator-(const SignedSongTime &other) const {
return SignedSongTime(*(const Base *)this - (const Base &)other);
}
}; };
#endif #endif
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment