Skip to content
This repository was archived by the owner on Nov 6, 2025. It is now read-only.

Commit aae7661

Browse files
committed
Make RTCStatsMember::kType constexpr
RTCStatsMember::kType cannot be initialized with a separate definition when compiling for Windows with rtc_enable_symbol_export. Instead, initialize the member when declaring. The change also allows to make it constexpr and to inline the value to code.
1 parent cf108ce commit aae7661

File tree

2 files changed

+96
-86
lines changed

2 files changed

+96
-86
lines changed

api/stats/rtc_stats.h

Lines changed: 29 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -279,14 +279,40 @@ class RTCStatsMemberInterface {
279279
bool is_defined_;
280280
};
281281

282+
template <typename T>
283+
struct RTCStatsMemberTypeInternal;
284+
285+
#define WEBRTC_DEFINE_RTCSTATSMEMBER_TYPE(T, type) \
286+
template<> \
287+
struct RTCStatsMemberTypeInternal<T> { \
288+
static constexpr RTCStatsMemberInterface::Type kValue = \
289+
RTCStatsMemberInterface::type; \
290+
};
291+
292+
WEBRTC_DEFINE_RTCSTATSMEMBER_TYPE(bool, kBool)
293+
WEBRTC_DEFINE_RTCSTATSMEMBER_TYPE(int32_t, kInt32)
294+
WEBRTC_DEFINE_RTCSTATSMEMBER_TYPE(uint32_t, kUint32)
295+
WEBRTC_DEFINE_RTCSTATSMEMBER_TYPE(int64_t, kInt64)
296+
WEBRTC_DEFINE_RTCSTATSMEMBER_TYPE(uint64_t, kUint64)
297+
WEBRTC_DEFINE_RTCSTATSMEMBER_TYPE(double, kDouble)
298+
WEBRTC_DEFINE_RTCSTATSMEMBER_TYPE(std::string, kString)
299+
WEBRTC_DEFINE_RTCSTATSMEMBER_TYPE(std::vector<bool>, kSequenceBool)
300+
WEBRTC_DEFINE_RTCSTATSMEMBER_TYPE(std::vector<int32_t>, kSequenceInt32)
301+
WEBRTC_DEFINE_RTCSTATSMEMBER_TYPE(std::vector<uint32_t>, kSequenceUint32)
302+
WEBRTC_DEFINE_RTCSTATSMEMBER_TYPE(std::vector<int64_t>, kSequenceInt64)
303+
WEBRTC_DEFINE_RTCSTATSMEMBER_TYPE(std::vector<uint64_t>, kSequenceUint64)
304+
WEBRTC_DEFINE_RTCSTATSMEMBER_TYPE(std::vector<double>, kSequenceDouble)
305+
WEBRTC_DEFINE_RTCSTATSMEMBER_TYPE(std::vector<std::string>, kSequenceString)
306+
282307
// Template implementation of |RTCStatsMemberInterface|. Every possible |T| is
283-
// specialized in rtcstats.cc, using a different |T| results in a linker error
284-
// (undefined reference to |kType|). The supported types are the ones described
308+
// specialized in this file for kType and in rtcstats.cc for functions, using a
309+
// different |T| results in a compile error (undefined reference to
310+
// |RTCStatsMemberTypeInternal<T>|). The supported types are the ones described
285311
// by |RTCStatsMemberInterface::Type|.
286312
template <typename T>
287313
class RTC_EXPORT RTCStatsMember : public RTCStatsMemberInterface {
288314
public:
289-
static const Type kType;
315+
static constexpr Type kType = RTCStatsMemberTypeInternal<T>::kValue;
290316

291317
explicit RTCStatsMember(const char* name)
292318
: RTCStatsMemberInterface(name, /*is_defined=*/false), value_() {}

stats/rtc_stats.cc

Lines changed: 67 additions & 83 deletions
Original file line numberDiff line numberDiff line change
@@ -126,10 +126,7 @@ RTCStats::MembersOfThisObjectAndAncestors(size_t additional_capacity) const {
126126
return members;
127127
}
128128

129-
#define WEBRTC_DEFINE_RTCSTATSMEMBER(T, type, is_seq, is_str, to_str, to_json) \
130-
template <> \
131-
const RTCStatsMemberInterface::Type RTCStatsMember<T>::kType = \
132-
RTCStatsMemberInterface::type; \
129+
#define WEBRTC_DEFINE_RTCSTATSMEMBER_IMPL(T, is_seq, is_str, to_str, to_json) \
133130
template <> \
134131
bool RTCStatsMember<T>::is_sequence() const { \
135132
return is_seq; \
@@ -149,84 +146,71 @@ RTCStats::MembersOfThisObjectAndAncestors(size_t additional_capacity) const {
149146
return to_json; \
150147
}
151148

152-
WEBRTC_DEFINE_RTCSTATSMEMBER(bool,
153-
kBool,
154-
false,
155-
false,
156-
rtc::ToString(value_),
157-
rtc::ToString(value_))
158-
WEBRTC_DEFINE_RTCSTATSMEMBER(int32_t,
159-
kInt32,
160-
false,
161-
false,
162-
rtc::ToString(value_),
163-
rtc::ToString(value_))
164-
WEBRTC_DEFINE_RTCSTATSMEMBER(uint32_t,
165-
kUint32,
166-
false,
167-
false,
168-
rtc::ToString(value_),
169-
rtc::ToString(value_))
170-
WEBRTC_DEFINE_RTCSTATSMEMBER(int64_t,
171-
kInt64,
172-
false,
173-
false,
174-
rtc::ToString(value_),
175-
ToStringAsDouble(value_))
176-
WEBRTC_DEFINE_RTCSTATSMEMBER(uint64_t,
177-
kUint64,
178-
false,
179-
false,
180-
rtc::ToString(value_),
181-
ToStringAsDouble(value_))
182-
WEBRTC_DEFINE_RTCSTATSMEMBER(double,
183-
kDouble,
184-
false,
185-
false,
186-
rtc::ToString(value_),
187-
ToStringAsDouble(value_))
188-
WEBRTC_DEFINE_RTCSTATSMEMBER(std::string, kString, false, true, value_, value_)
189-
WEBRTC_DEFINE_RTCSTATSMEMBER(std::vector<bool>,
190-
kSequenceBool,
191-
true,
192-
false,
193-
VectorToString(value_),
194-
VectorToString(value_))
195-
WEBRTC_DEFINE_RTCSTATSMEMBER(std::vector<int32_t>,
196-
kSequenceInt32,
197-
true,
198-
false,
199-
VectorToString(value_),
200-
VectorToString(value_))
201-
WEBRTC_DEFINE_RTCSTATSMEMBER(std::vector<uint32_t>,
202-
kSequenceUint32,
203-
true,
204-
false,
205-
VectorToString(value_),
206-
VectorToString(value_))
207-
WEBRTC_DEFINE_RTCSTATSMEMBER(std::vector<int64_t>,
208-
kSequenceInt64,
209-
true,
210-
false,
211-
VectorToString(value_),
212-
VectorToStringAsDouble(value_))
213-
WEBRTC_DEFINE_RTCSTATSMEMBER(std::vector<uint64_t>,
214-
kSequenceUint64,
215-
true,
216-
false,
217-
VectorToString(value_),
218-
VectorToStringAsDouble(value_))
219-
WEBRTC_DEFINE_RTCSTATSMEMBER(std::vector<double>,
220-
kSequenceDouble,
221-
true,
222-
false,
223-
VectorToString(value_),
224-
VectorToStringAsDouble(value_))
225-
WEBRTC_DEFINE_RTCSTATSMEMBER(std::vector<std::string>,
226-
kSequenceString,
227-
true,
228-
false,
229-
VectorOfStringsToString(value_),
230-
VectorOfStringsToString(value_))
149+
WEBRTC_DEFINE_RTCSTATSMEMBER_IMPL(bool,
150+
false,
151+
false,
152+
rtc::ToString(value_),
153+
rtc::ToString(value_))
154+
WEBRTC_DEFINE_RTCSTATSMEMBER_IMPL(int32_t,
155+
false,
156+
false,
157+
rtc::ToString(value_),
158+
rtc::ToString(value_))
159+
WEBRTC_DEFINE_RTCSTATSMEMBER_IMPL(uint32_t,
160+
false,
161+
false,
162+
rtc::ToString(value_),
163+
rtc::ToString(value_))
164+
WEBRTC_DEFINE_RTCSTATSMEMBER_IMPL(int64_t,
165+
false,
166+
false,
167+
rtc::ToString(value_),
168+
ToStringAsDouble(value_))
169+
WEBRTC_DEFINE_RTCSTATSMEMBER_IMPL(uint64_t,
170+
false,
171+
false,
172+
rtc::ToString(value_),
173+
ToStringAsDouble(value_))
174+
WEBRTC_DEFINE_RTCSTATSMEMBER_IMPL(double,
175+
false,
176+
false,
177+
rtc::ToString(value_),
178+
ToStringAsDouble(value_))
179+
WEBRTC_DEFINE_RTCSTATSMEMBER_IMPL(std::string, false, true, value_, value_)
180+
WEBRTC_DEFINE_RTCSTATSMEMBER_IMPL(std::vector<bool>,
181+
true,
182+
false,
183+
VectorToString(value_),
184+
VectorToString(value_))
185+
WEBRTC_DEFINE_RTCSTATSMEMBER_IMPL(std::vector<int32_t>,
186+
true,
187+
false,
188+
VectorToString(value_),
189+
VectorToString(value_))
190+
WEBRTC_DEFINE_RTCSTATSMEMBER_IMPL(std::vector<uint32_t>,
191+
true,
192+
false,
193+
VectorToString(value_),
194+
VectorToString(value_))
195+
WEBRTC_DEFINE_RTCSTATSMEMBER_IMPL(std::vector<int64_t>,
196+
true,
197+
false,
198+
VectorToString(value_),
199+
VectorToStringAsDouble(value_))
200+
WEBRTC_DEFINE_RTCSTATSMEMBER_IMPL(std::vector<uint64_t>,
201+
true,
202+
false,
203+
VectorToString(value_),
204+
VectorToStringAsDouble(value_))
205+
WEBRTC_DEFINE_RTCSTATSMEMBER_IMPL(std::vector<double>,
206+
true,
207+
false,
208+
VectorToString(value_),
209+
VectorToStringAsDouble(value_))
210+
WEBRTC_DEFINE_RTCSTATSMEMBER_IMPL(std::vector<std::string>,
211+
true,
212+
false,
213+
VectorOfStringsToString(value_),
214+
VectorOfStringsToString(value_))
231215

232216
} // namespace webrtc

0 commit comments

Comments
 (0)