webrtcvad 0.1.0 → 0.2.3
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/ext/webrtcvad/extconf.rb +29 -0
- data/ext/webrtcvad/webrtc/common_audio/signal_processing/division_operations.c +141 -0
- data/ext/webrtcvad/webrtc/common_audio/signal_processing/dot_product_with_scale.h +40 -0
- data/ext/webrtcvad/webrtc/common_audio/signal_processing/energy.c +39 -0
- data/ext/webrtcvad/webrtc/common_audio/signal_processing/get_scaling_square.c +46 -0
- data/ext/webrtcvad/webrtc/common_audio/signal_processing/include/signal_processing_library.h +1605 -0
- data/ext/webrtcvad/webrtc/common_audio/signal_processing/include/spl_inl.h +153 -0
- data/ext/webrtcvad/webrtc/common_audio/signal_processing/resample_48khz.c +186 -0
- data/ext/webrtcvad/webrtc/common_audio/signal_processing/resample_by_2_internal.c +689 -0
- data/ext/webrtcvad/webrtc/common_audio/signal_processing/resample_by_2_internal.h +60 -0
- data/ext/webrtcvad/webrtc/common_audio/signal_processing/resample_fractional.c +239 -0
- data/ext/webrtcvad/webrtc/common_audio/third_party/spl_sqrt_floor/spl_sqrt_floor.c +77 -0
- data/ext/webrtcvad/webrtc/common_audio/third_party/spl_sqrt_floor/spl_sqrt_floor.h +29 -0
- data/ext/webrtcvad/webrtc/common_audio/third_party/spl_sqrt_floor/spl_sqrt_floor_mips.c +207 -0
- data/ext/webrtcvad/webrtc/common_audio/vad/include/webrtc_vad.h +87 -0
- data/ext/webrtcvad/webrtc/common_audio/vad/vad_core.c +685 -0
- data/ext/webrtcvad/webrtc/common_audio/vad/vad_core.h +114 -0
- data/ext/webrtcvad/webrtc/common_audio/vad/vad_filterbank.c +329 -0
- data/ext/webrtcvad/webrtc/common_audio/vad/vad_filterbank.h +45 -0
- data/ext/webrtcvad/webrtc/common_audio/vad/vad_gmm.c +82 -0
- data/ext/webrtcvad/webrtc/common_audio/vad/vad_gmm.h +39 -0
- data/ext/webrtcvad/webrtc/common_audio/vad/vad_sp.c +176 -0
- data/ext/webrtcvad/webrtc/common_audio/vad/vad_sp.h +54 -0
- data/ext/webrtcvad/webrtc/common_audio/vad/webrtc_vad.c +114 -0
- data/ext/webrtcvad/webrtc/rtc_base/checks.cc +207 -0
- data/ext/webrtcvad/webrtc/rtc_base/checks.h +400 -0
- data/ext/webrtcvad/webrtc/rtc_base/compile_assert_c.h +25 -0
- data/ext/webrtcvad/webrtc/rtc_base/numerics/safe_compare.h +176 -0
- data/ext/webrtcvad/webrtc/rtc_base/sanitizer.h +144 -0
- data/ext/webrtcvad/webrtc/rtc_base/system/inline.h +31 -0
- data/ext/webrtcvad/webrtc/rtc_base/system/rtc_export.h +43 -0
- data/ext/webrtcvad/webrtc/rtc_base/type_traits.h +140 -0
- data/ext/webrtcvad/webrtcvad.c +112 -0
- metadata +37 -3
@@ -0,0 +1,25 @@
|
|
1
|
+
/*
|
2
|
+
* Copyright (c) 2012 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 RTC_BASE_COMPILE_ASSERT_C_H_
|
12
|
+
#define RTC_BASE_COMPILE_ASSERT_C_H_
|
13
|
+
|
14
|
+
// Use this macro to verify at compile time that certain restrictions are met.
|
15
|
+
// The argument is the boolean expression to evaluate.
|
16
|
+
// Example:
|
17
|
+
// RTC_COMPILE_ASSERT(sizeof(foo) < 128);
|
18
|
+
// Note: In C++, use static_assert instead!
|
19
|
+
#define RTC_COMPILE_ASSERT(expression) \
|
20
|
+
switch (0) { \
|
21
|
+
case 0: \
|
22
|
+
case expression:; \
|
23
|
+
}
|
24
|
+
|
25
|
+
#endif // RTC_BASE_COMPILE_ASSERT_C_H_
|
@@ -0,0 +1,176 @@
|
|
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
|
+
// This file defines six constexpr functions:
|
12
|
+
//
|
13
|
+
// rtc::SafeEq // ==
|
14
|
+
// rtc::SafeNe // !=
|
15
|
+
// rtc::SafeLt // <
|
16
|
+
// rtc::SafeLe // <=
|
17
|
+
// rtc::SafeGt // >
|
18
|
+
// rtc::SafeGe // >=
|
19
|
+
//
|
20
|
+
// They each accept two arguments of arbitrary types, and in almost all cases,
|
21
|
+
// they simply call the appropriate comparison operator. However, if both
|
22
|
+
// arguments are integers, they don't compare them using C++'s quirky rules,
|
23
|
+
// but instead adhere to the true mathematical definitions. It is as if the
|
24
|
+
// arguments were first converted to infinite-range signed integers, and then
|
25
|
+
// compared, although of course nothing expensive like that actually takes
|
26
|
+
// place. In practice, for signed/signed and unsigned/unsigned comparisons and
|
27
|
+
// some mixed-signed comparisons with a compile-time constant, the overhead is
|
28
|
+
// zero; in the remaining cases, it is just a few machine instructions (no
|
29
|
+
// branches).
|
30
|
+
|
31
|
+
#ifndef RTC_BASE_NUMERICS_SAFE_COMPARE_H_
|
32
|
+
#define RTC_BASE_NUMERICS_SAFE_COMPARE_H_
|
33
|
+
|
34
|
+
#include <stddef.h>
|
35
|
+
#include <stdint.h>
|
36
|
+
|
37
|
+
#include <type_traits>
|
38
|
+
#include <utility>
|
39
|
+
|
40
|
+
#include "rtc_base/type_traits.h"
|
41
|
+
|
42
|
+
namespace rtc {
|
43
|
+
|
44
|
+
namespace safe_cmp_impl {
|
45
|
+
|
46
|
+
template <size_t N>
|
47
|
+
struct LargerIntImpl : std::false_type {};
|
48
|
+
template <>
|
49
|
+
struct LargerIntImpl<sizeof(int8_t)> : std::true_type {
|
50
|
+
using type = int16_t;
|
51
|
+
};
|
52
|
+
template <>
|
53
|
+
struct LargerIntImpl<sizeof(int16_t)> : std::true_type {
|
54
|
+
using type = int32_t;
|
55
|
+
};
|
56
|
+
template <>
|
57
|
+
struct LargerIntImpl<sizeof(int32_t)> : std::true_type {
|
58
|
+
using type = int64_t;
|
59
|
+
};
|
60
|
+
|
61
|
+
// LargerInt<T1, T2>::value is true iff there's a signed type that's larger
|
62
|
+
// than T1 (and no larger than the larger of T2 and int*, for performance
|
63
|
+
// reasons); and if there is such a type, LargerInt<T1, T2>::type is an alias
|
64
|
+
// for it.
|
65
|
+
template <typename T1, typename T2>
|
66
|
+
struct LargerInt
|
67
|
+
: LargerIntImpl<sizeof(T1) < sizeof(T2) || sizeof(T1) < sizeof(int*)
|
68
|
+
? sizeof(T1)
|
69
|
+
: 0> {};
|
70
|
+
|
71
|
+
template <typename T>
|
72
|
+
constexpr typename std::make_unsigned<T>::type MakeUnsigned(T a) {
|
73
|
+
return static_cast<typename std::make_unsigned<T>::type>(a);
|
74
|
+
}
|
75
|
+
|
76
|
+
// Overload for when both T1 and T2 have the same signedness.
|
77
|
+
template <typename Op,
|
78
|
+
typename T1,
|
79
|
+
typename T2,
|
80
|
+
typename std::enable_if<std::is_signed<T1>::value ==
|
81
|
+
std::is_signed<T2>::value>::type* = nullptr>
|
82
|
+
constexpr bool Cmp(T1 a, T2 b) {
|
83
|
+
return Op::Op(a, b);
|
84
|
+
}
|
85
|
+
|
86
|
+
// Overload for signed - unsigned comparison that can be promoted to a bigger
|
87
|
+
// signed type.
|
88
|
+
template <typename Op,
|
89
|
+
typename T1,
|
90
|
+
typename T2,
|
91
|
+
typename std::enable_if<std::is_signed<T1>::value &&
|
92
|
+
std::is_unsigned<T2>::value &&
|
93
|
+
LargerInt<T2, T1>::value>::type* = nullptr>
|
94
|
+
constexpr bool Cmp(T1 a, T2 b) {
|
95
|
+
return Op::Op(a, static_cast<typename LargerInt<T2, T1>::type>(b));
|
96
|
+
}
|
97
|
+
|
98
|
+
// Overload for unsigned - signed comparison that can be promoted to a bigger
|
99
|
+
// signed type.
|
100
|
+
template <typename Op,
|
101
|
+
typename T1,
|
102
|
+
typename T2,
|
103
|
+
typename std::enable_if<std::is_unsigned<T1>::value &&
|
104
|
+
std::is_signed<T2>::value &&
|
105
|
+
LargerInt<T1, T2>::value>::type* = nullptr>
|
106
|
+
constexpr bool Cmp(T1 a, T2 b) {
|
107
|
+
return Op::Op(static_cast<typename LargerInt<T1, T2>::type>(a), b);
|
108
|
+
}
|
109
|
+
|
110
|
+
// Overload for signed - unsigned comparison that can't be promoted to a bigger
|
111
|
+
// signed type.
|
112
|
+
template <typename Op,
|
113
|
+
typename T1,
|
114
|
+
typename T2,
|
115
|
+
typename std::enable_if<std::is_signed<T1>::value &&
|
116
|
+
std::is_unsigned<T2>::value &&
|
117
|
+
!LargerInt<T2, T1>::value>::type* = nullptr>
|
118
|
+
constexpr bool Cmp(T1 a, T2 b) {
|
119
|
+
return a < 0 ? Op::Op(-1, 0) : Op::Op(safe_cmp_impl::MakeUnsigned(a), b);
|
120
|
+
}
|
121
|
+
|
122
|
+
// Overload for unsigned - signed comparison that can't be promoted to a bigger
|
123
|
+
// signed type.
|
124
|
+
template <typename Op,
|
125
|
+
typename T1,
|
126
|
+
typename T2,
|
127
|
+
typename std::enable_if<std::is_unsigned<T1>::value &&
|
128
|
+
std::is_signed<T2>::value &&
|
129
|
+
!LargerInt<T1, T2>::value>::type* = nullptr>
|
130
|
+
constexpr bool Cmp(T1 a, T2 b) {
|
131
|
+
return b < 0 ? Op::Op(0, -1) : Op::Op(a, safe_cmp_impl::MakeUnsigned(b));
|
132
|
+
}
|
133
|
+
|
134
|
+
#define RTC_SAFECMP_MAKE_OP(name, op) \
|
135
|
+
struct name { \
|
136
|
+
template <typename T1, typename T2> \
|
137
|
+
static constexpr bool Op(T1 a, T2 b) { \
|
138
|
+
return a op b; \
|
139
|
+
} \
|
140
|
+
};
|
141
|
+
RTC_SAFECMP_MAKE_OP(EqOp, ==)
|
142
|
+
RTC_SAFECMP_MAKE_OP(NeOp, !=)
|
143
|
+
RTC_SAFECMP_MAKE_OP(LtOp, <)
|
144
|
+
RTC_SAFECMP_MAKE_OP(LeOp, <=)
|
145
|
+
RTC_SAFECMP_MAKE_OP(GtOp, >)
|
146
|
+
RTC_SAFECMP_MAKE_OP(GeOp, >=)
|
147
|
+
#undef RTC_SAFECMP_MAKE_OP
|
148
|
+
|
149
|
+
} // namespace safe_cmp_impl
|
150
|
+
|
151
|
+
#define RTC_SAFECMP_MAKE_FUN(name) \
|
152
|
+
template <typename T1, typename T2> \
|
153
|
+
constexpr \
|
154
|
+
typename std::enable_if<IsIntlike<T1>::value && IsIntlike<T2>::value, \
|
155
|
+
bool>::type Safe##name(T1 a, T2 b) { \
|
156
|
+
/* Unary plus here turns enums into real integral types. */ \
|
157
|
+
return safe_cmp_impl::Cmp<safe_cmp_impl::name##Op>(+a, +b); \
|
158
|
+
} \
|
159
|
+
template <typename T1, typename T2> \
|
160
|
+
constexpr \
|
161
|
+
typename std::enable_if<!IsIntlike<T1>::value || !IsIntlike<T2>::value, \
|
162
|
+
bool>::type Safe##name(const T1& a, \
|
163
|
+
const T2& b) { \
|
164
|
+
return safe_cmp_impl::name##Op::Op(a, b); \
|
165
|
+
}
|
166
|
+
RTC_SAFECMP_MAKE_FUN(Eq)
|
167
|
+
RTC_SAFECMP_MAKE_FUN(Ne)
|
168
|
+
RTC_SAFECMP_MAKE_FUN(Lt)
|
169
|
+
RTC_SAFECMP_MAKE_FUN(Le)
|
170
|
+
RTC_SAFECMP_MAKE_FUN(Gt)
|
171
|
+
RTC_SAFECMP_MAKE_FUN(Ge)
|
172
|
+
#undef RTC_SAFECMP_MAKE_FUN
|
173
|
+
|
174
|
+
} // namespace rtc
|
175
|
+
|
176
|
+
#endif // RTC_BASE_NUMERICS_SAFE_COMPARE_H_
|
@@ -0,0 +1,144 @@
|
|
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 RTC_BASE_SANITIZER_H_
|
12
|
+
#define RTC_BASE_SANITIZER_H_
|
13
|
+
|
14
|
+
#include <stddef.h> // For size_t.
|
15
|
+
|
16
|
+
#ifdef __cplusplus
|
17
|
+
#include "absl/meta/type_traits.h"
|
18
|
+
#endif
|
19
|
+
|
20
|
+
#if defined(__has_feature)
|
21
|
+
#if __has_feature(address_sanitizer)
|
22
|
+
#define RTC_HAS_ASAN 1
|
23
|
+
#endif
|
24
|
+
#if __has_feature(memory_sanitizer)
|
25
|
+
#define RTC_HAS_MSAN 1
|
26
|
+
#endif
|
27
|
+
#endif
|
28
|
+
#ifndef RTC_HAS_ASAN
|
29
|
+
#define RTC_HAS_ASAN 0
|
30
|
+
#endif
|
31
|
+
#ifndef RTC_HAS_MSAN
|
32
|
+
#define RTC_HAS_MSAN 0
|
33
|
+
#endif
|
34
|
+
|
35
|
+
#if RTC_HAS_ASAN
|
36
|
+
#include <sanitizer/asan_interface.h>
|
37
|
+
#endif
|
38
|
+
#if RTC_HAS_MSAN
|
39
|
+
#include <sanitizer/msan_interface.h>
|
40
|
+
#endif
|
41
|
+
|
42
|
+
#ifdef __has_attribute
|
43
|
+
#if __has_attribute(no_sanitize)
|
44
|
+
#define RTC_NO_SANITIZE(what) __attribute__((no_sanitize(what)))
|
45
|
+
#endif
|
46
|
+
#endif
|
47
|
+
#ifndef RTC_NO_SANITIZE
|
48
|
+
#define RTC_NO_SANITIZE(what)
|
49
|
+
#endif
|
50
|
+
|
51
|
+
// Ask ASan to mark the memory range [ptr, ptr + element_size * num_elements)
|
52
|
+
// as being unaddressable, so that reads and writes are not allowed. ASan may
|
53
|
+
// narrow the range to the nearest alignment boundaries.
|
54
|
+
static inline void rtc_AsanPoison(const volatile void* ptr,
|
55
|
+
size_t element_size,
|
56
|
+
size_t num_elements) {
|
57
|
+
#if RTC_HAS_ASAN
|
58
|
+
ASAN_POISON_MEMORY_REGION(ptr, element_size * num_elements);
|
59
|
+
#endif
|
60
|
+
}
|
61
|
+
|
62
|
+
// Ask ASan to mark the memory range [ptr, ptr + element_size * num_elements)
|
63
|
+
// as being addressable, so that reads and writes are allowed. ASan may widen
|
64
|
+
// the range to the nearest alignment boundaries.
|
65
|
+
static inline void rtc_AsanUnpoison(const volatile void* ptr,
|
66
|
+
size_t element_size,
|
67
|
+
size_t num_elements) {
|
68
|
+
#if RTC_HAS_ASAN
|
69
|
+
ASAN_UNPOISON_MEMORY_REGION(ptr, element_size * num_elements);
|
70
|
+
#endif
|
71
|
+
}
|
72
|
+
|
73
|
+
// Ask MSan to mark the memory range [ptr, ptr + element_size * num_elements)
|
74
|
+
// as being uninitialized.
|
75
|
+
static inline void rtc_MsanMarkUninitialized(const volatile void* ptr,
|
76
|
+
size_t element_size,
|
77
|
+
size_t num_elements) {
|
78
|
+
#if RTC_HAS_MSAN
|
79
|
+
__msan_poison(ptr, element_size * num_elements);
|
80
|
+
#endif
|
81
|
+
}
|
82
|
+
|
83
|
+
// Force an MSan check (if any bits in the memory range [ptr, ptr +
|
84
|
+
// element_size * num_elements) are uninitialized the call will crash with an
|
85
|
+
// MSan report).
|
86
|
+
static inline void rtc_MsanCheckInitialized(const volatile void* ptr,
|
87
|
+
size_t element_size,
|
88
|
+
size_t num_elements) {
|
89
|
+
#if RTC_HAS_MSAN
|
90
|
+
__msan_check_mem_is_initialized(ptr, element_size * num_elements);
|
91
|
+
#endif
|
92
|
+
}
|
93
|
+
|
94
|
+
#ifdef __cplusplus
|
95
|
+
|
96
|
+
namespace rtc {
|
97
|
+
namespace sanitizer_impl {
|
98
|
+
|
99
|
+
template <typename T>
|
100
|
+
constexpr bool IsTriviallyCopyable() {
|
101
|
+
return static_cast<bool>(absl::is_trivially_copy_constructible<T>::value &&
|
102
|
+
(absl::is_trivially_copy_assignable<T>::value ||
|
103
|
+
!std::is_copy_assignable<T>::value) &&
|
104
|
+
absl::is_trivially_destructible<T>::value);
|
105
|
+
}
|
106
|
+
|
107
|
+
} // namespace sanitizer_impl
|
108
|
+
|
109
|
+
template <typename T>
|
110
|
+
inline void AsanPoison(const T& mem) {
|
111
|
+
rtc_AsanPoison(mem.data(), sizeof(mem.data()[0]), mem.size());
|
112
|
+
}
|
113
|
+
|
114
|
+
template <typename T>
|
115
|
+
inline void AsanUnpoison(const T& mem) {
|
116
|
+
rtc_AsanUnpoison(mem.data(), sizeof(mem.data()[0]), mem.size());
|
117
|
+
}
|
118
|
+
|
119
|
+
template <typename T>
|
120
|
+
inline void MsanMarkUninitialized(const T& mem) {
|
121
|
+
rtc_MsanMarkUninitialized(mem.data(), sizeof(mem.data()[0]), mem.size());
|
122
|
+
}
|
123
|
+
|
124
|
+
template <typename T>
|
125
|
+
inline T MsanUninitialized(T t) {
|
126
|
+
#if RTC_HAS_MSAN
|
127
|
+
// TODO(bugs.webrtc.org/8762): Switch to std::is_trivially_copyable when it
|
128
|
+
// becomes available in downstream projects.
|
129
|
+
static_assert(sanitizer_impl::IsTriviallyCopyable<T>(), "");
|
130
|
+
#endif
|
131
|
+
rtc_MsanMarkUninitialized(&t, sizeof(T), 1);
|
132
|
+
return t;
|
133
|
+
}
|
134
|
+
|
135
|
+
template <typename T>
|
136
|
+
inline void MsanCheckInitialized(const T& mem) {
|
137
|
+
rtc_MsanCheckInitialized(mem.data(), sizeof(mem.data()[0]), mem.size());
|
138
|
+
}
|
139
|
+
|
140
|
+
} // namespace rtc
|
141
|
+
|
142
|
+
#endif // __cplusplus
|
143
|
+
|
144
|
+
#endif // RTC_BASE_SANITIZER_H_
|
@@ -0,0 +1,31 @@
|
|
1
|
+
/*
|
2
|
+
* Copyright (c) 2018 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 RTC_BASE_SYSTEM_INLINE_H_
|
12
|
+
#define RTC_BASE_SYSTEM_INLINE_H_
|
13
|
+
|
14
|
+
#if defined(_MSC_VER)
|
15
|
+
|
16
|
+
#define RTC_FORCE_INLINE __forceinline
|
17
|
+
#define RTC_NO_INLINE __declspec(noinline)
|
18
|
+
|
19
|
+
#elif defined(__GNUC__)
|
20
|
+
|
21
|
+
#define RTC_FORCE_INLINE __attribute__((__always_inline__))
|
22
|
+
#define RTC_NO_INLINE __attribute__((__noinline__))
|
23
|
+
|
24
|
+
#else
|
25
|
+
|
26
|
+
#define RTC_FORCE_INLINE
|
27
|
+
#define RTC_NO_INLINE
|
28
|
+
|
29
|
+
#endif
|
30
|
+
|
31
|
+
#endif // RTC_BASE_SYSTEM_INLINE_H_
|
@@ -0,0 +1,43 @@
|
|
1
|
+
/*
|
2
|
+
* Copyright (c) 2018 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 RTC_BASE_SYSTEM_RTC_EXPORT_H_
|
12
|
+
#define RTC_BASE_SYSTEM_RTC_EXPORT_H_
|
13
|
+
|
14
|
+
// RTC_EXPORT is used to mark symbols as exported or imported when WebRTC is
|
15
|
+
// built or used as a shared library.
|
16
|
+
// When WebRTC is built as a static library the RTC_EXPORT macro expands to
|
17
|
+
// nothing.
|
18
|
+
|
19
|
+
#ifdef WEBRTC_ENABLE_SYMBOL_EXPORT
|
20
|
+
|
21
|
+
#ifdef WEBRTC_WIN
|
22
|
+
|
23
|
+
#ifdef WEBRTC_LIBRARY_IMPL
|
24
|
+
#define RTC_EXPORT __declspec(dllexport)
|
25
|
+
#else
|
26
|
+
#define RTC_EXPORT __declspec(dllimport)
|
27
|
+
#endif
|
28
|
+
|
29
|
+
#else // WEBRTC_WIN
|
30
|
+
|
31
|
+
#if __has_attribute(visibility) && defined(WEBRTC_LIBRARY_IMPL)
|
32
|
+
#define RTC_EXPORT __attribute__((visibility("default")))
|
33
|
+
#endif
|
34
|
+
|
35
|
+
#endif // WEBRTC_WIN
|
36
|
+
|
37
|
+
#endif // WEBRTC_ENABLE_SYMBOL_EXPORT
|
38
|
+
|
39
|
+
#ifndef RTC_EXPORT
|
40
|
+
#define RTC_EXPORT
|
41
|
+
#endif
|
42
|
+
|
43
|
+
#endif // RTC_BASE_SYSTEM_RTC_EXPORT_H_
|
@@ -0,0 +1,140 @@
|
|
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 RTC_BASE_TYPE_TRAITS_H_
|
12
|
+
#define RTC_BASE_TYPE_TRAITS_H_
|
13
|
+
|
14
|
+
#include <cstddef>
|
15
|
+
#include <type_traits>
|
16
|
+
|
17
|
+
namespace rtc {
|
18
|
+
|
19
|
+
// Determines if the given class has zero-argument .data() and .size() methods
|
20
|
+
// whose return values are convertible to T* and size_t, respectively.
|
21
|
+
template <typename DS, typename T>
|
22
|
+
class HasDataAndSize {
|
23
|
+
private:
|
24
|
+
template <
|
25
|
+
typename C,
|
26
|
+
typename std::enable_if<
|
27
|
+
std::is_convertible<decltype(std::declval<C>().data()), T*>::value &&
|
28
|
+
std::is_convertible<decltype(std::declval<C>().size()),
|
29
|
+
std::size_t>::value>::type* = nullptr>
|
30
|
+
static int Test(int);
|
31
|
+
|
32
|
+
template <typename>
|
33
|
+
static char Test(...);
|
34
|
+
|
35
|
+
public:
|
36
|
+
static constexpr bool value = std::is_same<decltype(Test<DS>(0)), int>::value;
|
37
|
+
};
|
38
|
+
|
39
|
+
namespace test_has_data_and_size {
|
40
|
+
|
41
|
+
template <typename DR, typename SR>
|
42
|
+
struct Test1 {
|
43
|
+
DR data();
|
44
|
+
SR size();
|
45
|
+
};
|
46
|
+
static_assert(HasDataAndSize<Test1<int*, int>, int>::value, "");
|
47
|
+
static_assert(HasDataAndSize<Test1<int*, int>, const int>::value, "");
|
48
|
+
static_assert(HasDataAndSize<Test1<const int*, int>, const int>::value, "");
|
49
|
+
static_assert(!HasDataAndSize<Test1<const int*, int>, int>::value,
|
50
|
+
"implicit cast of const int* to int*");
|
51
|
+
static_assert(!HasDataAndSize<Test1<char*, size_t>, int>::value,
|
52
|
+
"implicit cast of char* to int*");
|
53
|
+
|
54
|
+
struct Test2 {
|
55
|
+
int* data;
|
56
|
+
size_t size;
|
57
|
+
};
|
58
|
+
static_assert(!HasDataAndSize<Test2, int>::value,
|
59
|
+
".data and .size aren't functions");
|
60
|
+
|
61
|
+
struct Test3 {
|
62
|
+
int* data();
|
63
|
+
};
|
64
|
+
static_assert(!HasDataAndSize<Test3, int>::value, ".size() is missing");
|
65
|
+
|
66
|
+
class Test4 {
|
67
|
+
int* data();
|
68
|
+
size_t size();
|
69
|
+
};
|
70
|
+
static_assert(!HasDataAndSize<Test4, int>::value,
|
71
|
+
".data() and .size() are private");
|
72
|
+
|
73
|
+
} // namespace test_has_data_and_size
|
74
|
+
|
75
|
+
namespace type_traits_impl {
|
76
|
+
|
77
|
+
// Determines if the given type is an enum that converts implicitly to
|
78
|
+
// an integral type.
|
79
|
+
template <typename T>
|
80
|
+
struct IsIntEnum {
|
81
|
+
private:
|
82
|
+
// This overload is used if the type is an enum, and unary plus
|
83
|
+
// compiles and turns it into an integral type.
|
84
|
+
template <typename X,
|
85
|
+
typename std::enable_if<
|
86
|
+
std::is_enum<X>::value &&
|
87
|
+
std::is_integral<decltype(+std::declval<X>())>::value>::type* =
|
88
|
+
nullptr>
|
89
|
+
static int Test(int);
|
90
|
+
|
91
|
+
// Otherwise, this overload is used.
|
92
|
+
template <typename>
|
93
|
+
static char Test(...);
|
94
|
+
|
95
|
+
public:
|
96
|
+
static constexpr bool value =
|
97
|
+
std::is_same<decltype(Test<typename std::remove_reference<T>::type>(0)),
|
98
|
+
int>::value;
|
99
|
+
};
|
100
|
+
|
101
|
+
} // namespace type_traits_impl
|
102
|
+
|
103
|
+
// Determines if the given type is integral, or an enum that
|
104
|
+
// converts implicitly to an integral type.
|
105
|
+
template <typename T>
|
106
|
+
struct IsIntlike {
|
107
|
+
private:
|
108
|
+
using X = typename std::remove_reference<T>::type;
|
109
|
+
|
110
|
+
public:
|
111
|
+
static constexpr bool value =
|
112
|
+
std::is_integral<X>::value || type_traits_impl::IsIntEnum<X>::value;
|
113
|
+
};
|
114
|
+
|
115
|
+
namespace test_enum_intlike {
|
116
|
+
|
117
|
+
enum E1 { e1 };
|
118
|
+
enum { e2 };
|
119
|
+
enum class E3 { e3 };
|
120
|
+
struct S {};
|
121
|
+
|
122
|
+
static_assert(type_traits_impl::IsIntEnum<E1>::value, "");
|
123
|
+
static_assert(type_traits_impl::IsIntEnum<decltype(e2)>::value, "");
|
124
|
+
static_assert(!type_traits_impl::IsIntEnum<E3>::value, "");
|
125
|
+
static_assert(!type_traits_impl::IsIntEnum<int>::value, "");
|
126
|
+
static_assert(!type_traits_impl::IsIntEnum<float>::value, "");
|
127
|
+
static_assert(!type_traits_impl::IsIntEnum<S>::value, "");
|
128
|
+
|
129
|
+
static_assert(IsIntlike<E1>::value, "");
|
130
|
+
static_assert(IsIntlike<decltype(e2)>::value, "");
|
131
|
+
static_assert(!IsIntlike<E3>::value, "");
|
132
|
+
static_assert(IsIntlike<int>::value, "");
|
133
|
+
static_assert(!IsIntlike<float>::value, "");
|
134
|
+
static_assert(!IsIntlike<S>::value, "");
|
135
|
+
|
136
|
+
} // namespace test_enum_intlike
|
137
|
+
|
138
|
+
} // namespace rtc
|
139
|
+
|
140
|
+
#endif // RTC_BASE_TYPE_TRAITS_H_
|