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 <compare>
#include <cstdint>
#include <ostream>
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_