blob: 193ea6719c535fcabc089dc8c9294c0d8255fee1 [file] [log] [blame]
 // Copyright 2022 The Fuchsia Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #ifndef SRC_CAMERA_LIB_NUMERICS_RATIONAL_H_ #define SRC_CAMERA_LIB_NUMERICS_RATIONAL_H_ #include #include #include namespace camera::numerics { // Rational represents a rational number. All operations attempt to leave the number as a reduced // fraction, but no attempt is made to detect or avoid overflow, division by zero, or other // undefined behaviors. struct Rational { int64_t n = 0; int64_t d = 1; // Transforms the number into a reduced fraction and ensures the denominator is non-negative. Rational& Reduce(); Rational& operator+=(const Rational& r); Rational& operator-=(const Rational& r); Rational& operator*=(const Rational& r); Rational& operator/=(const Rational& r); friend std::ostream& operator<<(std::ostream& os, const Rational& r); }; Rational Reduce(const Rational& r); Rational operator+(const Rational& r); Rational operator-(const Rational& r); Rational operator+(const Rational& a, const Rational& b); Rational operator-(const Rational& a, const Rational& b); Rational operator*(const Rational& a, const Rational& b); Rational operator/(const Rational& a, const Rational& b); bool operator==(const Rational& a, const Rational& b); bool operator!=(const Rational& a, const Rational& b); bool operator<(const Rational& a, const Rational& b); bool operator<=(const Rational& a, const Rational& b); bool operator>(const Rational& a, const Rational& b); bool operator>=(const Rational& a, const Rational& b); } // namespace camera::numerics #endif // SRC_CAMERA_LIB_NUMERICS_RATIONAL_H_