1*3f982cf4SFabien Sanglard // Copyright 2020 The Chromium Authors. All rights reserved. 2*3f982cf4SFabien Sanglard // Use of this source code is governed by a BSD-style license that can be 3*3f982cf4SFabien Sanglard // found in the LICENSE file. 4*3f982cf4SFabien Sanglard 5*3f982cf4SFabien Sanglard #include "util/simple_fraction.h" 6*3f982cf4SFabien Sanglard 7*3f982cf4SFabien Sanglard #include <cmath> 8*3f982cf4SFabien Sanglard #include <limits> 9*3f982cf4SFabien Sanglard #include <vector> 10*3f982cf4SFabien Sanglard 11*3f982cf4SFabien Sanglard #include "absl/strings/str_cat.h" 12*3f982cf4SFabien Sanglard #include "absl/strings/str_split.h" 13*3f982cf4SFabien Sanglard #include "util/osp_logging.h" 14*3f982cf4SFabien Sanglard 15*3f982cf4SFabien Sanglard namespace openscreen { 16*3f982cf4SFabien Sanglard 17*3f982cf4SFabien Sanglard // static FromString(absl::string_view value)18*3f982cf4SFabien SanglardErrorOr<SimpleFraction> SimpleFraction::FromString(absl::string_view value) { 19*3f982cf4SFabien Sanglard std::vector<absl::string_view> fields = absl::StrSplit(value, '/'); 20*3f982cf4SFabien Sanglard if (fields.size() != 1 && fields.size() != 2) { 21*3f982cf4SFabien Sanglard return Error::Code::kParameterInvalid; 22*3f982cf4SFabien Sanglard } 23*3f982cf4SFabien Sanglard 24*3f982cf4SFabien Sanglard int numerator; 25*3f982cf4SFabien Sanglard int denominator = 1; 26*3f982cf4SFabien Sanglard if (!absl::SimpleAtoi(fields[0], &numerator)) { 27*3f982cf4SFabien Sanglard return Error::Code::kParameterInvalid; 28*3f982cf4SFabien Sanglard } 29*3f982cf4SFabien Sanglard 30*3f982cf4SFabien Sanglard if (fields.size() == 2) { 31*3f982cf4SFabien Sanglard if (!absl::SimpleAtoi(fields[1], &denominator)) { 32*3f982cf4SFabien Sanglard return Error::Code::kParameterInvalid; 33*3f982cf4SFabien Sanglard } 34*3f982cf4SFabien Sanglard } 35*3f982cf4SFabien Sanglard 36*3f982cf4SFabien Sanglard return SimpleFraction(numerator, denominator); 37*3f982cf4SFabien Sanglard } 38*3f982cf4SFabien Sanglard ToString() const39*3f982cf4SFabien Sanglardstd::string SimpleFraction::ToString() const { 40*3f982cf4SFabien Sanglard if (denominator_ == 1) { 41*3f982cf4SFabien Sanglard return std::to_string(numerator_); 42*3f982cf4SFabien Sanglard } 43*3f982cf4SFabien Sanglard return absl::StrCat(numerator_, "/", denominator_); 44*3f982cf4SFabien Sanglard } 45*3f982cf4SFabien Sanglard 46*3f982cf4SFabien Sanglard } // namespace openscreen 47