/* * Copyright 2018 The WebRTC project authors. All Rights Reserved. * * Use of this source code is governed by a BSD-style license * that can be found in the LICENSE file in the root of the source * tree. An additional intellectual property rights grant can be found * in the file PATENTS. All contributing project authors may * be found in the AUTHORS file in the root of the source tree. */ #include "rtc_base/experiments/field_trial_units.h" #include #include #include #include "absl/types/optional.h" // Large enough to fit "seconds", the longest supported unit name. #define RTC_TRIAL_UNIT_LENGTH_STR "7" #define RTC_TRIAL_UNIT_SIZE 8 namespace webrtc { namespace { struct ValueWithUnit { double value; std::string unit; }; absl::optional ParseValueWithUnit(std::string str) { if (str == "inf") { return ValueWithUnit{std::numeric_limits::infinity(), ""}; } else if (str == "-inf") { return ValueWithUnit{-std::numeric_limits::infinity(), ""}; } else { double double_val; char unit_char[RTC_TRIAL_UNIT_SIZE]; unit_char[0] = 0; if (sscanf(str.c_str(), "%lf%" RTC_TRIAL_UNIT_LENGTH_STR "s", &double_val, unit_char) >= 1) { return ValueWithUnit{double_val, unit_char}; } } return absl::nullopt; } } // namespace template <> absl::optional ParseTypedParameter(std::string str) { absl::optional result = ParseValueWithUnit(str); if (result) { if (result->unit.empty() || result->unit == "kbps") { return DataRate::KilobitsPerSec(result->value); } else if (result->unit == "bps") { return DataRate::BitsPerSec(result->value); } } return absl::nullopt; } template <> absl::optional ParseTypedParameter(std::string str) { absl::optional result = ParseValueWithUnit(str); if (result) { if (result->unit.empty() || result->unit == "bytes") return DataSize::Bytes(result->value); } return absl::nullopt; } template <> absl::optional ParseTypedParameter(std::string str) { absl::optional result = ParseValueWithUnit(str); if (result) { if (result->unit == "s" || result->unit == "seconds") { return TimeDelta::Seconds(result->value); } else if (result->unit == "us") { return TimeDelta::Micros(result->value); } else if (result->unit.empty() || result->unit == "ms") { return TimeDelta::Millis(result->value); } } return absl::nullopt; } template <> absl::optional> ParseTypedParameter>(std::string str) { return ParseOptionalParameter(str); } template <> absl::optional> ParseTypedParameter>(std::string str) { return ParseOptionalParameter(str); } template <> absl::optional> ParseTypedParameter>(std::string str) { return ParseOptionalParameter(str); } template class FieldTrialParameter; template class FieldTrialParameter; template class FieldTrialParameter; template class FieldTrialConstrained; template class FieldTrialConstrained; template class FieldTrialConstrained; template class FieldTrialOptional; template class FieldTrialOptional; template class FieldTrialOptional; } // namespace webrtc