// Copyright 2020 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#ifndef UTIL_SIMPLE_FRACTION_H_
#define UTIL_SIMPLE_FRACTION_H_

#include <cmath>
#include <limits>
#include <string>
#include <string_view>

#include "platform/base/error.h"

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.
// 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.
class SimpleFraction {
 public:
  static ErrorOr<SimpleFraction> FromString(std::string_view value);
  std::string ToString() 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_);
  }

  constexpr int numerator() const { return numerator_; }
  constexpr int denominator() const { return denominator_; }

 private:
  int numerator_ = 0;
  int denominator_ = 1;
};

}  // namespace openscreen

#endif  // UTIL_SIMPLE_FRACTION_H_
