From d8bbc7858622b6d9c278469aab701ca0b609cddf Mon Sep 17 00:00:00 2001 From: Daniel Baumann Date: Wed, 15 May 2024 05:35:49 +0200 Subject: Merging upstream version 126.0. Signed-off-by: Daniel Baumann --- third_party/libwebrtc/stats/rtc_stats.cc | 271 +++---------------------------- 1 file changed, 26 insertions(+), 245 deletions(-) (limited to 'third_party/libwebrtc/stats/rtc_stats.cc') diff --git a/third_party/libwebrtc/stats/rtc_stats.cc b/third_party/libwebrtc/stats/rtc_stats.cc index 25bde289c2..e7d72ee3a3 100644 --- a/third_party/libwebrtc/stats/rtc_stats.cc +++ b/third_party/libwebrtc/stats/rtc_stats.cc @@ -12,125 +12,25 @@ #include -#include "rtc_base/arraysize.h" -#include "rtc_base/string_encode.h" #include "rtc_base/strings/string_builder.h" namespace webrtc { -namespace { +RTCStats::RTCStats(const RTCStats& other) + : RTCStats(other.id_, other.timestamp_) {} -// Produces "[a,b,c]". Works for non-vector `RTCStatsMemberInterface::Type` -// types. -template -std::string VectorToString(const std::vector& vector) { - rtc::StringBuilder sb; - sb << "["; - const char* separator = ""; - for (const T& element : vector) { - sb << separator << rtc::ToString(element); - separator = ","; - } - sb << "]"; - return sb.Release(); -} - -// This overload is required because std::vector range loops don't -// return references but objects, causing -Wrange-loop-analysis diagnostics. -std::string VectorToString(const std::vector& vector) { - rtc::StringBuilder sb; - sb << "["; - const char* separator = ""; - for (bool element : vector) { - sb << separator << rtc::ToString(element); - separator = ","; - } - sb << "]"; - return sb.Release(); -} - -// Produces "[\"a\",\"b\",\"c\"]". Works for vectors of both const char* and -// std::string element types. -template -std::string VectorOfStringsToString(const std::vector& strings) { - rtc::StringBuilder sb; - sb << "["; - const char* separator = ""; - for (const T& element : strings) { - sb << separator << "\"" << rtc::ToString(element) << "\""; - separator = ","; - } - sb << "]"; - return sb.Release(); -} - -template -std::string MapToString(const std::map& map) { - rtc::StringBuilder sb; - sb << "{"; - const char* separator = ""; - for (const auto& element : map) { - sb << separator << rtc::ToString(element.first) << ":" - << rtc::ToString(element.second); - separator = ","; - } - sb << "}"; - return sb.Release(); -} - -template -std::string ToStringAsDouble(const T value) { - // JSON represents numbers as floating point numbers with about 15 decimal - // digits of precision. - char buf[32]; - const int len = std::snprintf(&buf[0], arraysize(buf), "%.16g", - static_cast(value)); - RTC_DCHECK_LE(len, arraysize(buf)); - return std::string(&buf[0], len); -} - -template -std::string VectorToStringAsDouble(const std::vector& vector) { - rtc::StringBuilder sb; - sb << "["; - const char* separator = ""; - for (const T& element : vector) { - sb << separator << ToStringAsDouble(element); - separator = ","; - } - sb << "]"; - return sb.Release(); -} - -template -std::string MapToStringAsDouble(const std::map& map) { - rtc::StringBuilder sb; - sb << "{"; - const char* separator = ""; - for (const auto& element : map) { - sb << separator << "\"" << rtc::ToString(element.first) - << "\":" << ToStringAsDouble(element.second); - separator = ","; - } - sb << "}"; - return sb.Release(); -} - -} // namespace +RTCStats::~RTCStats() {} bool RTCStats::operator==(const RTCStats& other) const { if (type() != other.type() || id() != other.id()) return false; - std::vector members = Members(); - std::vector other_members = other.Members(); - RTC_DCHECK_EQ(members.size(), other_members.size()); - for (size_t i = 0; i < members.size(); ++i) { - const RTCStatsMemberInterface* member = members[i]; - const RTCStatsMemberInterface* other_member = other_members[i]; - RTC_DCHECK_EQ(member->type(), other_member->type()); - RTC_DCHECK_EQ(member->name(), other_member->name()); - if (*member != *other_member) + std::vector attributes = Attributes(); + std::vector other_attributes = other.Attributes(); + RTC_DCHECK_EQ(attributes.size(), other_attributes.size()); + for (size_t i = 0; i < attributes.size(); ++i) { + if (attributes[i] != other_attributes[i]) { return false; + } } return true; } @@ -148,150 +48,31 @@ std::string RTCStats::ToJson() const { << "\"," "\"timestamp\":" << timestamp_.us(); - for (const RTCStatsMemberInterface* member : Members()) { - if (member->is_defined()) { - sb << ",\"" << member->name() << "\":"; - if (member->is_string()) - sb << "\"" << member->ValueToJson() << "\""; - else - sb << member->ValueToJson(); + for (const Attribute& attribute : Attributes()) { + if (attribute.has_value()) { + sb << ",\"" << attribute.name() << "\":"; + if (attribute.holds_alternative()) { + sb << "\""; + } + sb << attribute.ToString(); + if (attribute.holds_alternative()) { + sb << "\""; + } } } sb << "}"; return sb.Release(); } -std::vector RTCStats::Members() const { - return MembersOfThisObjectAndAncestors(0); +std::vector RTCStats::Attributes() const { + return AttributesImpl(0); } -std::vector -RTCStats::MembersOfThisObjectAndAncestors(size_t additional_capacity) const { - std::vector members; - members.reserve(additional_capacity); - return members; +std::vector RTCStats::AttributesImpl( + size_t additional_capacity) const { + std::vector attributes; + attributes.reserve(additional_capacity); + return attributes; } -#define WEBRTC_DEFINE_RTCSTATSMEMBER(T, type, is_seq, is_str, to_str, to_json) \ - template <> \ - RTCStatsMemberInterface::Type RTCStatsMember::StaticType() { \ - return type; \ - } \ - template <> \ - bool RTCStatsMember::is_sequence() const { \ - return is_seq; \ - } \ - template <> \ - bool RTCStatsMember::is_string() const { \ - return is_str; \ - } \ - template <> \ - std::string RTCStatsMember::ValueToString() const { \ - RTC_DCHECK(value_.has_value()); \ - return to_str; \ - } \ - template <> \ - std::string RTCStatsMember::ValueToJson() const { \ - RTC_DCHECK(value_.has_value()); \ - return to_json; \ - } \ - template class RTC_EXPORT_TEMPLATE_DEFINE(RTC_EXPORT) RTCStatsMember - -WEBRTC_DEFINE_RTCSTATSMEMBER(bool, - kBool, - false, - false, - rtc::ToString(*value_), - rtc::ToString(*value_)); -WEBRTC_DEFINE_RTCSTATSMEMBER(int32_t, - kInt32, - false, - false, - rtc::ToString(*value_), - rtc::ToString(*value_)); -WEBRTC_DEFINE_RTCSTATSMEMBER(uint32_t, - kUint32, - false, - false, - rtc::ToString(*value_), - rtc::ToString(*value_)); -WEBRTC_DEFINE_RTCSTATSMEMBER(int64_t, - kInt64, - false, - false, - rtc::ToString(*value_), - ToStringAsDouble(*value_)); -WEBRTC_DEFINE_RTCSTATSMEMBER(uint64_t, - kUint64, - false, - false, - rtc::ToString(*value_), - ToStringAsDouble(*value_)); -WEBRTC_DEFINE_RTCSTATSMEMBER(double, - kDouble, - false, - false, - rtc::ToString(*value_), - ToStringAsDouble(*value_)); -WEBRTC_DEFINE_RTCSTATSMEMBER(std::string, - kString, - false, - true, - *value_, - *value_); -WEBRTC_DEFINE_RTCSTATSMEMBER(std::vector, - kSequenceBool, - true, - false, - VectorToString(*value_), - VectorToString(*value_)); -WEBRTC_DEFINE_RTCSTATSMEMBER(std::vector, - kSequenceInt32, - true, - false, - VectorToString(*value_), - VectorToString(*value_)); -WEBRTC_DEFINE_RTCSTATSMEMBER(std::vector, - kSequenceUint32, - true, - false, - VectorToString(*value_), - VectorToString(*value_)); -WEBRTC_DEFINE_RTCSTATSMEMBER(std::vector, - kSequenceInt64, - true, - false, - VectorToString(*value_), - VectorToStringAsDouble(*value_)); -WEBRTC_DEFINE_RTCSTATSMEMBER(std::vector, - kSequenceUint64, - true, - false, - VectorToString(*value_), - VectorToStringAsDouble(*value_)); -WEBRTC_DEFINE_RTCSTATSMEMBER(std::vector, - kSequenceDouble, - true, - false, - VectorToString(*value_), - VectorToStringAsDouble(*value_)); -WEBRTC_DEFINE_RTCSTATSMEMBER(std::vector, - kSequenceString, - true, - false, - VectorOfStringsToString(*value_), - VectorOfStringsToString(*value_)); -WEBRTC_DEFINE_RTCSTATSMEMBER(rtc_stats_internal::MapStringUint64, - kMapStringUint64, - false, - false, - MapToString(*value_), - MapToStringAsDouble(*value_)); -WEBRTC_DEFINE_RTCSTATSMEMBER(rtc_stats_internal::MapStringDouble, - kMapStringDouble, - false, - false, - MapToString(*value_), - MapToStringAsDouble(*value_)); - } // namespace webrtc -- cgit v1.2.3