| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright 2016 The WebRTC Project Authors. All rights reserved. | 2 * Copyright 2016 The WebRTC Project Authors. All rights reserved. |
| 3 * | 3 * |
| 4 * Use of this source code is governed by a BSD-style license | 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 | 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 | 6 * tree. An additional intellectual property rights grant can be found |
| 7 * in the file PATENTS. All contributing project authors may | 7 * in the file PATENTS. All contributing project authors may |
| 8 * be found in the AUTHORS file in the root of the source tree. | 8 * be found in the AUTHORS file in the root of the source tree. |
| 9 */ | 9 */ |
| 10 | 10 |
| (...skipping 73 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 84 // shall be reserved in the vector (so that subclasses can allocate a vector | 84 // shall be reserved in the vector (so that subclasses can allocate a vector |
| 85 // with room for both parent and child members without it having to resize). | 85 // with room for both parent and child members without it having to resize). |
| 86 virtual std::vector<const RTCStatsMemberInterface*> | 86 virtual std::vector<const RTCStatsMemberInterface*> |
| 87 MembersOfThisObjectAndAncestors( | 87 MembersOfThisObjectAndAncestors( |
| 88 size_t additional_capacity) const; | 88 size_t additional_capacity) const; |
| 89 | 89 |
| 90 std::string const id_; | 90 std::string const id_; |
| 91 int64_t timestamp_us_; | 91 int64_t timestamp_us_; |
| 92 }; | 92 }; |
| 93 | 93 |
| 94 // All |RTCStats| classes should use this macro in a public section of the class | 94 // All |RTCStats| classes should use these macros. |
| 95 // definition. | 95 // |WEBRTC_RTCSTATS_DECL| is placed in a public section of the class definition. |
| 96 // |WEBRTC_RTCSTATS_IMPL| is placed outside the class definition (in a .cc). |
| 96 // | 97 // |
| 97 // This macro declares the static |kType| and overrides methods as required by | 98 // These macros declare (in _DECL) and define (in _IMPL) the static |kType| and |
| 98 // subclasses of |RTCStats|: |copy|, |type|, and | 99 // overrides methods as required by subclasses of |RTCStats|: |copy|, |type| and |
| 99 // |MembersOfThisObjectAndAncestors|. The |...| argument is a list of addresses | 100 // |MembersOfThisObjectAndAncestors|. The |...| argument is a list of addresses |
| 100 // to each member defined in the implementing class (list cannot be empty, must | 101 // to each member defined in the implementing class. The list must have at least |
| 101 // have at least one new member). | 102 // one member. |
| 102 // | 103 // |
| 103 // (Since class names need to be known to implement these methods this cannot be | 104 // (Since class names need to be known to implement these methods this cannot be |
| 104 // part of the base |RTCStats|. While these methods could be implemented using | 105 // part of the base |RTCStats|. While these methods could be implemented using |
| 105 // templates, that would only work for immediate subclasses. Subclasses of | 106 // templates, that would only work for immediate subclasses. Subclasses of |
| 106 // subclasses also have to override these methods, resulting in boilerplate | 107 // subclasses also have to override these methods, resulting in boilerplate |
| 107 // code. Using a macro avoids this and works for any |RTCStats| class, including | 108 // code. Using a macro avoids this and works for any |RTCStats| class, including |
| 108 // grandchildren.) | 109 // grandchildren.) |
| 109 // | 110 // |
| 110 // Sample usage: | 111 // Sample usage: |
| 111 // | 112 // |
| 112 // rtcfoostats.h: | 113 // rtcfoostats.h: |
| 113 // class RTCFooStats : public RTCStats { | 114 // class RTCFooStats : public RTCStats { |
| 114 // public: | 115 // public: |
| 115 // RTCFooStats(const std::string& id, int64_t timestamp_us) | 116 // WEBRTC_RTCSTATS_DECL(); |
| 116 // : RTCStats(id, timestamp_us), | |
| 117 // foo("foo"), | |
| 118 // bar("bar") { | |
| 119 // } | |
| 120 // | 117 // |
| 121 // WEBRTC_RTCSTATS_IMPL(RTCStats, RTCFooStats, | 118 // RTCFooStats(const std::string& id, int64_t timestamp_us); |
| 122 // &foo, | |
| 123 // &bar); | |
| 124 // | 119 // |
| 125 // RTCStatsMember<int32_t> foo; | 120 // RTCStatsMember<int32_t> foo; |
| 126 // RTCStatsMember<int32_t> bar; | 121 // RTCStatsMember<int32_t> bar; |
| 127 // }; | 122 // }; |
| 128 // | 123 // |
| 129 // rtcfoostats.cc: | 124 // rtcfoostats.cc: |
| 130 // const char RTCFooStats::kType[] = "foo-stats"; | 125 // WEBRTC_RTCSTATS_IMPL(RTCFooStats, RTCStats, "foo-stats" |
| 126 // &foo, |
| 127 // &bar); |
| 131 // | 128 // |
| 132 #define WEBRTC_RTCSTATS_IMPL(parent_class, this_class, ...) \ | 129 // RTCFooStats::RTCFooStats(const std::string& id, int64_t timestamp_us) |
| 130 // : RTCStats(id, timestamp_us), |
| 131 // foo("foo"), |
| 132 // bar("bar") { |
| 133 // } |
| 134 // |
| 135 #define WEBRTC_RTCSTATS_DECL() \ |
| 133 public: \ | 136 public: \ |
| 134 static const char kType[]; \ | 137 static const char kType[]; \ |
| 135 std::unique_ptr<webrtc::RTCStats> copy() const override { \ | 138 \ |
| 136 return std::unique_ptr<webrtc::RTCStats>(new this_class(*this)); \ | 139 std::unique_ptr<webrtc::RTCStats> copy() const override; \ |
| 137 } \ | 140 const char* type() const override; \ |
| 138 const char* type() const override { return this_class::kType; } \ | 141 \ |
| 139 protected: \ | 142 protected: \ |
| 140 std::vector<const webrtc::RTCStatsMemberInterface*> \ | 143 std::vector<const webrtc::RTCStatsMemberInterface*> \ |
| 141 MembersOfThisObjectAndAncestors( \ | 144 MembersOfThisObjectAndAncestors( \ |
| 142 size_t local_var_additional_capacity) const override { \ | 145 size_t local_var_additional_capacity) const override; \ |
| 146 \ |
| 147 public: |
| 148 |
| 149 #define WEBRTC_RTCSTATS_IMPL(this_class, parent_class, type_str, ...) \ |
| 150 const char this_class::kType[] = type_str; \ |
| 151 \ |
| 152 std::unique_ptr<webrtc::RTCStats> this_class::copy() const { \ |
| 153 return std::unique_ptr<webrtc::RTCStats>(new this_class(*this)); \ |
| 154 } \ |
| 155 \ |
| 156 const char* this_class::type() const { \ |
| 157 return this_class::kType; \ |
| 158 } \ |
| 159 \ |
| 160 std::vector<const webrtc::RTCStatsMemberInterface*> \ |
| 161 this_class::MembersOfThisObjectAndAncestors( \ |
| 162 size_t local_var_additional_capacity) const { \ |
| 143 const webrtc::RTCStatsMemberInterface* local_var_members[] = { \ | 163 const webrtc::RTCStatsMemberInterface* local_var_members[] = { \ |
| 144 __VA_ARGS__ \ | 164 __VA_ARGS__ \ |
| 145 }; \ | 165 }; \ |
| 146 size_t local_var_members_count = \ | 166 size_t local_var_members_count = \ |
| 147 sizeof(local_var_members) / sizeof(local_var_members[0]); \ | 167 sizeof(local_var_members) / sizeof(local_var_members[0]); \ |
| 148 std::vector<const webrtc::RTCStatsMemberInterface*> local_var_members_vec =\ | 168 std::vector<const webrtc::RTCStatsMemberInterface*> local_var_members_vec =\ |
| 149 parent_class::MembersOfThisObjectAndAncestors( \ | 169 parent_class::MembersOfThisObjectAndAncestors( \ |
| 150 local_var_members_count + local_var_additional_capacity); \ | 170 local_var_members_count + local_var_additional_capacity); \ |
| 151 RTC_DCHECK_GE( \ | 171 RTC_DCHECK_GE( \ |
| 152 local_var_members_vec.capacity() - local_var_members_vec.size(), \ | 172 local_var_members_vec.capacity() - local_var_members_vec.size(), \ |
| 153 local_var_members_count + local_var_additional_capacity); \ | 173 local_var_members_count + local_var_additional_capacity); \ |
| 154 local_var_members_vec.insert(local_var_members_vec.end(), \ | 174 local_var_members_vec.insert(local_var_members_vec.end(), \ |
| 155 &local_var_members[0], \ | 175 &local_var_members[0], \ |
| 156 &local_var_members[local_var_members_count]); \ | 176 &local_var_members[local_var_members_count]); \ |
| 157 return local_var_members_vec; \ | 177 return local_var_members_vec; \ |
| 158 } \ | 178 } |
| 159 public: | |
| 160 | 179 |
| 161 // Interface for |RTCStats| members, which have a name and a value of a type | 180 // Interface for |RTCStats| members, which have a name and a value of a type |
| 162 // defined in a subclass. Only the types listed in |Type| are supported, these | 181 // defined in a subclass. Only the types listed in |Type| are supported, these |
| 163 // are implemented by |RTCStatsMember<T>|. The value of a member may be | 182 // are implemented by |RTCStatsMember<T>|. The value of a member may be |
| 164 // undefined, the value can only be read if |is_defined|. | 183 // undefined, the value can only be read if |is_defined|. |
| 165 class RTCStatsMemberInterface { | 184 class RTCStatsMemberInterface { |
| 166 public: | 185 public: |
| 167 // Member value types. | 186 // Member value types. |
| 168 enum Type { | 187 enum Type { |
| 169 kBool, // bool | 188 kBool, // bool |
| (...skipping 104 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 274 return &value_; | 293 return &value_; |
| 275 } | 294 } |
| 276 | 295 |
| 277 private: | 296 private: |
| 278 T value_; | 297 T value_; |
| 279 }; | 298 }; |
| 280 | 299 |
| 281 } // namespace webrtc | 300 } // namespace webrtc |
| 282 | 301 |
| 283 #endif // WEBRTC_API_STATS_RTCSTATS_H_ | 302 #endif // WEBRTC_API_STATS_RTCSTATS_H_ |
| OLD | NEW |