Chromium Code Reviews| OLD | NEW |
|---|---|
| (Empty) | |
| 1 /* | |
| 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 | |
| 11 #ifndef WEBRTC_API_RTCSTATS_H_ | |
| 12 #define WEBRTC_API_RTCSTATS_H_ | |
| 13 | |
| 14 #include <map> | |
| 15 #include <memory> | |
| 16 #include <string> | |
| 17 #include <utility> | |
| 18 #include <vector> | |
| 19 | |
| 20 #include "webrtc/base/checks.h" | |
| 21 | |
| 22 namespace webrtc { | |
| 23 | |
| 24 class RTCStatsMemberInterface; | |
| 25 | |
| 26 // Abstract base class for RTCStats-derived dictionaries, see | |
| 27 // http://rawgit.com/w3c/webrtc-stats/master/webrtc-stats.html. | |
|
hta - Chromium
2016/08/15 15:14:57
Please use the w3c.github.io link - it's not as up
hbos
2016/08/15 22:46:43
Done.
| |
| 28 // | |
| 29 // All derived classes must have the following static variable defined: | |
| 30 // static const char* const kType; | |
| 31 // The address of |kType| is used as a unique class identifier and the value as | |
| 32 // a string representation of the class type, see | |
| 33 // http://rawgit.com/w3c/webrtc-stats/master/webrtc-stats.html#rtcstatstype-str* . | |
| 34 // | |
| 35 // Derived classes list their dictionary members, RTCStatsMember<T>, as public | |
| 36 // fields, allowing the following: | |
| 37 // | |
| 38 // RTCFooStats foo("fooId", GetCurrentTime()); | |
| 39 // foo.bar = 42; | |
| 40 // foo.baz = std::vector<std::string>(); | |
| 41 // foo.baz->push_back("hello world"); | |
| 42 // uint32_t x = *foo.bar; | |
| 43 // | |
| 44 // Pointers to all the members are available with |Members|, allowing iteration: | |
| 45 // | |
| 46 // for (const RTCStatsMemberInterface* member : foo.Members()) | |
| 47 // printf("%s = %s\n", member->name(), member->ValueToString().c_str()); | |
|
hta - Chromium
2016/08/15 15:14:57
Even examples in comments should follow the style
hbos
2016/08/15 22:46:43
Done.
| |
| 48 class RTCStats { | |
| 49 public: | |
| 50 RTCStats(const std::string& id, double timestamp) | |
| 51 : id_(id), timestamp_(timestamp) {} | |
| 52 RTCStats(std::string&& id, double timestamp) | |
| 53 : id_(std::move(id)), timestamp_(timestamp) {} | |
| 54 virtual ~RTCStats() {} | |
| 55 | |
| 56 virtual std::unique_ptr<RTCStats> copy() const = 0; | |
| 57 | |
| 58 const std::string& id() const { return id_; } | |
| 59 // Time in milliseconds relative to the UNIX epoch (Jan 1, 1970, UTC). | |
|
hta - Chromium
2016/08/15 15:14:56
Please use seconds when the type is double, unless
hbos
2016/08/15 22:46:43
Done. Now I say that it is in seconds, without - I
| |
| 60 double timestamp() const { return timestamp_; } | |
| 61 // Returns the address of the static |kType| variable of the implementing | |
| 62 // class. Comparing it to |&T::kType| tests if a stats object is of type |T|. | |
| 63 virtual const char* const* type() const = 0; | |
| 64 // Returns the value of the static |kType| variable of the implementing class. | |
| 65 virtual const char* type_name() const = 0; | |
| 66 // Returns a vector of pointers to all the RTCStatsMemberInterface members of | |
| 67 // this class. This allows for iteration of members. | |
| 68 virtual std::vector<const RTCStatsMemberInterface*> Members() const = 0; | |
| 69 | |
| 70 std::string ToString() const; | |
|
hta - Chromium
2016/08/15 15:14:57
What representation does ToString() return? Is it
hbos
2016/08/15 22:46:43
Creates a string like so:
peer-connection {
id:
| |
| 71 | |
| 72 template<typename T> | |
| 73 T& to() const { | |
|
hta - Chromium
2016/08/15 15:14:57
Is this function intended for downcasts (from the
hbos
2016/08/15 22:46:43
Updated to cast_to.
Yes, downcasting, e.g. RTCSta
| |
| 74 RTC_DCHECK_EQ(type(), &T::kType); | |
| 75 return static_cast<T&>(*this); | |
| 76 } | |
| 77 | |
| 78 protected: | |
| 79 static std::vector<const RTCStatsMemberInterface*> MembersVector( | |
| 80 const RTCStatsMemberInterface** members, size_t members_count); | |
| 81 | |
| 82 std::string const id_; | |
| 83 double timestamp_; | |
| 84 }; | |
| 85 | |
| 86 // Interface for |RTCStats| members, which have a name and an optional value. | |
| 87 // The value type is implementation-specific. Only the types listed in |Type| | |
| 88 // are supported, these are implemented by |RTCStatsMember<T>|. | |
| 89 class RTCStatsMemberInterface { | |
| 90 public: | |
| 91 // Member value types. | |
| 92 enum Type { | |
| 93 kInt32, // int32_t | |
| 94 kUint32, // uint32_t | |
| 95 kInt64, // int64_t | |
| 96 kUint64, // uint64_t | |
| 97 kDouble, // double | |
| 98 kStaticString, // const char* | |
| 99 kString, // std::string | |
| 100 | |
| 101 kSequenceInt32, // std::vector<int32_t> | |
| 102 kSequenceUint32, // std::vector<uint32_t> | |
| 103 kSequenceInt64, // std::vector<int64_t> | |
| 104 kSequenceUint64, // std::vector<uint64_t> | |
| 105 kSequenceDouble, // std::vector<double> | |
| 106 kSequenceStaticString, // std::vector<const char*> | |
| 107 kSequenceString, // std::vector<std::string> | |
| 108 }; | |
| 109 | |
| 110 virtual ~RTCStatsMemberInterface() {} | |
| 111 | |
| 112 const char* name() const { return name_; } | |
| 113 virtual Type type() const = 0; | |
| 114 virtual bool is_sequence() const = 0; | |
| 115 virtual bool is_string() const = 0; // true for sequences of strings too. | |
| 116 bool has_value() const { return has_value_; } | |
| 117 virtual std::string ValueToString() const = 0; | |
| 118 | |
| 119 template<typename T> | |
| 120 T& to() const { | |
|
hta - Chromium
2016/08/15 15:14:57
Same comment about name of function.
hbos
2016/08/15 22:46:43
Done.
| |
| 121 RTC_DCHECK_EQ(type(), T::kType); | |
| 122 return static_cast<T&>(*this); | |
| 123 } | |
| 124 | |
| 125 protected: | |
| 126 RTCStatsMemberInterface(const char* name, bool has_value) | |
| 127 : name_(name), has_value_(has_value) {} | |
| 128 | |
| 129 const char* const name_; | |
| 130 bool has_value_; | |
| 131 }; | |
| 132 | |
| 133 // Template implementation of |RTCStatsMemberInterface|. Every possible |T| is | |
| 134 // specialized in rtcstats.cc, using a different |T| results in a linker error | |
| 135 // (undefined reference to |kType|). The supported types are the ones described | |
| 136 // by |RTCStatsMemberInterface::Type|. | |
| 137 template<typename T> | |
| 138 class RTCStatsMember : public RTCStatsMemberInterface { | |
| 139 public: | |
| 140 static const Type kType; | |
| 141 | |
| 142 explicit RTCStatsMember(const char* name) | |
| 143 : RTCStatsMemberInterface(name, false), | |
| 144 value_() {} | |
| 145 RTCStatsMember(const char* name, const T& value) | |
| 146 : RTCStatsMemberInterface(name, true), | |
| 147 value_(value) {} | |
| 148 RTCStatsMember(const char* name, T&& value) | |
| 149 : RTCStatsMemberInterface(name, true), | |
| 150 value_(std::move(value)) {} | |
| 151 explicit RTCStatsMember(const RTCStatsMember<T>& other) | |
| 152 : RTCStatsMemberInterface(other.name_, other.has_value_), | |
| 153 value_(other.value_) {} | |
| 154 explicit RTCStatsMember(RTCStatsMember<T>&& other) | |
| 155 : RTCStatsMemberInterface(other.name_, other.has_value_), | |
| 156 value_(std::move(other.value_)) {} | |
| 157 | |
| 158 Type type() const override { return kType; } | |
| 159 bool is_sequence() const override; | |
| 160 bool is_string() const override; | |
| 161 std::string ValueToString() const override; | |
| 162 | |
| 163 // Assignment operators. | |
| 164 T& operator=(const T& value) { | |
| 165 value_ = value; | |
| 166 has_value_ = true; | |
| 167 return value_; | |
| 168 } | |
| 169 T& operator=(const T&& value) { | |
| 170 value_ = std::move(value); | |
| 171 has_value_ = true; | |
| 172 return value_; | |
| 173 } | |
| 174 T& operator=(const RTCStatsMember<T>& other) { | |
| 175 RTC_DCHECK(other.has_value_); | |
| 176 value_ = other.has_value_; | |
| 177 has_value_ = true; | |
| 178 return value_; | |
| 179 } | |
| 180 | |
| 181 // Value getters. | |
| 182 T& operator*() { | |
| 183 RTC_DCHECK(has_value_); | |
| 184 return value_; | |
| 185 } | |
| 186 const T& operator*() const { | |
| 187 RTC_DCHECK(has_value_); | |
| 188 return value_; | |
| 189 } | |
| 190 | |
| 191 // Value getters, arrow operator. | |
| 192 T* operator->() { | |
| 193 RTC_DCHECK(has_value_); | |
| 194 return &value_; | |
| 195 } | |
| 196 const T* operator->() const { | |
| 197 RTC_DCHECK(has_value_); | |
| 198 return &value_; | |
| 199 } | |
| 200 | |
| 201 private: | |
| 202 T value_; | |
| 203 }; | |
| 204 | |
| 205 } // namespace webrtc | |
| 206 | |
| 207 #endif // WEBRTC_API_RTCSTATS_H_ | |
| OLD | NEW |