diff options
author | Colin Cross <ccross@android.com> | 2021-08-26 21:29:35 +0000 |
---|---|---|
committer | Automerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com> | 2021-08-26 21:29:35 +0000 |
commit | 8c1d6562996fd78350510c66e282dcb50caa1655 (patch) | |
tree | 08f815bfcdaed1c2137de2d6966e42a8870dedb0 /util/simple_fraction.h | |
parent | 8beec73fbbcaaab6785c3f9cc5a9661afcbc7fa7 (diff) | |
parent | 6b563cff6fca9ffdd14a12d33795fef8e2562a26 (diff) | |
download | openscreen-8c1d6562996fd78350510c66e282dcb50caa1655.tar.gz |
Upgrade openscreen to f54d92523c9f2c8c5afb99e05fed70e4b8772b1c am: 6b563cff6fandroid-s-v2-preview-2android-s-v2-preview-1android-s-v2-beta-2android-s-v2-preview-1
Original change: https://android-review.googlesource.com/c/platform/external/openscreen/+/1810936
Change-Id: I4af446c4bf4a92bc6fe1c6da2ac036a530aee809
Diffstat (limited to 'util/simple_fraction.h')
-rw-r--r-- | util/simple_fraction.h | 54 |
1 files changed, 41 insertions, 13 deletions
diff --git a/util/simple_fraction.h b/util/simple_fraction.h index f8ab5083..2df45e24 100644 --- a/util/simple_fraction.h +++ b/util/simple_fraction.h @@ -5,6 +5,8 @@ #ifndef UTIL_SIMPLE_FRACTION_H_ #define UTIL_SIMPLE_FRACTION_H_ +#include <cmath> +#include <limits> #include <string> #include "absl/strings/string_view.h" @@ -14,30 +16,56 @@ namespace openscreen { // SimpleFraction is used to represent simple (or "common") fractions, composed // of a rational number written a/b where a and b are both integers. - -// Note: Since SimpleFraction is a trivial type, it comes with a -// default constructor and is copyable, as well as allowing static -// initialization. - // Some helpful notes on SimpleFraction assumptions/limitations: // 1. SimpleFraction does not perform reductions. 2/4 != 1/2, and -1/-1 != 1/1. // 2. denominator = 0 is considered undefined. // 3. numerator = saturates range to int min or int max // 4. A SimpleFraction is "positive" if and only if it is defined and at least // equal to zero. Since reductions are not performed, -1/-1 is negative. -struct SimpleFraction { +class SimpleFraction { + public: static ErrorOr<SimpleFraction> FromString(absl::string_view value); std::string ToString() const; - bool operator==(const SimpleFraction& other) const; - bool operator!=(const SimpleFraction& other) const; + constexpr SimpleFraction() = default; + constexpr SimpleFraction(int numerator) // NOLINT + : numerator_(numerator) {} + constexpr SimpleFraction(int numerator, int denominator) + : numerator_(numerator), denominator_(denominator) {} + + constexpr SimpleFraction(const SimpleFraction&) = default; + constexpr SimpleFraction(SimpleFraction&&) noexcept = default; + constexpr SimpleFraction& operator=(const SimpleFraction&) = default; + constexpr SimpleFraction& operator=(SimpleFraction&&) = default; + ~SimpleFraction() = default; + + constexpr bool operator==(const SimpleFraction& other) const { + return numerator_ == other.numerator_ && denominator_ == other.denominator_; + } + + constexpr bool operator!=(const SimpleFraction& other) const { + return !(*this == other); + } + + constexpr bool is_defined() const { return denominator_ != 0; } + + constexpr bool is_positive() const { + return (numerator_ >= 0) && (denominator_ > 0); + } + + constexpr explicit operator double() const { + if (denominator_ == 0) { + return nan(""); + } + return static_cast<double>(numerator_) / static_cast<double>(denominator_); + } - bool is_defined() const; - bool is_positive() const; - explicit operator double() const; + constexpr int numerator() const { return numerator_; } + constexpr int denominator() const { return denominator_; } - int numerator = 0; - int denominator = 0; + private: + int numerator_ = 0; + int denominator_ = 1; }; } // namespace openscreen |