aboutsummaryrefslogtreecommitdiff
path: root/util/simple_fraction.h
diff options
context:
space:
mode:
authorColin Cross <ccross@android.com>2021-08-26 21:29:35 +0000
committerAutomerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>2021-08-26 21:29:35 +0000
commit8c1d6562996fd78350510c66e282dcb50caa1655 (patch)
tree08f815bfcdaed1c2137de2d6966e42a8870dedb0 /util/simple_fraction.h
parent8beec73fbbcaaab6785c3f9cc5a9661afcbc7fa7 (diff)
parent6b563cff6fca9ffdd14a12d33795fef8e2562a26 (diff)
downloadopenscreen-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.h54
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