/* * 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. */ #include "api/stats/attribute.h" #include "absl/types/variant.h" #include "rtc_base/checks.h" namespace webrtc { namespace { struct VisitIsSequence { // Any type of vector is a sequence. template bool operator()(const RTCStatsMember>* attribute) { return true; } // Any other type is not. template bool operator()(const RTCStatsMember* attribute) { return false; } }; struct VisitIsEqual { template bool operator()(const RTCStatsMember* attribute) { return attribute->IsEqual(other); } const RTCStatsMemberInterface& other; }; } // namespace Attribute::~Attribute() {} // static Attribute Attribute::FromMemberInterface( const RTCStatsMemberInterface* member) { switch (member->type()) { case RTCStatsMemberInterface::Type::kBool: return Attribute(&member->cast_to>()); case RTCStatsMemberInterface::Type::kInt32: return Attribute(&member->cast_to>()); case RTCStatsMemberInterface::Type::kUint32: return Attribute(&member->cast_to>()); case RTCStatsMemberInterface::Type::kInt64: return Attribute(&member->cast_to>()); case RTCStatsMemberInterface::Type::kUint64: return Attribute(&member->cast_to>()); case RTCStatsMemberInterface::Type::kDouble: return Attribute(&member->cast_to>()); case RTCStatsMemberInterface::Type::kString: return Attribute(&member->cast_to>()); case RTCStatsMemberInterface::Type::kSequenceBool: return Attribute(&member->cast_to>>()); case RTCStatsMemberInterface::Type::kSequenceInt32: return Attribute( &member->cast_to>>()); case RTCStatsMemberInterface::Type::kSequenceUint32: return Attribute( &member->cast_to>>()); case RTCStatsMemberInterface::Type::kSequenceInt64: return Attribute( &member->cast_to>>()); case RTCStatsMemberInterface::Type::kSequenceUint64: return Attribute( &member->cast_to>>()); case RTCStatsMemberInterface::Type::kSequenceDouble: return Attribute(&member->cast_to>>()); case RTCStatsMemberInterface::Type::kSequenceString: return Attribute( &member->cast_to>>()); case RTCStatsMemberInterface::Type::kMapStringUint64: return Attribute( &member->cast_to>>()); case RTCStatsMemberInterface::Type::kMapStringDouble: return Attribute( &member->cast_to>>()); default: RTC_CHECK_NOTREACHED(); } } const char* Attribute::name() const { return absl::visit([](const auto* attr) { return attr->name(); }, attribute_); } const Attribute::StatVariant& Attribute::as_variant() const { return attribute_; } RTCStatsMemberInterface::Type Attribute::type() const { return absl::visit([](const auto* attr) { return attr->type(); }, attribute_); } const RTCStatsMemberInterface* Attribute::member_ptr() const { return absl::visit( [](const auto* attr) { return static_cast(attr); }, attribute_); } bool Attribute::is_sequence() const { return absl::visit(VisitIsSequence(), attribute_); } bool Attribute::is_string() const { return absl::holds_alternative*>( attribute_); } bool Attribute::is_defined() const { return absl::visit([](const auto* attr) { return attr->is_defined(); }, attribute_); } std::string Attribute::ValueToString() const { return absl::visit([](const auto* attr) { return attr->ValueToString(); }, attribute_); } std::string Attribute::ValueToJson() const { return absl::visit([](const auto* attr) { return attr->ValueToJson(); }, attribute_); } bool Attribute::IsEqual(const RTCStatsMemberInterface& other) const { return absl::visit(VisitIsEqual{.other = *other.member_ptr()}, attribute_); } } // namespace webrtc