/* * Copyright 2024 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. */ #ifndef API_STATS_ATTRIBUTE_H_ #define API_STATS_ATTRIBUTE_H_ #include #include #include #include #include "absl/types/optional.h" #include "absl/types/variant.h" #include "rtc_base/checks.h" #include "rtc_base/system/rtc_export.h" namespace webrtc { // A light-weight wrapper of an RTCStats attribute, i.e. an individual metric of // type absl::optional. class RTC_EXPORT Attribute { public: // All supported attribute types. typedef absl::variant*, const absl::optional*, const absl::optional*, const absl::optional*, const absl::optional*, const absl::optional*, const absl::optional*, const absl::optional>*, const absl::optional>*, const absl::optional>*, const absl::optional>*, const absl::optional>*, const absl::optional>*, const absl::optional>*, const absl::optional>*, const absl::optional>*> StatVariant; template Attribute(const char* name, const absl::optional* attribute) : name_(name), attribute_(attribute) {} const char* name() const; const StatVariant& as_variant() const; bool has_value() const; template bool holds_alternative() const { return absl::holds_alternative*>(attribute_); } template const absl::optional& as_optional() const { RTC_CHECK(holds_alternative()); return *absl::get*>(attribute_); } template const T& get() const { RTC_CHECK(holds_alternative()); RTC_CHECK(has_value()); return absl::get*>(attribute_)->value(); } bool is_sequence() const; bool is_string() const; std::string ToString() const; bool operator==(const Attribute& other) const; bool operator!=(const Attribute& other) const; private: const char* name_; StatVariant attribute_; }; struct RTC_EXPORT AttributeInit { AttributeInit(const char* name, const Attribute::StatVariant& variant); const char* name; Attribute::StatVariant variant; }; } // namespace webrtc #endif // API_STATS_ATTRIBUTE_H_