#ifndef RTC_BASE_EXPERIMENTS_FIELD_TRIAL_PARSER_H_
#define RTC_BASE_EXPERIMENTS_FIELD_TRIAL_PARSER_H_
#include <stdint.h>
#include <initializer_list>
#include <map>
#include <set>
#include <string>
#include <vector>
#include "absl/strings/string_view.h"
#include "absl/types/optional.h"
namespace webrtc {
class FieldTrialParameterInterface { … };
void ParseFieldTrial(
std::initializer_list<FieldTrialParameterInterface*> fields,
absl::string_view trial_string);
template <typename T>
absl::optional<T> ParseTypedParameter(absl::string_view);
template <typename T>
class FieldTrialParameter : public FieldTrialParameterInterface { … };
template <typename T>
class FieldTrialConstrained : public FieldTrialParameterInterface { … };
class AbstractFieldTrialEnum : public FieldTrialParameterInterface { … };
template <typename T>
class FieldTrialEnum : public AbstractFieldTrialEnum { … };
template <typename T>
class FieldTrialOptional : public FieldTrialParameterInterface { … };
class FieldTrialFlag : public FieldTrialParameterInterface { … };
template <typename T>
absl::optional<absl::optional<T>> ParseOptionalParameter(
absl::string_view str) { … }
template <>
absl::optional<bool> ParseTypedParameter<bool>(absl::string_view str);
template <>
absl::optional<double> ParseTypedParameter<double>(absl::string_view str);
template <>
absl::optional<int> ParseTypedParameter<int>(absl::string_view str);
template <>
absl::optional<unsigned> ParseTypedParameter<unsigned>(absl::string_view str);
template <>
absl::optional<std::string> ParseTypedParameter<std::string>(
absl::string_view str);
template <>
absl::optional<absl::optional<bool>> ParseTypedParameter<absl::optional<bool>>(
absl::string_view str);
template <>
absl::optional<absl::optional<int>> ParseTypedParameter<absl::optional<int>>(
absl::string_view str);
template <>
absl::optional<absl::optional<unsigned>>
ParseTypedParameter<absl::optional<unsigned>>(absl::string_view str);
template <>
absl::optional<absl::optional<double>>
ParseTypedParameter<absl::optional<double>>(absl::string_view str);
extern template class FieldTrialParameter<bool>;
extern template class FieldTrialParameter<double>;
extern template class FieldTrialParameter<int>;
extern template class FieldTrialParameter<unsigned>;
extern template class FieldTrialParameter<std::string>;
extern template class FieldTrialConstrained<double>;
extern template class FieldTrialConstrained<int>;
extern template class FieldTrialConstrained<unsigned>;
extern template class FieldTrialOptional<double>;
extern template class FieldTrialOptional<int>;
extern template class FieldTrialOptional<unsigned>;
extern template class FieldTrialOptional<bool>;
extern template class FieldTrialOptional<std::string>;
}
#endif