1*d9f75844SAndroid Build Coastguard Worker /*
2*d9f75844SAndroid Build Coastguard Worker * Copyright 2016 The WebRTC Project Authors. All rights reserved.
3*d9f75844SAndroid Build Coastguard Worker *
4*d9f75844SAndroid Build Coastguard Worker * Use of this source code is governed by a BSD-style license
5*d9f75844SAndroid Build Coastguard Worker * that can be found in the LICENSE file in the root of the source
6*d9f75844SAndroid Build Coastguard Worker * tree. An additional intellectual property rights grant can be found
7*d9f75844SAndroid Build Coastguard Worker * in the file PATENTS. All contributing project authors may
8*d9f75844SAndroid Build Coastguard Worker * be found in the AUTHORS file in the root of the source tree.
9*d9f75844SAndroid Build Coastguard Worker */
10*d9f75844SAndroid Build Coastguard Worker
11*d9f75844SAndroid Build Coastguard Worker #include "api/stats/rtc_stats.h"
12*d9f75844SAndroid Build Coastguard Worker
13*d9f75844SAndroid Build Coastguard Worker #include <cstdio>
14*d9f75844SAndroid Build Coastguard Worker
15*d9f75844SAndroid Build Coastguard Worker #include "rtc_base/arraysize.h"
16*d9f75844SAndroid Build Coastguard Worker #include "rtc_base/string_encode.h"
17*d9f75844SAndroid Build Coastguard Worker #include "rtc_base/strings/string_builder.h"
18*d9f75844SAndroid Build Coastguard Worker
19*d9f75844SAndroid Build Coastguard Worker namespace webrtc {
20*d9f75844SAndroid Build Coastguard Worker
21*d9f75844SAndroid Build Coastguard Worker namespace {
22*d9f75844SAndroid Build Coastguard Worker
23*d9f75844SAndroid Build Coastguard Worker // Produces "[a,b,c]". Works for non-vector `RTCStatsMemberInterface::Type`
24*d9f75844SAndroid Build Coastguard Worker // types.
25*d9f75844SAndroid Build Coastguard Worker template <typename T>
VectorToString(const std::vector<T> & vector)26*d9f75844SAndroid Build Coastguard Worker std::string VectorToString(const std::vector<T>& vector) {
27*d9f75844SAndroid Build Coastguard Worker rtc::StringBuilder sb;
28*d9f75844SAndroid Build Coastguard Worker sb << "[";
29*d9f75844SAndroid Build Coastguard Worker const char* separator = "";
30*d9f75844SAndroid Build Coastguard Worker for (const T& element : vector) {
31*d9f75844SAndroid Build Coastguard Worker sb << separator << rtc::ToString(element);
32*d9f75844SAndroid Build Coastguard Worker separator = ",";
33*d9f75844SAndroid Build Coastguard Worker }
34*d9f75844SAndroid Build Coastguard Worker sb << "]";
35*d9f75844SAndroid Build Coastguard Worker return sb.Release();
36*d9f75844SAndroid Build Coastguard Worker }
37*d9f75844SAndroid Build Coastguard Worker
38*d9f75844SAndroid Build Coastguard Worker // This overload is required because std::vector<bool> range loops don't
39*d9f75844SAndroid Build Coastguard Worker // return references but objects, causing -Wrange-loop-analysis diagnostics.
VectorToString(const std::vector<bool> & vector)40*d9f75844SAndroid Build Coastguard Worker std::string VectorToString(const std::vector<bool>& vector) {
41*d9f75844SAndroid Build Coastguard Worker rtc::StringBuilder sb;
42*d9f75844SAndroid Build Coastguard Worker sb << "[";
43*d9f75844SAndroid Build Coastguard Worker const char* separator = "";
44*d9f75844SAndroid Build Coastguard Worker for (bool element : vector) {
45*d9f75844SAndroid Build Coastguard Worker sb << separator << rtc::ToString(element);
46*d9f75844SAndroid Build Coastguard Worker separator = ",";
47*d9f75844SAndroid Build Coastguard Worker }
48*d9f75844SAndroid Build Coastguard Worker sb << "]";
49*d9f75844SAndroid Build Coastguard Worker return sb.Release();
50*d9f75844SAndroid Build Coastguard Worker }
51*d9f75844SAndroid Build Coastguard Worker
52*d9f75844SAndroid Build Coastguard Worker // Produces "[\"a\",\"b\",\"c\"]". Works for vectors of both const char* and
53*d9f75844SAndroid Build Coastguard Worker // std::string element types.
54*d9f75844SAndroid Build Coastguard Worker template <typename T>
VectorOfStringsToString(const std::vector<T> & strings)55*d9f75844SAndroid Build Coastguard Worker std::string VectorOfStringsToString(const std::vector<T>& strings) {
56*d9f75844SAndroid Build Coastguard Worker rtc::StringBuilder sb;
57*d9f75844SAndroid Build Coastguard Worker sb << "[";
58*d9f75844SAndroid Build Coastguard Worker const char* separator = "";
59*d9f75844SAndroid Build Coastguard Worker for (const T& element : strings) {
60*d9f75844SAndroid Build Coastguard Worker sb << separator << "\"" << rtc::ToString(element) << "\"";
61*d9f75844SAndroid Build Coastguard Worker separator = ",";
62*d9f75844SAndroid Build Coastguard Worker }
63*d9f75844SAndroid Build Coastguard Worker sb << "]";
64*d9f75844SAndroid Build Coastguard Worker return sb.Release();
65*d9f75844SAndroid Build Coastguard Worker }
66*d9f75844SAndroid Build Coastguard Worker
67*d9f75844SAndroid Build Coastguard Worker template <typename T>
MapToString(const std::map<std::string,T> & map)68*d9f75844SAndroid Build Coastguard Worker std::string MapToString(const std::map<std::string, T>& map) {
69*d9f75844SAndroid Build Coastguard Worker rtc::StringBuilder sb;
70*d9f75844SAndroid Build Coastguard Worker sb << "{";
71*d9f75844SAndroid Build Coastguard Worker const char* separator = "";
72*d9f75844SAndroid Build Coastguard Worker for (const auto& element : map) {
73*d9f75844SAndroid Build Coastguard Worker sb << separator << rtc::ToString(element.first) << ":"
74*d9f75844SAndroid Build Coastguard Worker << rtc::ToString(element.second);
75*d9f75844SAndroid Build Coastguard Worker separator = ",";
76*d9f75844SAndroid Build Coastguard Worker }
77*d9f75844SAndroid Build Coastguard Worker sb << "}";
78*d9f75844SAndroid Build Coastguard Worker return sb.Release();
79*d9f75844SAndroid Build Coastguard Worker }
80*d9f75844SAndroid Build Coastguard Worker
81*d9f75844SAndroid Build Coastguard Worker template <typename T>
ToStringAsDouble(const T value)82*d9f75844SAndroid Build Coastguard Worker std::string ToStringAsDouble(const T value) {
83*d9f75844SAndroid Build Coastguard Worker // JSON represents numbers as floating point numbers with about 15 decimal
84*d9f75844SAndroid Build Coastguard Worker // digits of precision.
85*d9f75844SAndroid Build Coastguard Worker char buf[32];
86*d9f75844SAndroid Build Coastguard Worker const int len = std::snprintf(&buf[0], arraysize(buf), "%.16g",
87*d9f75844SAndroid Build Coastguard Worker static_cast<double>(value));
88*d9f75844SAndroid Build Coastguard Worker RTC_DCHECK_LE(len, arraysize(buf));
89*d9f75844SAndroid Build Coastguard Worker return std::string(&buf[0], len);
90*d9f75844SAndroid Build Coastguard Worker }
91*d9f75844SAndroid Build Coastguard Worker
92*d9f75844SAndroid Build Coastguard Worker template <typename T>
VectorToStringAsDouble(const std::vector<T> & vector)93*d9f75844SAndroid Build Coastguard Worker std::string VectorToStringAsDouble(const std::vector<T>& vector) {
94*d9f75844SAndroid Build Coastguard Worker rtc::StringBuilder sb;
95*d9f75844SAndroid Build Coastguard Worker sb << "[";
96*d9f75844SAndroid Build Coastguard Worker const char* separator = "";
97*d9f75844SAndroid Build Coastguard Worker for (const T& element : vector) {
98*d9f75844SAndroid Build Coastguard Worker sb << separator << ToStringAsDouble<T>(element);
99*d9f75844SAndroid Build Coastguard Worker separator = ",";
100*d9f75844SAndroid Build Coastguard Worker }
101*d9f75844SAndroid Build Coastguard Worker sb << "]";
102*d9f75844SAndroid Build Coastguard Worker return sb.Release();
103*d9f75844SAndroid Build Coastguard Worker }
104*d9f75844SAndroid Build Coastguard Worker
105*d9f75844SAndroid Build Coastguard Worker template <typename T>
MapToStringAsDouble(const std::map<std::string,T> & map)106*d9f75844SAndroid Build Coastguard Worker std::string MapToStringAsDouble(const std::map<std::string, T>& map) {
107*d9f75844SAndroid Build Coastguard Worker rtc::StringBuilder sb;
108*d9f75844SAndroid Build Coastguard Worker sb << "{";
109*d9f75844SAndroid Build Coastguard Worker const char* separator = "";
110*d9f75844SAndroid Build Coastguard Worker for (const auto& element : map) {
111*d9f75844SAndroid Build Coastguard Worker sb << separator << "\"" << rtc::ToString(element.first)
112*d9f75844SAndroid Build Coastguard Worker << "\":" << ToStringAsDouble(element.second);
113*d9f75844SAndroid Build Coastguard Worker separator = ",";
114*d9f75844SAndroid Build Coastguard Worker }
115*d9f75844SAndroid Build Coastguard Worker sb << "}";
116*d9f75844SAndroid Build Coastguard Worker return sb.Release();
117*d9f75844SAndroid Build Coastguard Worker }
118*d9f75844SAndroid Build Coastguard Worker
119*d9f75844SAndroid Build Coastguard Worker } // namespace
120*d9f75844SAndroid Build Coastguard Worker
operator ==(const RTCStats & other) const121*d9f75844SAndroid Build Coastguard Worker bool RTCStats::operator==(const RTCStats& other) const {
122*d9f75844SAndroid Build Coastguard Worker if (type() != other.type() || id() != other.id())
123*d9f75844SAndroid Build Coastguard Worker return false;
124*d9f75844SAndroid Build Coastguard Worker std::vector<const RTCStatsMemberInterface*> members = Members();
125*d9f75844SAndroid Build Coastguard Worker std::vector<const RTCStatsMemberInterface*> other_members = other.Members();
126*d9f75844SAndroid Build Coastguard Worker RTC_DCHECK_EQ(members.size(), other_members.size());
127*d9f75844SAndroid Build Coastguard Worker for (size_t i = 0; i < members.size(); ++i) {
128*d9f75844SAndroid Build Coastguard Worker const RTCStatsMemberInterface* member = members[i];
129*d9f75844SAndroid Build Coastguard Worker const RTCStatsMemberInterface* other_member = other_members[i];
130*d9f75844SAndroid Build Coastguard Worker RTC_DCHECK_EQ(member->type(), other_member->type());
131*d9f75844SAndroid Build Coastguard Worker RTC_DCHECK_EQ(member->name(), other_member->name());
132*d9f75844SAndroid Build Coastguard Worker if (*member != *other_member)
133*d9f75844SAndroid Build Coastguard Worker return false;
134*d9f75844SAndroid Build Coastguard Worker }
135*d9f75844SAndroid Build Coastguard Worker return true;
136*d9f75844SAndroid Build Coastguard Worker }
137*d9f75844SAndroid Build Coastguard Worker
operator !=(const RTCStats & other) const138*d9f75844SAndroid Build Coastguard Worker bool RTCStats::operator!=(const RTCStats& other) const {
139*d9f75844SAndroid Build Coastguard Worker return !(*this == other);
140*d9f75844SAndroid Build Coastguard Worker }
141*d9f75844SAndroid Build Coastguard Worker
ToJson() const142*d9f75844SAndroid Build Coastguard Worker std::string RTCStats::ToJson() const {
143*d9f75844SAndroid Build Coastguard Worker rtc::StringBuilder sb;
144*d9f75844SAndroid Build Coastguard Worker sb << "{\"type\":\"" << type()
145*d9f75844SAndroid Build Coastguard Worker << "\","
146*d9f75844SAndroid Build Coastguard Worker "\"id\":\""
147*d9f75844SAndroid Build Coastguard Worker << id_
148*d9f75844SAndroid Build Coastguard Worker << "\","
149*d9f75844SAndroid Build Coastguard Worker "\"timestamp\":"
150*d9f75844SAndroid Build Coastguard Worker << timestamp_us_;
151*d9f75844SAndroid Build Coastguard Worker for (const RTCStatsMemberInterface* member : Members()) {
152*d9f75844SAndroid Build Coastguard Worker if (member->is_defined()) {
153*d9f75844SAndroid Build Coastguard Worker sb << ",\"" << member->name() << "\":";
154*d9f75844SAndroid Build Coastguard Worker if (member->is_string())
155*d9f75844SAndroid Build Coastguard Worker sb << "\"" << member->ValueToJson() << "\"";
156*d9f75844SAndroid Build Coastguard Worker else
157*d9f75844SAndroid Build Coastguard Worker sb << member->ValueToJson();
158*d9f75844SAndroid Build Coastguard Worker }
159*d9f75844SAndroid Build Coastguard Worker }
160*d9f75844SAndroid Build Coastguard Worker sb << "}";
161*d9f75844SAndroid Build Coastguard Worker return sb.Release();
162*d9f75844SAndroid Build Coastguard Worker }
163*d9f75844SAndroid Build Coastguard Worker
Members() const164*d9f75844SAndroid Build Coastguard Worker std::vector<const RTCStatsMemberInterface*> RTCStats::Members() const {
165*d9f75844SAndroid Build Coastguard Worker return MembersOfThisObjectAndAncestors(0);
166*d9f75844SAndroid Build Coastguard Worker }
167*d9f75844SAndroid Build Coastguard Worker
168*d9f75844SAndroid Build Coastguard Worker std::vector<const RTCStatsMemberInterface*>
MembersOfThisObjectAndAncestors(size_t additional_capacity) const169*d9f75844SAndroid Build Coastguard Worker RTCStats::MembersOfThisObjectAndAncestors(size_t additional_capacity) const {
170*d9f75844SAndroid Build Coastguard Worker std::vector<const RTCStatsMemberInterface*> members;
171*d9f75844SAndroid Build Coastguard Worker members.reserve(additional_capacity);
172*d9f75844SAndroid Build Coastguard Worker return members;
173*d9f75844SAndroid Build Coastguard Worker }
174*d9f75844SAndroid Build Coastguard Worker
175*d9f75844SAndroid Build Coastguard Worker #define WEBRTC_DEFINE_RTCSTATSMEMBER(T, type, is_seq, is_str, to_str, to_json) \
176*d9f75844SAndroid Build Coastguard Worker template <> \
177*d9f75844SAndroid Build Coastguard Worker RTCStatsMemberInterface::Type RTCStatsMember<T>::StaticType() { \
178*d9f75844SAndroid Build Coastguard Worker return type; \
179*d9f75844SAndroid Build Coastguard Worker } \
180*d9f75844SAndroid Build Coastguard Worker template <> \
181*d9f75844SAndroid Build Coastguard Worker bool RTCStatsMember<T>::is_sequence() const { \
182*d9f75844SAndroid Build Coastguard Worker return is_seq; \
183*d9f75844SAndroid Build Coastguard Worker } \
184*d9f75844SAndroid Build Coastguard Worker template <> \
185*d9f75844SAndroid Build Coastguard Worker bool RTCStatsMember<T>::is_string() const { \
186*d9f75844SAndroid Build Coastguard Worker return is_str; \
187*d9f75844SAndroid Build Coastguard Worker } \
188*d9f75844SAndroid Build Coastguard Worker template <> \
189*d9f75844SAndroid Build Coastguard Worker std::string RTCStatsMember<T>::ValueToString() const { \
190*d9f75844SAndroid Build Coastguard Worker RTC_DCHECK(value_.has_value()); \
191*d9f75844SAndroid Build Coastguard Worker return to_str; \
192*d9f75844SAndroid Build Coastguard Worker } \
193*d9f75844SAndroid Build Coastguard Worker template <> \
194*d9f75844SAndroid Build Coastguard Worker std::string RTCStatsMember<T>::ValueToJson() const { \
195*d9f75844SAndroid Build Coastguard Worker RTC_DCHECK(value_.has_value()); \
196*d9f75844SAndroid Build Coastguard Worker return to_json; \
197*d9f75844SAndroid Build Coastguard Worker } \
198*d9f75844SAndroid Build Coastguard Worker template class RTC_EXPORT_TEMPLATE_DEFINE(RTC_EXPORT) RTCStatsMember<T>
199*d9f75844SAndroid Build Coastguard Worker
200*d9f75844SAndroid Build Coastguard Worker WEBRTC_DEFINE_RTCSTATSMEMBER(bool,
201*d9f75844SAndroid Build Coastguard Worker kBool,
202*d9f75844SAndroid Build Coastguard Worker false,
203*d9f75844SAndroid Build Coastguard Worker false,
204*d9f75844SAndroid Build Coastguard Worker rtc::ToString(*value_),
205*d9f75844SAndroid Build Coastguard Worker rtc::ToString(*value_));
206*d9f75844SAndroid Build Coastguard Worker WEBRTC_DEFINE_RTCSTATSMEMBER(int32_t,
207*d9f75844SAndroid Build Coastguard Worker kInt32,
208*d9f75844SAndroid Build Coastguard Worker false,
209*d9f75844SAndroid Build Coastguard Worker false,
210*d9f75844SAndroid Build Coastguard Worker rtc::ToString(*value_),
211*d9f75844SAndroid Build Coastguard Worker rtc::ToString(*value_));
212*d9f75844SAndroid Build Coastguard Worker WEBRTC_DEFINE_RTCSTATSMEMBER(uint32_t,
213*d9f75844SAndroid Build Coastguard Worker kUint32,
214*d9f75844SAndroid Build Coastguard Worker false,
215*d9f75844SAndroid Build Coastguard Worker false,
216*d9f75844SAndroid Build Coastguard Worker rtc::ToString(*value_),
217*d9f75844SAndroid Build Coastguard Worker rtc::ToString(*value_));
218*d9f75844SAndroid Build Coastguard Worker WEBRTC_DEFINE_RTCSTATSMEMBER(int64_t,
219*d9f75844SAndroid Build Coastguard Worker kInt64,
220*d9f75844SAndroid Build Coastguard Worker false,
221*d9f75844SAndroid Build Coastguard Worker false,
222*d9f75844SAndroid Build Coastguard Worker rtc::ToString(*value_),
223*d9f75844SAndroid Build Coastguard Worker ToStringAsDouble(*value_));
224*d9f75844SAndroid Build Coastguard Worker WEBRTC_DEFINE_RTCSTATSMEMBER(uint64_t,
225*d9f75844SAndroid Build Coastguard Worker kUint64,
226*d9f75844SAndroid Build Coastguard Worker false,
227*d9f75844SAndroid Build Coastguard Worker false,
228*d9f75844SAndroid Build Coastguard Worker rtc::ToString(*value_),
229*d9f75844SAndroid Build Coastguard Worker ToStringAsDouble(*value_));
230*d9f75844SAndroid Build Coastguard Worker WEBRTC_DEFINE_RTCSTATSMEMBER(double,
231*d9f75844SAndroid Build Coastguard Worker kDouble,
232*d9f75844SAndroid Build Coastguard Worker false,
233*d9f75844SAndroid Build Coastguard Worker false,
234*d9f75844SAndroid Build Coastguard Worker rtc::ToString(*value_),
235*d9f75844SAndroid Build Coastguard Worker ToStringAsDouble(*value_));
236*d9f75844SAndroid Build Coastguard Worker WEBRTC_DEFINE_RTCSTATSMEMBER(std::string,
237*d9f75844SAndroid Build Coastguard Worker kString,
238*d9f75844SAndroid Build Coastguard Worker false,
239*d9f75844SAndroid Build Coastguard Worker true,
240*d9f75844SAndroid Build Coastguard Worker *value_,
241*d9f75844SAndroid Build Coastguard Worker *value_);
242*d9f75844SAndroid Build Coastguard Worker WEBRTC_DEFINE_RTCSTATSMEMBER(std::vector<bool>,
243*d9f75844SAndroid Build Coastguard Worker kSequenceBool,
244*d9f75844SAndroid Build Coastguard Worker true,
245*d9f75844SAndroid Build Coastguard Worker false,
246*d9f75844SAndroid Build Coastguard Worker VectorToString(*value_),
247*d9f75844SAndroid Build Coastguard Worker VectorToString(*value_));
248*d9f75844SAndroid Build Coastguard Worker WEBRTC_DEFINE_RTCSTATSMEMBER(std::vector<int32_t>,
249*d9f75844SAndroid Build Coastguard Worker kSequenceInt32,
250*d9f75844SAndroid Build Coastguard Worker true,
251*d9f75844SAndroid Build Coastguard Worker false,
252*d9f75844SAndroid Build Coastguard Worker VectorToString(*value_),
253*d9f75844SAndroid Build Coastguard Worker VectorToString(*value_));
254*d9f75844SAndroid Build Coastguard Worker WEBRTC_DEFINE_RTCSTATSMEMBER(std::vector<uint32_t>,
255*d9f75844SAndroid Build Coastguard Worker kSequenceUint32,
256*d9f75844SAndroid Build Coastguard Worker true,
257*d9f75844SAndroid Build Coastguard Worker false,
258*d9f75844SAndroid Build Coastguard Worker VectorToString(*value_),
259*d9f75844SAndroid Build Coastguard Worker VectorToString(*value_));
260*d9f75844SAndroid Build Coastguard Worker WEBRTC_DEFINE_RTCSTATSMEMBER(std::vector<int64_t>,
261*d9f75844SAndroid Build Coastguard Worker kSequenceInt64,
262*d9f75844SAndroid Build Coastguard Worker true,
263*d9f75844SAndroid Build Coastguard Worker false,
264*d9f75844SAndroid Build Coastguard Worker VectorToString(*value_),
265*d9f75844SAndroid Build Coastguard Worker VectorToStringAsDouble(*value_));
266*d9f75844SAndroid Build Coastguard Worker WEBRTC_DEFINE_RTCSTATSMEMBER(std::vector<uint64_t>,
267*d9f75844SAndroid Build Coastguard Worker kSequenceUint64,
268*d9f75844SAndroid Build Coastguard Worker true,
269*d9f75844SAndroid Build Coastguard Worker false,
270*d9f75844SAndroid Build Coastguard Worker VectorToString(*value_),
271*d9f75844SAndroid Build Coastguard Worker VectorToStringAsDouble(*value_));
272*d9f75844SAndroid Build Coastguard Worker WEBRTC_DEFINE_RTCSTATSMEMBER(std::vector<double>,
273*d9f75844SAndroid Build Coastguard Worker kSequenceDouble,
274*d9f75844SAndroid Build Coastguard Worker true,
275*d9f75844SAndroid Build Coastguard Worker false,
276*d9f75844SAndroid Build Coastguard Worker VectorToString(*value_),
277*d9f75844SAndroid Build Coastguard Worker VectorToStringAsDouble(*value_));
278*d9f75844SAndroid Build Coastguard Worker WEBRTC_DEFINE_RTCSTATSMEMBER(std::vector<std::string>,
279*d9f75844SAndroid Build Coastguard Worker kSequenceString,
280*d9f75844SAndroid Build Coastguard Worker true,
281*d9f75844SAndroid Build Coastguard Worker false,
282*d9f75844SAndroid Build Coastguard Worker VectorOfStringsToString(*value_),
283*d9f75844SAndroid Build Coastguard Worker VectorOfStringsToString(*value_));
284*d9f75844SAndroid Build Coastguard Worker WEBRTC_DEFINE_RTCSTATSMEMBER(rtc_stats_internal::MapStringUint64,
285*d9f75844SAndroid Build Coastguard Worker kMapStringUint64,
286*d9f75844SAndroid Build Coastguard Worker false,
287*d9f75844SAndroid Build Coastguard Worker false,
288*d9f75844SAndroid Build Coastguard Worker MapToString(*value_),
289*d9f75844SAndroid Build Coastguard Worker MapToStringAsDouble(*value_));
290*d9f75844SAndroid Build Coastguard Worker WEBRTC_DEFINE_RTCSTATSMEMBER(rtc_stats_internal::MapStringDouble,
291*d9f75844SAndroid Build Coastguard Worker kMapStringDouble,
292*d9f75844SAndroid Build Coastguard Worker false,
293*d9f75844SAndroid Build Coastguard Worker false,
294*d9f75844SAndroid Build Coastguard Worker MapToString(*value_),
295*d9f75844SAndroid Build Coastguard Worker MapToStringAsDouble(*value_));
296*d9f75844SAndroid Build Coastguard Worker
297*d9f75844SAndroid Build Coastguard Worker // Restricted members that expose hardware capabilites.
298*d9f75844SAndroid Build Coastguard Worker template class RTC_EXPORT_TEMPLATE_DEFINE(RTC_EXPORT)
299*d9f75844SAndroid Build Coastguard Worker RTCRestrictedStatsMember<bool, StatExposureCriteria::kHardwareCapability>;
300*d9f75844SAndroid Build Coastguard Worker template class RTC_EXPORT_TEMPLATE_DEFINE(RTC_EXPORT)
301*d9f75844SAndroid Build Coastguard Worker RTCRestrictedStatsMember<int32_t,
302*d9f75844SAndroid Build Coastguard Worker StatExposureCriteria::kHardwareCapability>;
303*d9f75844SAndroid Build Coastguard Worker template class RTC_EXPORT_TEMPLATE_DEFINE(RTC_EXPORT)
304*d9f75844SAndroid Build Coastguard Worker RTCRestrictedStatsMember<uint32_t,
305*d9f75844SAndroid Build Coastguard Worker StatExposureCriteria::kHardwareCapability>;
306*d9f75844SAndroid Build Coastguard Worker template class RTC_EXPORT_TEMPLATE_DEFINE(RTC_EXPORT)
307*d9f75844SAndroid Build Coastguard Worker RTCRestrictedStatsMember<int64_t,
308*d9f75844SAndroid Build Coastguard Worker StatExposureCriteria::kHardwareCapability>;
309*d9f75844SAndroid Build Coastguard Worker template class RTC_EXPORT_TEMPLATE_DEFINE(RTC_EXPORT)
310*d9f75844SAndroid Build Coastguard Worker RTCRestrictedStatsMember<uint64_t,
311*d9f75844SAndroid Build Coastguard Worker StatExposureCriteria::kHardwareCapability>;
312*d9f75844SAndroid Build Coastguard Worker template class RTC_EXPORT_TEMPLATE_DEFINE(RTC_EXPORT)
313*d9f75844SAndroid Build Coastguard Worker RTCRestrictedStatsMember<double, StatExposureCriteria::kHardwareCapability>;
314*d9f75844SAndroid Build Coastguard Worker template class RTC_EXPORT_TEMPLATE_DEFINE(RTC_EXPORT)
315*d9f75844SAndroid Build Coastguard Worker RTCRestrictedStatsMember<std::string,
316*d9f75844SAndroid Build Coastguard Worker StatExposureCriteria::kHardwareCapability>;
317*d9f75844SAndroid Build Coastguard Worker template class RTC_EXPORT_TEMPLATE_DEFINE(RTC_EXPORT)
318*d9f75844SAndroid Build Coastguard Worker RTCRestrictedStatsMember<std::vector<bool>,
319*d9f75844SAndroid Build Coastguard Worker StatExposureCriteria::kHardwareCapability>;
320*d9f75844SAndroid Build Coastguard Worker template class RTC_EXPORT_TEMPLATE_DEFINE(RTC_EXPORT)
321*d9f75844SAndroid Build Coastguard Worker RTCRestrictedStatsMember<std::vector<int32_t>,
322*d9f75844SAndroid Build Coastguard Worker StatExposureCriteria::kHardwareCapability>;
323*d9f75844SAndroid Build Coastguard Worker template class RTC_EXPORT_TEMPLATE_DEFINE(RTC_EXPORT)
324*d9f75844SAndroid Build Coastguard Worker RTCRestrictedStatsMember<std::vector<uint32_t>,
325*d9f75844SAndroid Build Coastguard Worker StatExposureCriteria::kHardwareCapability>;
326*d9f75844SAndroid Build Coastguard Worker template class RTC_EXPORT_TEMPLATE_DEFINE(RTC_EXPORT)
327*d9f75844SAndroid Build Coastguard Worker RTCRestrictedStatsMember<std::vector<int64_t>,
328*d9f75844SAndroid Build Coastguard Worker StatExposureCriteria::kHardwareCapability>;
329*d9f75844SAndroid Build Coastguard Worker template class RTC_EXPORT_TEMPLATE_DEFINE(RTC_EXPORT)
330*d9f75844SAndroid Build Coastguard Worker RTCRestrictedStatsMember<std::vector<uint64_t>,
331*d9f75844SAndroid Build Coastguard Worker StatExposureCriteria::kHardwareCapability>;
332*d9f75844SAndroid Build Coastguard Worker template class RTC_EXPORT_TEMPLATE_DEFINE(RTC_EXPORT)
333*d9f75844SAndroid Build Coastguard Worker RTCRestrictedStatsMember<std::vector<double>,
334*d9f75844SAndroid Build Coastguard Worker StatExposureCriteria::kHardwareCapability>;
335*d9f75844SAndroid Build Coastguard Worker template class RTC_EXPORT_TEMPLATE_DEFINE(RTC_EXPORT)
336*d9f75844SAndroid Build Coastguard Worker RTCRestrictedStatsMember<std::vector<std::string>,
337*d9f75844SAndroid Build Coastguard Worker StatExposureCriteria::kHardwareCapability>;
338*d9f75844SAndroid Build Coastguard Worker template class RTC_EXPORT_TEMPLATE_DEFINE(RTC_EXPORT)
339*d9f75844SAndroid Build Coastguard Worker RTCRestrictedStatsMember<std::map<std::string, uint64_t>,
340*d9f75844SAndroid Build Coastguard Worker StatExposureCriteria::kHardwareCapability>;
341*d9f75844SAndroid Build Coastguard Worker template class RTC_EXPORT_TEMPLATE_DEFINE(RTC_EXPORT)
342*d9f75844SAndroid Build Coastguard Worker RTCRestrictedStatsMember<std::map<std::string, double>,
343*d9f75844SAndroid Build Coastguard Worker StatExposureCriteria::kHardwareCapability>;
344*d9f75844SAndroid Build Coastguard Worker
345*d9f75844SAndroid Build Coastguard Worker template class RTC_EXPORT_TEMPLATE_DEFINE(RTC_EXPORT)
346*d9f75844SAndroid Build Coastguard Worker RTCNonStandardStatsMember<bool>;
347*d9f75844SAndroid Build Coastguard Worker template class RTC_EXPORT_TEMPLATE_DEFINE(RTC_EXPORT)
348*d9f75844SAndroid Build Coastguard Worker RTCNonStandardStatsMember<int32_t>;
349*d9f75844SAndroid Build Coastguard Worker template class RTC_EXPORT_TEMPLATE_DEFINE(RTC_EXPORT)
350*d9f75844SAndroid Build Coastguard Worker RTCNonStandardStatsMember<uint32_t>;
351*d9f75844SAndroid Build Coastguard Worker template class RTC_EXPORT_TEMPLATE_DEFINE(RTC_EXPORT)
352*d9f75844SAndroid Build Coastguard Worker RTCNonStandardStatsMember<int64_t>;
353*d9f75844SAndroid Build Coastguard Worker template class RTC_EXPORT_TEMPLATE_DEFINE(RTC_EXPORT)
354*d9f75844SAndroid Build Coastguard Worker RTCNonStandardStatsMember<uint64_t>;
355*d9f75844SAndroid Build Coastguard Worker template class RTC_EXPORT_TEMPLATE_DEFINE(RTC_EXPORT)
356*d9f75844SAndroid Build Coastguard Worker RTCNonStandardStatsMember<double>;
357*d9f75844SAndroid Build Coastguard Worker template class RTC_EXPORT_TEMPLATE_DEFINE(RTC_EXPORT)
358*d9f75844SAndroid Build Coastguard Worker RTCNonStandardStatsMember<std::string>;
359*d9f75844SAndroid Build Coastguard Worker template class RTC_EXPORT_TEMPLATE_DEFINE(RTC_EXPORT)
360*d9f75844SAndroid Build Coastguard Worker RTCNonStandardStatsMember<std::vector<bool>>;
361*d9f75844SAndroid Build Coastguard Worker template class RTC_EXPORT_TEMPLATE_DEFINE(RTC_EXPORT)
362*d9f75844SAndroid Build Coastguard Worker RTCNonStandardStatsMember<std::vector<int32_t>>;
363*d9f75844SAndroid Build Coastguard Worker template class RTC_EXPORT_TEMPLATE_DEFINE(RTC_EXPORT)
364*d9f75844SAndroid Build Coastguard Worker RTCNonStandardStatsMember<std::vector<uint32_t>>;
365*d9f75844SAndroid Build Coastguard Worker template class RTC_EXPORT_TEMPLATE_DEFINE(RTC_EXPORT)
366*d9f75844SAndroid Build Coastguard Worker RTCNonStandardStatsMember<std::vector<int64_t>>;
367*d9f75844SAndroid Build Coastguard Worker template class RTC_EXPORT_TEMPLATE_DEFINE(RTC_EXPORT)
368*d9f75844SAndroid Build Coastguard Worker RTCNonStandardStatsMember<std::vector<uint64_t>>;
369*d9f75844SAndroid Build Coastguard Worker template class RTC_EXPORT_TEMPLATE_DEFINE(RTC_EXPORT)
370*d9f75844SAndroid Build Coastguard Worker RTCNonStandardStatsMember<std::vector<double>>;
371*d9f75844SAndroid Build Coastguard Worker template class RTC_EXPORT_TEMPLATE_DEFINE(RTC_EXPORT)
372*d9f75844SAndroid Build Coastguard Worker RTCNonStandardStatsMember<std::vector<std::string>>;
373*d9f75844SAndroid Build Coastguard Worker
374*d9f75844SAndroid Build Coastguard Worker } // namespace webrtc
375