blob: 273ea316cbe3d2ca992aad88185c64abf1fdacca [file] [log] [blame]
hbos74e1a4f2016-09-15 23:33:01 -07001/*
2 * Copyright 2016 The WebRTC Project Authors. All rights reserved.
3 *
4 * Use of this source code is governed by a BSD-style license
5 * that can be found in the LICENSE file in the root of the source
6 * tree. An additional intellectual property rights grant can be found
7 * in the file PATENTS. All contributing project authors may
8 * be found in the AUTHORS file in the root of the source tree.
9 */
10
Steve Anton10542f22019-01-11 09:11:00 -080011#ifndef API_STATS_RTC_STATS_H_
12#define API_STATS_RTC_STATS_H_
hbos74e1a4f2016-09-15 23:33:01 -070013
Yves Gerey3e707812018-11-28 16:47:49 +010014#include <stddef.h>
15#include <stdint.h>
Jonas Olssona4d87372019-07-05 19:08:33 +020016
Byoungchan Lee0a52ede2021-05-22 08:41:02 +090017#include <map>
hbos74e1a4f2016-09-15 23:33:01 -070018#include <memory>
19#include <string>
20#include <utility>
21#include <vector>
22
Philipp Hancke8e7a1052022-10-13 13:14:01 +020023#include "absl/types/optional.h"
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020024#include "rtc_base/checks.h"
Mirko Bonadei276827c2018-10-16 14:13:50 +020025#include "rtc_base/system/rtc_export.h"
Mirko Bonadei054f1852019-11-04 16:31:08 +010026#include "rtc_base/system/rtc_export_template.h"
hbos74e1a4f2016-09-15 23:33:01 -070027
28namespace webrtc {
29
30class RTCStatsMemberInterface;
31
32// Abstract base class for RTCStats-derived dictionaries, see
33// https://w3c.github.io/webrtc-stats/.
34//
35// All derived classes must have the following static variable defined:
36// static const char kType[];
37// It is used as a unique class identifier and a string representation of the
38// class type, see https://w3c.github.io/webrtc-stats/#rtcstatstype-str*.
Artem Titov0e61fdd2021-07-25 21:50:14 +020039// Use the `WEBRTC_RTCSTATS_IMPL` macro when implementing subclasses, see macro
hbos74e1a4f2016-09-15 23:33:01 -070040// for details.
41//
42// Derived classes list their dictionary members, RTCStatsMember<T>, as public
43// fields, allowing the following:
44//
45// RTCFooStats foo("fooId", GetCurrentTime());
46// foo.bar = 42;
47// foo.baz = std::vector<std::string>();
48// foo.baz->push_back("hello world");
49// uint32_t x = *foo.bar;
50//
Artem Titov0e61fdd2021-07-25 21:50:14 +020051// Pointers to all the members are available with `Members`, allowing iteration:
hbos74e1a4f2016-09-15 23:33:01 -070052//
53// for (const RTCStatsMemberInterface* member : foo.Members()) {
54// printf("%s = %s\n", member->name(), member->ValueToString().c_str());
55// }
Mirko Bonadei276827c2018-10-16 14:13:50 +020056class RTC_EXPORT RTCStats {
hbos74e1a4f2016-09-15 23:33:01 -070057 public:
58 RTCStats(const std::string& id, int64_t timestamp_us)
59 : id_(id), timestamp_us_(timestamp_us) {}
60 RTCStats(std::string&& id, int64_t timestamp_us)
61 : id_(std::move(id)), timestamp_us_(timestamp_us) {}
62 virtual ~RTCStats() {}
63
64 virtual std::unique_ptr<RTCStats> copy() const = 0;
65
66 const std::string& id() const { return id_; }
67 // Time relative to the UNIX epoch (Jan 1, 1970, UTC), in microseconds.
68 int64_t timestamp_us() const { return timestamp_us_; }
Artem Titov0e61fdd2021-07-25 21:50:14 +020069 // Returns the static member variable `kType` of the implementing class.
hbos74e1a4f2016-09-15 23:33:01 -070070 virtual const char* type() const = 0;
Artem Titov0e61fdd2021-07-25 21:50:14 +020071 // Returns a vector of pointers to all the `RTCStatsMemberInterface` members
hbos67c8bc42016-10-25 04:31:23 -070072 // of this class. This allows for iteration of members. For a given class,
Artem Titov0e61fdd2021-07-25 21:50:14 +020073 // `Members` always returns the same members in the same order.
hbos74e1a4f2016-09-15 23:33:01 -070074 std::vector<const RTCStatsMemberInterface*> Members() const;
hbos67c8bc42016-10-25 04:31:23 -070075 // Checks if the two stats objects are of the same type and have the same
hbos0583b282016-11-30 01:50:14 -080076 // member values. Timestamps are not compared. These operators are exposed for
77 // testing.
hbos67c8bc42016-10-25 04:31:23 -070078 bool operator==(const RTCStats& other) const;
79 bool operator!=(const RTCStats& other) const;
hbos74e1a4f2016-09-15 23:33:01 -070080
ehmaldonado35a872c2017-07-28 07:29:12 -070081 // Creates a JSON readable string representation of the stats
82 // object, listing all of its members (names and values).
83 std::string ToJson() const;
hbos74e1a4f2016-09-15 23:33:01 -070084
Artem Titov0e61fdd2021-07-25 21:50:14 +020085 // Downcasts the stats object to an `RTCStats` subclass `T`. DCHECKs that the
86 // object is of type `T`.
Yves Gerey665174f2018-06-19 15:03:05 +020087 template <typename T>
hbos74e1a4f2016-09-15 23:33:01 -070088 const T& cast_to() const {
89 RTC_DCHECK_EQ(type(), T::kType);
90 return static_cast<const T&>(*this);
91 }
92
93 protected:
Artem Titov0e61fdd2021-07-25 21:50:14 +020094 // Gets a vector of all members of this `RTCStats` object, including members
95 // derived from parent classes. `additional_capacity` is how many more members
hbos74e1a4f2016-09-15 23:33:01 -070096 // shall be reserved in the vector (so that subclasses can allocate a vector
97 // with room for both parent and child members without it having to resize).
98 virtual std::vector<const RTCStatsMemberInterface*>
Yves Gerey665174f2018-06-19 15:03:05 +020099 MembersOfThisObjectAndAncestors(size_t additional_capacity) const;
hbos74e1a4f2016-09-15 23:33:01 -0700100
101 std::string const id_;
102 int64_t timestamp_us_;
103};
104
Artem Titov0e61fdd2021-07-25 21:50:14 +0200105// All `RTCStats` classes should use these macros.
106// `WEBRTC_RTCSTATS_DECL` is placed in a public section of the class definition.
107// `WEBRTC_RTCSTATS_IMPL` is placed outside the class definition (in a .cc).
hbos74e1a4f2016-09-15 23:33:01 -0700108//
Artem Titov0e61fdd2021-07-25 21:50:14 +0200109// These macros declare (in _DECL) and define (in _IMPL) the static `kType` and
110// overrides methods as required by subclasses of `RTCStats`: `copy`, `type` and
111// `MembersOfThisObjectAndAncestors`. The |...| argument is a list of addresses
hbosfc5e0502016-10-06 02:06:10 -0700112// to each member defined in the implementing class. The list must have at least
113// one member.
hbos74e1a4f2016-09-15 23:33:01 -0700114//
115// (Since class names need to be known to implement these methods this cannot be
Artem Titov0e61fdd2021-07-25 21:50:14 +0200116// part of the base `RTCStats`. While these methods could be implemented using
hbos74e1a4f2016-09-15 23:33:01 -0700117// templates, that would only work for immediate subclasses. Subclasses of
118// subclasses also have to override these methods, resulting in boilerplate
Artem Titov0e61fdd2021-07-25 21:50:14 +0200119// code. Using a macro avoids this and works for any `RTCStats` class, including
hbos74e1a4f2016-09-15 23:33:01 -0700120// grandchildren.)
121//
122// Sample usage:
123//
124// rtcfoostats.h:
125// class RTCFooStats : public RTCStats {
126// public:
hbosfc5e0502016-10-06 02:06:10 -0700127// WEBRTC_RTCSTATS_DECL();
hbos74e1a4f2016-09-15 23:33:01 -0700128//
hbosfc5e0502016-10-06 02:06:10 -0700129// RTCFooStats(const std::string& id, int64_t timestamp_us);
hbos74e1a4f2016-09-15 23:33:01 -0700130//
131// RTCStatsMember<int32_t> foo;
132// RTCStatsMember<int32_t> bar;
133// };
134//
135// rtcfoostats.cc:
hbosfc5e0502016-10-06 02:06:10 -0700136// WEBRTC_RTCSTATS_IMPL(RTCFooStats, RTCStats, "foo-stats"
137// &foo,
138// &bar);
hbos74e1a4f2016-09-15 23:33:01 -0700139//
hbosfc5e0502016-10-06 02:06:10 -0700140// RTCFooStats::RTCFooStats(const std::string& id, int64_t timestamp_us)
141// : RTCStats(id, timestamp_us),
142// foo("foo"),
143// bar("bar") {
144// }
145//
Yves Gerey665174f2018-06-19 15:03:05 +0200146#define WEBRTC_RTCSTATS_DECL() \
Yves Gerey665174f2018-06-19 15:03:05 +0200147 protected: \
148 std::vector<const webrtc::RTCStatsMemberInterface*> \
149 MembersOfThisObjectAndAncestors(size_t local_var_additional_capacity) \
150 const override; \
151 \
Nico Weber22f99252019-02-20 10:13:16 -0500152 public: \
153 static const char kType[]; \
154 \
155 std::unique_ptr<webrtc::RTCStats> copy() const override; \
156 const char* type() const override
hbosfc5e0502016-10-06 02:06:10 -0700157
158#define WEBRTC_RTCSTATS_IMPL(this_class, parent_class, type_str, ...) \
159 const char this_class::kType[] = type_str; \
160 \
161 std::unique_ptr<webrtc::RTCStats> this_class::copy() const { \
Philipp Hanckeb5cf12d2022-09-06 11:55:31 +0200162 return std::make_unique<this_class>(*this); \
hbosfc5e0502016-10-06 02:06:10 -0700163 } \
164 \
Yves Gerey665174f2018-06-19 15:03:05 +0200165 const char* this_class::type() const { return this_class::kType; } \
hbosfc5e0502016-10-06 02:06:10 -0700166 \
167 std::vector<const webrtc::RTCStatsMemberInterface*> \
168 this_class::MembersOfThisObjectAndAncestors( \
169 size_t local_var_additional_capacity) const { \
hbos74e1a4f2016-09-15 23:33:01 -0700170 const webrtc::RTCStatsMemberInterface* local_var_members[] = { \
Yves Gerey665174f2018-06-19 15:03:05 +0200171 __VA_ARGS__}; \
hbos74e1a4f2016-09-15 23:33:01 -0700172 size_t local_var_members_count = \
173 sizeof(local_var_members) / sizeof(local_var_members[0]); \
Yves Gerey665174f2018-06-19 15:03:05 +0200174 std::vector<const webrtc::RTCStatsMemberInterface*> \
175 local_var_members_vec = parent_class::MembersOfThisObjectAndAncestors( \
hbos74e1a4f2016-09-15 23:33:01 -0700176 local_var_members_count + local_var_additional_capacity); \
177 RTC_DCHECK_GE( \
178 local_var_members_vec.capacity() - local_var_members_vec.size(), \
179 local_var_members_count + local_var_additional_capacity); \
180 local_var_members_vec.insert(local_var_members_vec.end(), \
181 &local_var_members[0], \
182 &local_var_members[local_var_members_count]); \
183 return local_var_members_vec; \
hbosfc5e0502016-10-06 02:06:10 -0700184 }
hbos74e1a4f2016-09-15 23:33:01 -0700185
Henrik Boström646fda02019-05-22 15:49:42 +0200186// A version of WEBRTC_RTCSTATS_IMPL() where "..." is omitted, used to avoid a
187// compile error on windows. This is used if the stats dictionary does not
188// declare any members of its own (but perhaps its parent dictionary does).
189#define WEBRTC_RTCSTATS_IMPL_NO_MEMBERS(this_class, parent_class, type_str) \
190 const char this_class::kType[] = type_str; \
191 \
192 std::unique_ptr<webrtc::RTCStats> this_class::copy() const { \
Philipp Hanckeb5cf12d2022-09-06 11:55:31 +0200193 return std::make_unique<this_class>(*this); \
Henrik Boström646fda02019-05-22 15:49:42 +0200194 } \
195 \
196 const char* this_class::type() const { return this_class::kType; } \
197 \
198 std::vector<const webrtc::RTCStatsMemberInterface*> \
199 this_class::MembersOfThisObjectAndAncestors( \
200 size_t local_var_additional_capacity) const { \
201 return parent_class::MembersOfThisObjectAndAncestors(0); \
202 }
203
Jakob Ivarsson22936222019-03-22 11:29:49 +0100204// Non-standard stats members can be exposed to the JavaScript API in Chrome
205// e.g. through origin trials. The group ID can be used by the blink layer to
206// determine if a stats member should be exposed or not. Multiple non-standard
207// stats members can share the same group ID so that they are exposed together.
208enum class NonStandardGroupId {
Jakob Ivarssonaa023e22019-03-27 10:17:31 +0100209 // Group ID used for testing purposes only.
210 kGroupIdForTesting,
Jakob Ivarsson22936222019-03-22 11:29:49 +0100211 // I2E:
212 // https://groups.google.com/a/chromium.org/forum/#!topic/blink-dev/hE2B1iItPDk
213 kRtcAudioJitterBufferMaxPackets,
214 // I2E:
215 // https://groups.google.com/a/chromium.org/forum/#!topic/blink-dev/YbhMyqLXXXo
216 kRtcStatsRelativePacketArrivalDelay,
217};
218
Evan Shrubsole6c733ee2022-10-12 15:11:14 +0000219// Certain stat members should only be exposed to the JavaScript API in
220// certain circumstances as to avoid passive fingerprinting.
221enum class StatExposureCriteria : uint8_t {
222 // The stat should always be exposed. This is the default.
223 kAlways,
224 // The stat exposes hardware capabilities and thus should has limited exposure
225 // to JavaScript. The requirements for exposure are written in the spec at
226 // https://w3c.github.io/webrtc-stats/#limiting-exposure-of-hardware-capabilities.
227 kHardwareCapability,
228};
229
Artem Titov0e61fdd2021-07-25 21:50:14 +0200230// Interface for `RTCStats` members, which have a name and a value of a type
231// defined in a subclass. Only the types listed in `Type` are supported, these
Artem Titovcfea2182021-08-10 01:22:31 +0200232// are implemented by `RTCStatsMember<T>`. The value of a member may be
Artem Titov0e61fdd2021-07-25 21:50:14 +0200233// undefined, the value can only be read if `is_defined`.
hbos74e1a4f2016-09-15 23:33:01 -0700234class RTCStatsMemberInterface {
235 public:
236 // Member value types.
237 enum Type {
Yves Gerey665174f2018-06-19 15:03:05 +0200238 kBool, // bool
239 kInt32, // int32_t
240 kUint32, // uint32_t
241 kInt64, // int64_t
242 kUint64, // uint64_t
243 kDouble, // double
244 kString, // std::string
hbos74e1a4f2016-09-15 23:33:01 -0700245
Yves Gerey665174f2018-06-19 15:03:05 +0200246 kSequenceBool, // std::vector<bool>
247 kSequenceInt32, // std::vector<int32_t>
248 kSequenceUint32, // std::vector<uint32_t>
249 kSequenceInt64, // std::vector<int64_t>
250 kSequenceUint64, // std::vector<uint64_t>
251 kSequenceDouble, // std::vector<double>
252 kSequenceString, // std::vector<std::string>
Byoungchan Lee0a52ede2021-05-22 08:41:02 +0900253
254 kMapStringUint64, // std::map<std::string, uint64_t>
255 kMapStringDouble, // std::map<std::string, double>
hbos74e1a4f2016-09-15 23:33:01 -0700256 };
257
258 virtual ~RTCStatsMemberInterface() {}
259
260 const char* name() const { return name_; }
261 virtual Type type() const = 0;
262 virtual bool is_sequence() const = 0;
263 virtual bool is_string() const = 0;
Philipp Hancke8e7a1052022-10-13 13:14:01 +0200264 virtual bool is_defined() const = 0;
Taylor Brandstettere2751742018-06-25 13:42:44 -0700265 // Is this part of the stats spec? Used so that chromium can easily filter
266 // out anything unstandardized.
267 virtual bool is_standardized() const = 0;
Jakob Ivarsson22936222019-03-22 11:29:49 +0100268 // Non-standard stats members can have group IDs in order to be exposed in
269 // JavaScript through experiments. Standardized stats have no group IDs.
270 virtual std::vector<NonStandardGroupId> group_ids() const { return {}; }
Evan Shrubsole6c733ee2022-10-12 15:11:14 +0000271 // The conditions for exposing the statistic to JavaScript. Stats with
272 // criteria that is not kAlways has some restriction and should be filtered
273 // in accordance to the spec.
274 virtual StatExposureCriteria exposure_criteria() const {
275 return StatExposureCriteria::kAlways;
276 }
hbos67c8bc42016-10-25 04:31:23 -0700277 // Type and value comparator. The names are not compared. These operators are
278 // exposed for testing.
Byoungchan Lee8c4601b2022-09-23 13:59:42 +0900279 bool operator==(const RTCStatsMemberInterface& other) const {
280 return IsEqual(other);
281 }
hbos67c8bc42016-10-25 04:31:23 -0700282 bool operator!=(const RTCStatsMemberInterface& other) const {
283 return !(*this == other);
284 }
hbos74e1a4f2016-09-15 23:33:01 -0700285 virtual std::string ValueToString() const = 0;
ehmaldonado35a872c2017-07-28 07:29:12 -0700286 // This is the same as ValueToString except for kInt64 and kUint64 types,
287 // where the value is represented as a double instead of as an integer.
288 // Since JSON stores numbers as floating point numbers, very large integers
289 // cannot be accurately represented, so we prefer to display them as doubles
290 // instead.
291 virtual std::string ValueToJson() const = 0;
hbos74e1a4f2016-09-15 23:33:01 -0700292
Yves Gerey665174f2018-06-19 15:03:05 +0200293 template <typename T>
hbos74e1a4f2016-09-15 23:33:01 -0700294 const T& cast_to() const {
Mirko Bonadei054f1852019-11-04 16:31:08 +0100295 RTC_DCHECK_EQ(type(), T::StaticType());
hbos74e1a4f2016-09-15 23:33:01 -0700296 return static_cast<const T&>(*this);
297 }
298
299 protected:
Philipp Hancke8e7a1052022-10-13 13:14:01 +0200300 explicit RTCStatsMemberInterface(const char* name) : name_(name) {}
hbos74e1a4f2016-09-15 23:33:01 -0700301
Byoungchan Lee8c4601b2022-09-23 13:59:42 +0900302 virtual bool IsEqual(const RTCStatsMemberInterface& other) const = 0;
303
hbos74e1a4f2016-09-15 23:33:01 -0700304 const char* const name_;
hbos74e1a4f2016-09-15 23:33:01 -0700305};
306
Artem Titov0e61fdd2021-07-25 21:50:14 +0200307// Template implementation of `RTCStatsMemberInterface`.
Mirko Bonadei054f1852019-11-04 16:31:08 +0100308// The supported types are the ones described by
Artem Titovcfea2182021-08-10 01:22:31 +0200309// `RTCStatsMemberInterface::Type`.
Yves Gerey665174f2018-06-19 15:03:05 +0200310template <typename T>
Mirko Bonadei1e6aa1f2019-11-05 17:20:58 +0100311class RTCStatsMember : public RTCStatsMemberInterface {
hbos74e1a4f2016-09-15 23:33:01 -0700312 public:
hbos74e1a4f2016-09-15 23:33:01 -0700313 explicit RTCStatsMember(const char* name)
Philipp Hancke8e7a1052022-10-13 13:14:01 +0200314 : RTCStatsMemberInterface(name), value_() {}
hbos74e1a4f2016-09-15 23:33:01 -0700315 RTCStatsMember(const char* name, const T& value)
Philipp Hancke8e7a1052022-10-13 13:14:01 +0200316 : RTCStatsMemberInterface(name), value_(value) {}
hbos74e1a4f2016-09-15 23:33:01 -0700317 RTCStatsMember(const char* name, T&& value)
Philipp Hancke8e7a1052022-10-13 13:14:01 +0200318 : RTCStatsMemberInterface(name), value_(std::move(value)) {}
319 explicit RTCStatsMember(const RTCStatsMember<T>& other)
320 : RTCStatsMemberInterface(other.name_), value_(other.value_) {}
321 explicit RTCStatsMember(RTCStatsMember<T>&& other)
322 : RTCStatsMemberInterface(other.name_), value_(std::move(other.value_)) {}
hbos74e1a4f2016-09-15 23:33:01 -0700323
Mirko Bonadei054f1852019-11-04 16:31:08 +0100324 static Type StaticType();
325 Type type() const override { return StaticType(); }
hbos74e1a4f2016-09-15 23:33:01 -0700326 bool is_sequence() const override;
327 bool is_string() const override;
Philipp Hancke8e7a1052022-10-13 13:14:01 +0200328 bool is_defined() const override { return value_.has_value(); }
Taylor Brandstettere2751742018-06-25 13:42:44 -0700329 bool is_standardized() const override { return true; }
hbos74e1a4f2016-09-15 23:33:01 -0700330 std::string ValueToString() const override;
ehmaldonado35a872c2017-07-28 07:29:12 -0700331 std::string ValueToJson() const override;
hbos74e1a4f2016-09-15 23:33:01 -0700332
Andrey Logvin1f0f59f2020-06-15 12:49:25 +0000333 template <typename U>
334 inline T ValueOrDefault(U default_value) const {
Philipp Hancke8e7a1052022-10-13 13:14:01 +0200335 return value_.value_or(default_value);
Andrey Logvin1f0f59f2020-06-15 12:49:25 +0000336 }
337
hbos74e1a4f2016-09-15 23:33:01 -0700338 // Assignment operators.
339 T& operator=(const T& value) {
340 value_ = value;
Philipp Hancke8e7a1052022-10-13 13:14:01 +0200341 return value_.value();
hbos74e1a4f2016-09-15 23:33:01 -0700342 }
343 T& operator=(const T&& value) {
344 value_ = std::move(value);
Philipp Hancke8e7a1052022-10-13 13:14:01 +0200345 return value_.value();
hbos74e1a4f2016-09-15 23:33:01 -0700346 }
hbos74e1a4f2016-09-15 23:33:01 -0700347
348 // Value getters.
349 T& operator*() {
Philipp Hancke8e7a1052022-10-13 13:14:01 +0200350 RTC_DCHECK(value_);
351 return *value_;
hbos74e1a4f2016-09-15 23:33:01 -0700352 }
353 const T& operator*() const {
Philipp Hancke8e7a1052022-10-13 13:14:01 +0200354 RTC_DCHECK(value_);
355 return *value_;
hbos74e1a4f2016-09-15 23:33:01 -0700356 }
357
358 // Value getters, arrow operator.
359 T* operator->() {
Philipp Hancke8e7a1052022-10-13 13:14:01 +0200360 RTC_DCHECK(value_);
361 return &(*value_);
hbos74e1a4f2016-09-15 23:33:01 -0700362 }
363 const T* operator->() const {
Philipp Hancke8e7a1052022-10-13 13:14:01 +0200364 RTC_DCHECK(value_);
365 return &(*value_);
hbos74e1a4f2016-09-15 23:33:01 -0700366 }
367
Byoungchan Lee8c4601b2022-09-23 13:59:42 +0900368 protected:
369 bool IsEqual(const RTCStatsMemberInterface& other) const override {
Evan Shrubsole6c733ee2022-10-12 15:11:14 +0000370 if (type() != other.type() ||
371 is_standardized() != other.is_standardized() ||
372 exposure_criteria() != other.exposure_criteria())
Byoungchan Lee8c4601b2022-09-23 13:59:42 +0900373 return false;
374 const RTCStatsMember<T>& other_t =
375 static_cast<const RTCStatsMember<T>&>(other);
Byoungchan Lee8c4601b2022-09-23 13:59:42 +0900376 return value_ == other_t.value_;
377 }
378
hbos74e1a4f2016-09-15 23:33:01 -0700379 private:
Philipp Hancke8e7a1052022-10-13 13:14:01 +0200380 absl::optional<T> value_;
hbos74e1a4f2016-09-15 23:33:01 -0700381};
382
Byoungchan Lee0a52ede2021-05-22 08:41:02 +0900383namespace rtc_stats_internal {
384
385typedef std::map<std::string, uint64_t> MapStringUint64;
386typedef std::map<std::string, double> MapStringDouble;
387
388} // namespace rtc_stats_internal
389
Mirko Bonadei62a19d02019-11-11 19:59:54 +0100390#define WEBRTC_DECLARE_RTCSTATSMEMBER(T) \
391 template <> \
392 RTC_EXPORT RTCStatsMemberInterface::Type RTCStatsMember<T>::StaticType(); \
393 template <> \
Mirko Bonadei6dd488b2019-11-20 14:06:39 +0100394 RTC_EXPORT bool RTCStatsMember<T>::is_sequence() const; \
Mirko Bonadei62a19d02019-11-11 19:59:54 +0100395 template <> \
Mirko Bonadei6dd488b2019-11-20 14:06:39 +0100396 RTC_EXPORT bool RTCStatsMember<T>::is_string() const; \
Mirko Bonadei62a19d02019-11-11 19:59:54 +0100397 template <> \
Mirko Bonadei6dd488b2019-11-20 14:06:39 +0100398 RTC_EXPORT std::string RTCStatsMember<T>::ValueToString() const; \
Mirko Bonadei62a19d02019-11-11 19:59:54 +0100399 template <> \
Mirko Bonadei6dd488b2019-11-20 14:06:39 +0100400 RTC_EXPORT std::string RTCStatsMember<T>::ValueToJson() const; \
Mirko Bonadei62a19d02019-11-11 19:59:54 +0100401 extern template class RTC_EXPORT_TEMPLATE_DECLARE(RTC_EXPORT) \
Mirko Bonadei054f1852019-11-04 16:31:08 +0100402 RTCStatsMember<T>
403
404WEBRTC_DECLARE_RTCSTATSMEMBER(bool);
405WEBRTC_DECLARE_RTCSTATSMEMBER(int32_t);
406WEBRTC_DECLARE_RTCSTATSMEMBER(uint32_t);
407WEBRTC_DECLARE_RTCSTATSMEMBER(int64_t);
408WEBRTC_DECLARE_RTCSTATSMEMBER(uint64_t);
409WEBRTC_DECLARE_RTCSTATSMEMBER(double);
410WEBRTC_DECLARE_RTCSTATSMEMBER(std::string);
411WEBRTC_DECLARE_RTCSTATSMEMBER(std::vector<bool>);
412WEBRTC_DECLARE_RTCSTATSMEMBER(std::vector<int32_t>);
413WEBRTC_DECLARE_RTCSTATSMEMBER(std::vector<uint32_t>);
414WEBRTC_DECLARE_RTCSTATSMEMBER(std::vector<int64_t>);
415WEBRTC_DECLARE_RTCSTATSMEMBER(std::vector<uint64_t>);
416WEBRTC_DECLARE_RTCSTATSMEMBER(std::vector<double>);
417WEBRTC_DECLARE_RTCSTATSMEMBER(std::vector<std::string>);
Byoungchan Lee0a52ede2021-05-22 08:41:02 +0900418WEBRTC_DECLARE_RTCSTATSMEMBER(rtc_stats_internal::MapStringUint64);
419WEBRTC_DECLARE_RTCSTATSMEMBER(rtc_stats_internal::MapStringDouble);
Mirko Bonadei054f1852019-11-04 16:31:08 +0100420
Evan Shrubsole6c733ee2022-10-12 15:11:14 +0000421// For stats with restricted exposure.
422template <typename T, StatExposureCriteria E>
423class RTCRestrictedStatsMember : public RTCStatsMember<T> {
424 public:
425 explicit RTCRestrictedStatsMember(const char* name)
426 : RTCStatsMember<T>(name) {}
427 RTCRestrictedStatsMember(const char* name, const T& value)
428 : RTCStatsMember<T>(name, value) {}
429 RTCRestrictedStatsMember(const char* name, T&& value)
430 : RTCStatsMember<T>(name, std::move(value)) {}
431 RTCRestrictedStatsMember(const RTCRestrictedStatsMember<T, E>& other)
432 : RTCStatsMember<T>(other) {}
433 RTCRestrictedStatsMember(RTCRestrictedStatsMember<T, E>&& other)
434 : RTCStatsMember<T>(std::move(other)) {}
435
436 StatExposureCriteria exposure_criteria() const override { return E; }
437
438 T& operator=(const T& value) { return RTCStatsMember<T>::operator=(value); }
439 T& operator=(const T&& value) {
440 return RTCStatsMember<T>::operator=(std::move(value));
441 }
442
443 private:
444 static_assert(E != StatExposureCriteria::kAlways,
445 "kAlways is the default exposure criteria. Use "
446 "RTCStatMember<T> instead.");
447};
448
449extern template class RTC_EXPORT_TEMPLATE_DECLARE(RTC_EXPORT)
450 RTCRestrictedStatsMember<bool, StatExposureCriteria::kHardwareCapability>;
451extern template class RTC_EXPORT_TEMPLATE_DECLARE(RTC_EXPORT)
452 RTCRestrictedStatsMember<int32_t,
453 StatExposureCriteria::kHardwareCapability>;
454extern template class RTC_EXPORT_TEMPLATE_DECLARE(RTC_EXPORT)
455 RTCRestrictedStatsMember<uint32_t,
456 StatExposureCriteria::kHardwareCapability>;
457extern template class RTC_EXPORT_TEMPLATE_DECLARE(RTC_EXPORT)
458 RTCRestrictedStatsMember<int64_t,
459 StatExposureCriteria::kHardwareCapability>;
460extern template class RTC_EXPORT_TEMPLATE_DECLARE(RTC_EXPORT)
461 RTCRestrictedStatsMember<uint64_t,
462 StatExposureCriteria::kHardwareCapability>;
463extern template class RTC_EXPORT_TEMPLATE_DECLARE(RTC_EXPORT)
464 RTCRestrictedStatsMember<double, StatExposureCriteria::kHardwareCapability>;
465extern template class RTC_EXPORT_TEMPLATE_DECLARE(RTC_EXPORT)
466 RTCRestrictedStatsMember<std::string,
467 StatExposureCriteria::kHardwareCapability>;
468extern template class RTC_EXPORT_TEMPLATE_DECLARE(RTC_EXPORT)
469 RTCRestrictedStatsMember<std::vector<bool>,
470 StatExposureCriteria::kHardwareCapability>;
471extern template class RTC_EXPORT_TEMPLATE_DECLARE(RTC_EXPORT)
472 RTCRestrictedStatsMember<std::vector<int32_t>,
473 StatExposureCriteria::kHardwareCapability>;
474extern template class RTC_EXPORT_TEMPLATE_DECLARE(RTC_EXPORT)
475 RTCRestrictedStatsMember<std::vector<uint32_t>,
476 StatExposureCriteria::kHardwareCapability>;
477extern template class RTC_EXPORT_TEMPLATE_DECLARE(RTC_EXPORT)
478 RTCRestrictedStatsMember<std::vector<int64_t>,
479 StatExposureCriteria::kHardwareCapability>;
480extern template class RTC_EXPORT_TEMPLATE_DECLARE(RTC_EXPORT)
481 RTCRestrictedStatsMember<std::vector<uint64_t>,
482 StatExposureCriteria::kHardwareCapability>;
483extern template class RTC_EXPORT_TEMPLATE_DECLARE(RTC_EXPORT)
484 RTCRestrictedStatsMember<std::vector<double>,
485 StatExposureCriteria::kHardwareCapability>;
486extern template class RTC_EXPORT_TEMPLATE_DECLARE(RTC_EXPORT)
487 RTCRestrictedStatsMember<std::vector<std::string>,
488 StatExposureCriteria::kHardwareCapability>;
489extern template class RTC_EXPORT_TEMPLATE_DECLARE(RTC_EXPORT)
490 RTCRestrictedStatsMember<std::map<std::string, uint64_t>,
491 StatExposureCriteria::kHardwareCapability>;
492extern template class RTC_EXPORT_TEMPLATE_DECLARE(RTC_EXPORT)
493 RTCRestrictedStatsMember<std::map<std::string, double>,
494 StatExposureCriteria::kHardwareCapability>;
495
Taylor Brandstettere2751742018-06-25 13:42:44 -0700496// Using inheritance just so that it's obvious from the member's declaration
497// whether it's standardized or not.
498template <typename T>
Mirko Bonadei759f1612019-11-13 11:18:31 +0100499class RTCNonStandardStatsMember : public RTCStatsMember<T> {
Taylor Brandstettere2751742018-06-25 13:42:44 -0700500 public:
501 explicit RTCNonStandardStatsMember(const char* name)
502 : RTCStatsMember<T>(name) {}
Jakob Ivarsson758d9462019-03-19 15:38:49 +0100503 RTCNonStandardStatsMember(const char* name,
504 std::initializer_list<NonStandardGroupId> group_ids)
505 : RTCStatsMember<T>(name), group_ids_(group_ids) {}
Taylor Brandstettere2751742018-06-25 13:42:44 -0700506 RTCNonStandardStatsMember(const char* name, const T& value)
507 : RTCStatsMember<T>(name, value) {}
508 RTCNonStandardStatsMember(const char* name, T&& value)
509 : RTCStatsMember<T>(name, std::move(value)) {}
510 explicit RTCNonStandardStatsMember(const RTCNonStandardStatsMember<T>& other)
Jakob Ivarsson758d9462019-03-19 15:38:49 +0100511 : RTCStatsMember<T>(other), group_ids_(other.group_ids_) {}
Taylor Brandstettere2751742018-06-25 13:42:44 -0700512 explicit RTCNonStandardStatsMember(RTCNonStandardStatsMember<T>&& other)
Mirko Bonadei759f1612019-11-13 11:18:31 +0100513 : RTCStatsMember<T>(std::move(other)),
514 group_ids_(std::move(other.group_ids_)) {}
Taylor Brandstettere2751742018-06-25 13:42:44 -0700515
516 bool is_standardized() const override { return false; }
Ruslan Burakov8af88962018-11-22 17:21:10 +0100517
Jakob Ivarsson22936222019-03-22 11:29:49 +0100518 std::vector<NonStandardGroupId> group_ids() const override {
519 return group_ids_;
520 }
Jakob Ivarsson758d9462019-03-19 15:38:49 +0100521
Ruslan Burakov8af88962018-11-22 17:21:10 +0100522 T& operator=(const T& value) { return RTCStatsMember<T>::operator=(value); }
523 T& operator=(const T&& value) {
524 return RTCStatsMember<T>::operator=(std::move(value));
525 }
Jakob Ivarsson758d9462019-03-19 15:38:49 +0100526
527 private:
528 std::vector<NonStandardGroupId> group_ids_;
Taylor Brandstettere2751742018-06-25 13:42:44 -0700529};
Mirko Bonadei759f1612019-11-13 11:18:31 +0100530
531extern template class RTC_EXPORT_TEMPLATE_DECLARE(RTC_EXPORT)
532 RTCNonStandardStatsMember<bool>;
533extern template class RTC_EXPORT_TEMPLATE_DECLARE(RTC_EXPORT)
534 RTCNonStandardStatsMember<int32_t>;
535extern template class RTC_EXPORT_TEMPLATE_DECLARE(RTC_EXPORT)
536 RTCNonStandardStatsMember<uint32_t>;
537extern template class RTC_EXPORT_TEMPLATE_DECLARE(RTC_EXPORT)
538 RTCNonStandardStatsMember<int64_t>;
539extern template class RTC_EXPORT_TEMPLATE_DECLARE(RTC_EXPORT)
540 RTCNonStandardStatsMember<uint64_t>;
541extern template class RTC_EXPORT_TEMPLATE_DECLARE(RTC_EXPORT)
542 RTCNonStandardStatsMember<double>;
543extern template class RTC_EXPORT_TEMPLATE_DECLARE(RTC_EXPORT)
544 RTCNonStandardStatsMember<std::string>;
545extern template class RTC_EXPORT_TEMPLATE_DECLARE(RTC_EXPORT)
546 RTCNonStandardStatsMember<std::vector<bool>>;
547extern template class RTC_EXPORT_TEMPLATE_DECLARE(RTC_EXPORT)
548 RTCNonStandardStatsMember<std::vector<int32_t>>;
549extern template class RTC_EXPORT_TEMPLATE_DECLARE(RTC_EXPORT)
550 RTCNonStandardStatsMember<std::vector<uint32_t>>;
551extern template class RTC_EXPORT_TEMPLATE_DECLARE(RTC_EXPORT)
552 RTCNonStandardStatsMember<std::vector<int64_t>>;
553extern template class RTC_EXPORT_TEMPLATE_DECLARE(RTC_EXPORT)
554 RTCNonStandardStatsMember<std::vector<uint64_t>>;
555extern template class RTC_EXPORT_TEMPLATE_DECLARE(RTC_EXPORT)
556 RTCNonStandardStatsMember<std::vector<double>>;
557extern template class RTC_EXPORT_TEMPLATE_DECLARE(RTC_EXPORT)
558 RTCNonStandardStatsMember<std::vector<std::string>>;
Byoungchan Lee0a52ede2021-05-22 08:41:02 +0900559extern template class RTC_EXPORT_TEMPLATE_DECLARE(RTC_EXPORT)
560 RTCNonStandardStatsMember<std::map<std::string, uint64_t>>;
561extern template class RTC_EXPORT_TEMPLATE_DECLARE(RTC_EXPORT)
562 RTCNonStandardStatsMember<std::map<std::string, double>>;
Mirko Bonadei759f1612019-11-13 11:18:31 +0100563
hbos74e1a4f2016-09-15 23:33:01 -0700564} // namespace webrtc
565
Steve Anton10542f22019-01-11 09:11:00 -0800566#endif // API_STATS_RTC_STATS_H_