/* * 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/variant.h" #include "api/stats/rtc_stats_member.h" #include "rtc_base/system/rtc_export.h" namespace webrtc { // A light-weight wrapper of an RTCStats attribute (an individual metric). class RTC_EXPORT Attribute { public: // TODO(https://crbug.com/webrtc/15164): Replace uses of RTCStatsMember // with absl::optional and update these pointer types. typedef absl::variant*, const RTCStatsMember*, const RTCStatsMember*, const RTCStatsMember*, const RTCStatsMember*, const RTCStatsMember*, const RTCStatsMember*, const RTCStatsMember>*, const RTCStatsMember>*, const RTCStatsMember>*, const RTCStatsMember>*, const RTCStatsMember>*, const RTCStatsMember>*, const RTCStatsMember>*, const RTCStatsMember>*, const RTCStatsMember>*> StatVariant; template explicit Attribute(const char* name, const RTCStatsMember* 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 absl::optional as_optional() const { RTC_CHECK(holds_alternative()); if (!has_value()) { return absl::nullopt; } return absl::optional(get()); } 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_