blob: c52b3f93dca4a2dfa0e4100c3e6fa448cc9b9abd [file] [log] [blame]
kwiberg7885d3f2017-04-25 12:35:07 -07001/*
2 * Copyright 2017 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
Jonas Olssona4d87372019-07-05 19:08:33 +020011#include "rtc_base/numerics/safe_minmax.h"
12
kwiberg7885d3f2017-04-25 12:35:07 -070013#include <algorithm>
14#include <limits>
15
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020016#include "test/gtest.h"
kwiberg7885d3f2017-04-25 12:35:07 -070017
18namespace rtc {
19
20namespace {
21
kwiberg07038562017-06-12 11:40:47 -070022// Functions that check that SafeMin(), SafeMax(), and SafeClamp() return the
23// specified type. The functions that end in "R" use an explicitly given return
24// type.
kwiberg7885d3f2017-04-25 12:35:07 -070025
26template <typename T1, typename T2, typename Tmin, typename Tmax>
27constexpr bool TypeCheckMinMax() {
28 return std::is_same<decltype(SafeMin(std::declval<T1>(), std::declval<T2>())),
29 Tmin>::value &&
30 std::is_same<decltype(SafeMax(std::declval<T1>(), std::declval<T2>())),
31 Tmax>::value;
32}
33
34template <typename T1, typename T2, typename R>
35constexpr bool TypeCheckMinR() {
36 return std::is_same<
37 decltype(SafeMin<R>(std::declval<T1>(), std::declval<T2>())), R>::value;
38}
39
40template <typename T1, typename T2, typename R>
41constexpr bool TypeCheckMaxR() {
42 return std::is_same<
43 decltype(SafeMax<R>(std::declval<T1>(), std::declval<T2>())), R>::value;
44}
45
kwiberg07038562017-06-12 11:40:47 -070046template <typename T, typename L, typename H, typename R>
47constexpr bool TypeCheckClamp() {
48 return std::is_same<decltype(SafeClamp(std::declval<T>(), std::declval<L>(),
49 std::declval<H>())),
50 R>::value;
51}
52
53template <typename T, typename L, typename H, typename R>
54constexpr bool TypeCheckClampR() {
55 return std::is_same<decltype(SafeClamp<R>(std::declval<T>(),
56 std::declval<L>(),
57 std::declval<H>())),
58 R>::value;
59}
60
kwiberg7885d3f2017-04-25 12:35:07 -070061// clang-format off
62
63// SafeMin/SafeMax: Check that all combinations of signed/unsigned 8/64 bits
64// give the correct default result type.
65static_assert(TypeCheckMinMax< int8_t, int8_t, int8_t, int8_t>(), "");
66static_assert(TypeCheckMinMax< int8_t, uint8_t, int8_t, uint8_t>(), "");
67static_assert(TypeCheckMinMax< int8_t, int64_t, int64_t, int64_t>(), "");
68static_assert(TypeCheckMinMax< int8_t, uint64_t, int8_t, uint64_t>(), "");
69static_assert(TypeCheckMinMax< uint8_t, int8_t, int8_t, uint8_t>(), "");
70static_assert(TypeCheckMinMax< uint8_t, uint8_t, uint8_t, uint8_t>(), "");
71static_assert(TypeCheckMinMax< uint8_t, int64_t, int64_t, int64_t>(), "");
72static_assert(TypeCheckMinMax< uint8_t, uint64_t, uint8_t, uint64_t>(), "");
73static_assert(TypeCheckMinMax< int64_t, int8_t, int64_t, int64_t>(), "");
74static_assert(TypeCheckMinMax< int64_t, uint8_t, int64_t, int64_t>(), "");
75static_assert(TypeCheckMinMax< int64_t, int64_t, int64_t, int64_t>(), "");
76static_assert(TypeCheckMinMax< int64_t, uint64_t, int64_t, uint64_t>(), "");
77static_assert(TypeCheckMinMax<uint64_t, int8_t, int8_t, uint64_t>(), "");
78static_assert(TypeCheckMinMax<uint64_t, uint8_t, uint8_t, uint64_t>(), "");
79static_assert(TypeCheckMinMax<uint64_t, int64_t, int64_t, uint64_t>(), "");
80static_assert(TypeCheckMinMax<uint64_t, uint64_t, uint64_t, uint64_t>(), "");
81
kwiberg07038562017-06-12 11:40:47 -070082// SafeClamp: Check that all combinations of signed/unsigned 8/64 bits give the
83// correct result type.
84static_assert(TypeCheckClamp< int8_t, int8_t, int8_t, int8_t>(), "");
85static_assert(TypeCheckClamp< int8_t, int8_t, uint8_t, int8_t>(), "");
86static_assert(TypeCheckClamp< int8_t, int8_t, int64_t, int8_t>(), "");
87static_assert(TypeCheckClamp< int8_t, int8_t, uint64_t, int8_t>(), "");
88static_assert(TypeCheckClamp< int8_t, uint8_t, int8_t, int8_t>(), "");
89static_assert(TypeCheckClamp< int8_t, uint8_t, uint8_t, uint8_t>(), "");
90static_assert(TypeCheckClamp< int8_t, uint8_t, int64_t, int16_t>(), "");
91static_assert(TypeCheckClamp< int8_t, uint8_t, uint64_t, int16_t>(), "");
92static_assert(TypeCheckClamp< int8_t, int64_t, int8_t, int8_t>(), "");
93static_assert(TypeCheckClamp< int8_t, int64_t, uint8_t, int16_t>(), "");
94static_assert(TypeCheckClamp< int8_t, int64_t, int64_t, int64_t>(), "");
95static_assert(TypeCheckClamp< int8_t, int64_t, uint64_t, int64_t>(), "");
96static_assert(TypeCheckClamp< int8_t, uint64_t, int8_t, int8_t>(), "");
97static_assert(TypeCheckClamp< int8_t, uint64_t, uint8_t, int16_t>(), "");
98static_assert(TypeCheckClamp< int8_t, uint64_t, int64_t, int64_t>(), "");
99static_assert(TypeCheckClamp< int8_t, uint64_t, uint64_t, uint64_t>(), "");
100static_assert(TypeCheckClamp< uint8_t, int8_t, int8_t, int8_t>(), "");
101static_assert(TypeCheckClamp< uint8_t, int8_t, uint8_t, uint8_t>(), "");
102static_assert(TypeCheckClamp< uint8_t, int8_t, int64_t, int16_t>(), "");
103static_assert(TypeCheckClamp< uint8_t, int8_t, uint64_t, uint8_t>(), "");
104static_assert(TypeCheckClamp< uint8_t, uint8_t, int8_t, uint8_t>(), "");
105static_assert(TypeCheckClamp< uint8_t, uint8_t, uint8_t, uint8_t>(), "");
106static_assert(TypeCheckClamp< uint8_t, uint8_t, int64_t, uint8_t>(), "");
107static_assert(TypeCheckClamp< uint8_t, uint8_t, uint64_t, uint8_t>(), "");
108static_assert(TypeCheckClamp< uint8_t, int64_t, int8_t, int8_t>(), "");
109static_assert(TypeCheckClamp< uint8_t, int64_t, uint8_t, uint8_t>(), "");
110static_assert(TypeCheckClamp< uint8_t, int64_t, int64_t, int64_t>(), "");
111static_assert(TypeCheckClamp< uint8_t, int64_t, uint64_t, uint64_t>(), "");
112static_assert(TypeCheckClamp< uint8_t, uint64_t, int8_t, uint8_t>(), "");
113static_assert(TypeCheckClamp< uint8_t, uint64_t, uint8_t, uint8_t>(), "");
114static_assert(TypeCheckClamp< uint8_t, uint64_t, int64_t, uint64_t>(), "");
115static_assert(TypeCheckClamp< uint8_t, uint64_t, uint64_t, uint64_t>(), "");
116static_assert(TypeCheckClamp< int64_t, int8_t, int8_t, int8_t>(), "");
117static_assert(TypeCheckClamp< int64_t, int8_t, uint8_t, int16_t>(), "");
118static_assert(TypeCheckClamp< int64_t, int8_t, int64_t, int64_t>(), "");
119static_assert(TypeCheckClamp< int64_t, int8_t, uint64_t, int64_t>(), "");
120static_assert(TypeCheckClamp< int64_t, uint8_t, int8_t, int8_t>(), "");
121static_assert(TypeCheckClamp< int64_t, uint8_t, uint8_t, int16_t>(), "");
122static_assert(TypeCheckClamp< int64_t, uint8_t, int64_t, int64_t>(), "");
123static_assert(TypeCheckClamp< int64_t, uint8_t, uint64_t, int64_t>(), "");
124static_assert(TypeCheckClamp< int64_t, int64_t, int8_t, int64_t>(), "");
125static_assert(TypeCheckClamp< int64_t, int64_t, uint8_t, int64_t>(), "");
126static_assert(TypeCheckClamp< int64_t, int64_t, int64_t, int64_t>(), "");
127static_assert(TypeCheckClamp< int64_t, int64_t, uint64_t, int64_t>(), "");
128static_assert(TypeCheckClamp< int64_t, uint64_t, int8_t, int8_t>(), "");
129static_assert(TypeCheckClamp< int64_t, uint64_t, uint8_t, int16_t>(), "");
130static_assert(TypeCheckClamp< int64_t, uint64_t, int64_t, int64_t>(), "");
131static_assert(TypeCheckClamp< int64_t, uint64_t, uint64_t, uint64_t>(), "");
132static_assert(TypeCheckClamp<uint64_t, int8_t, int8_t, int8_t>(), "");
133static_assert(TypeCheckClamp<uint64_t, int8_t, uint8_t, uint8_t>(), "");
134static_assert(TypeCheckClamp<uint64_t, int8_t, int64_t, int64_t>(), "");
135static_assert(TypeCheckClamp<uint64_t, int8_t, uint64_t, uint64_t>(), "");
136static_assert(TypeCheckClamp<uint64_t, uint8_t, int8_t, uint8_t>(), "");
137static_assert(TypeCheckClamp<uint64_t, uint8_t, uint8_t, uint8_t>(), "");
138static_assert(TypeCheckClamp<uint64_t, uint8_t, int64_t, uint64_t>(), "");
139static_assert(TypeCheckClamp<uint64_t, uint8_t, uint64_t, uint64_t>(), "");
140static_assert(TypeCheckClamp<uint64_t, int64_t, int8_t, int8_t>(), "");
141static_assert(TypeCheckClamp<uint64_t, int64_t, uint8_t, uint8_t>(), "");
142static_assert(TypeCheckClamp<uint64_t, int64_t, int64_t, int64_t>(), "");
143static_assert(TypeCheckClamp<uint64_t, int64_t, uint64_t, uint64_t>(), "");
144static_assert(TypeCheckClamp<uint64_t, uint64_t, int8_t, uint8_t>(), "");
145static_assert(TypeCheckClamp<uint64_t, uint64_t, uint8_t, uint8_t>(), "");
146static_assert(TypeCheckClamp<uint64_t, uint64_t, int64_t, uint64_t>(), "");
147static_assert(TypeCheckClamp<uint64_t, uint64_t, uint64_t, uint64_t>(), "");
148
kwiberg7885d3f2017-04-25 12:35:07 -0700149enum DefaultE { kFoo = -17 };
150enum UInt8E : uint8_t { kBar = 17 };
kwibergdbb497a2017-06-02 04:24:11 -0700151
152// SafeMin/SafeMax: Check that we can use enum types.
153static_assert(TypeCheckMinMax<unsigned, unsigned, unsigned, unsigned>(), "");
154static_assert(TypeCheckMinMax<unsigned, DefaultE, int, unsigned>(), "");
155static_assert(TypeCheckMinMax<unsigned, UInt8E, uint8_t, unsigned>(), "");
156static_assert(TypeCheckMinMax<DefaultE, unsigned, int, unsigned>(), "");
157static_assert(TypeCheckMinMax<DefaultE, DefaultE, int, int>(), "");
158static_assert(TypeCheckMinMax<DefaultE, UInt8E, int, int>(), "");
159static_assert(TypeCheckMinMax< UInt8E, unsigned, uint8_t, unsigned>(), "");
160static_assert(TypeCheckMinMax< UInt8E, DefaultE, int, int>(), "");
161static_assert(TypeCheckMinMax< UInt8E, UInt8E, uint8_t, uint8_t>(), "");
kwiberg7885d3f2017-04-25 12:35:07 -0700162
kwiberg07038562017-06-12 11:40:47 -0700163// SafeClamp: Check that we can use enum types.
164static_assert(TypeCheckClamp<unsigned, unsigned, unsigned, unsigned>(), "");
165static_assert(TypeCheckClamp<unsigned, unsigned, DefaultE, unsigned>(), "");
166static_assert(TypeCheckClamp<unsigned, unsigned, UInt8E, uint8_t>(), "");
167static_assert(TypeCheckClamp<unsigned, DefaultE, unsigned, unsigned>(), "");
168static_assert(TypeCheckClamp<unsigned, DefaultE, DefaultE, int>(), "");
169static_assert(TypeCheckClamp<unsigned, DefaultE, UInt8E, uint8_t>(), "");
170static_assert(TypeCheckClamp<unsigned, UInt8E, unsigned, unsigned>(), "");
171static_assert(TypeCheckClamp<unsigned, UInt8E, DefaultE, unsigned>(), "");
172static_assert(TypeCheckClamp<unsigned, UInt8E, UInt8E, uint8_t>(), "");
173static_assert(TypeCheckClamp<DefaultE, unsigned, unsigned, unsigned>(), "");
174static_assert(TypeCheckClamp<DefaultE, unsigned, DefaultE, int>(), "");
175static_assert(TypeCheckClamp<DefaultE, unsigned, UInt8E, int16_t>(), "");
176static_assert(TypeCheckClamp<DefaultE, DefaultE, unsigned, int>(), "");
177static_assert(TypeCheckClamp<DefaultE, DefaultE, DefaultE, int>(), "");
178static_assert(TypeCheckClamp<DefaultE, DefaultE, UInt8E, int>(), "");
179static_assert(TypeCheckClamp<DefaultE, UInt8E, unsigned, int>(), "");
180static_assert(TypeCheckClamp<DefaultE, UInt8E, DefaultE, int>(), "");
181static_assert(TypeCheckClamp<DefaultE, UInt8E, UInt8E, int16_t>(), "");
182static_assert(TypeCheckClamp< UInt8E, unsigned, unsigned, unsigned>(), "");
183static_assert(TypeCheckClamp< UInt8E, unsigned, DefaultE, unsigned>(), "");
184static_assert(TypeCheckClamp< UInt8E, unsigned, UInt8E, uint8_t>(), "");
185static_assert(TypeCheckClamp< UInt8E, DefaultE, unsigned, unsigned>(), "");
186static_assert(TypeCheckClamp< UInt8E, DefaultE, DefaultE, int>(), "");
187static_assert(TypeCheckClamp< UInt8E, DefaultE, UInt8E, uint8_t>(), "");
188static_assert(TypeCheckClamp< UInt8E, UInt8E, unsigned, uint8_t>(), "");
189static_assert(TypeCheckClamp< UInt8E, UInt8E, DefaultE, uint8_t>(), "");
190static_assert(TypeCheckClamp< UInt8E, UInt8E, UInt8E, uint8_t>(), "");
191
kwiberg7885d3f2017-04-25 12:35:07 -0700192using ld = long double;
193
194// SafeMin/SafeMax: Check that all floating-point combinations give the
195// correct result type.
196static_assert(TypeCheckMinMax< float, float, float, float>(), "");
197static_assert(TypeCheckMinMax< float, double, double, double>(), "");
198static_assert(TypeCheckMinMax< float, ld, ld, ld>(), "");
199static_assert(TypeCheckMinMax<double, float, double, double>(), "");
200static_assert(TypeCheckMinMax<double, double, double, double>(), "");
201static_assert(TypeCheckMinMax<double, ld, ld, ld>(), "");
202static_assert(TypeCheckMinMax< ld, float, ld, ld>(), "");
203static_assert(TypeCheckMinMax< ld, double, ld, ld>(), "");
204static_assert(TypeCheckMinMax< ld, ld, ld, ld>(), "");
205
kwiberg07038562017-06-12 11:40:47 -0700206// SafeClamp: Check that all floating-point combinations give the correct
207// result type.
208static_assert(TypeCheckClamp< float, float, float, float>(), "");
209static_assert(TypeCheckClamp< float, float, double, double>(), "");
210static_assert(TypeCheckClamp< float, float, ld, ld>(), "");
211static_assert(TypeCheckClamp< float, double, float, double>(), "");
212static_assert(TypeCheckClamp< float, double, double, double>(), "");
213static_assert(TypeCheckClamp< float, double, ld, ld>(), "");
214static_assert(TypeCheckClamp< float, ld, float, ld>(), "");
215static_assert(TypeCheckClamp< float, ld, double, ld>(), "");
216static_assert(TypeCheckClamp< float, ld, ld, ld>(), "");
217static_assert(TypeCheckClamp<double, float, float, double>(), "");
218static_assert(TypeCheckClamp<double, float, double, double>(), "");
219static_assert(TypeCheckClamp<double, float, ld, ld>(), "");
220static_assert(TypeCheckClamp<double, double, float, double>(), "");
221static_assert(TypeCheckClamp<double, double, double, double>(), "");
222static_assert(TypeCheckClamp<double, double, ld, ld>(), "");
223static_assert(TypeCheckClamp<double, ld, float, ld>(), "");
224static_assert(TypeCheckClamp<double, ld, double, ld>(), "");
225static_assert(TypeCheckClamp<double, ld, ld, ld>(), "");
226static_assert(TypeCheckClamp< ld, float, float, ld>(), "");
227static_assert(TypeCheckClamp< ld, float, double, ld>(), "");
228static_assert(TypeCheckClamp< ld, float, ld, ld>(), "");
229static_assert(TypeCheckClamp< ld, double, float, ld>(), "");
230static_assert(TypeCheckClamp< ld, double, double, ld>(), "");
231static_assert(TypeCheckClamp< ld, double, ld, ld>(), "");
232static_assert(TypeCheckClamp< ld, ld, float, ld>(), "");
233static_assert(TypeCheckClamp< ld, ld, double, ld>(), "");
234static_assert(TypeCheckClamp< ld, ld, ld, ld>(), "");
235
kwiberg7885d3f2017-04-25 12:35:07 -0700236// clang-format on
237
238// SafeMin/SafeMax: Check some cases of explicitly specified return type. The
239// commented-out lines give compilation errors due to the requested return type
240// being too small or requiring an int<->float conversion.
241static_assert(TypeCheckMinR<int8_t, int8_t, int16_t>(), "");
242// static_assert(TypeCheckMinR<int8_t, int8_t, float>(), "");
243static_assert(TypeCheckMinR<uint32_t, uint64_t, uint32_t>(), "");
244// static_assert(TypeCheckMaxR<uint64_t, float, float>(), "");
245// static_assert(TypeCheckMaxR<uint64_t, double, float>(), "");
246static_assert(TypeCheckMaxR<uint32_t, int32_t, uint32_t>(), "");
247// static_assert(TypeCheckMaxR<uint32_t, int32_t, int32_t>(), "");
248
kwiberg07038562017-06-12 11:40:47 -0700249// SafeClamp: Check some cases of explicitly specified return type. The
250// commented-out lines give compilation errors due to the requested return type
251// being too small.
252static_assert(TypeCheckClampR<int16_t, int8_t, uint8_t, int16_t>(), "");
253static_assert(TypeCheckClampR<int16_t, int8_t, uint8_t, int32_t>(), "");
254// static_assert(TypeCheckClampR<int16_t, int8_t, uint8_t, uint32_t>(), "");
255
kwiberg7885d3f2017-04-25 12:35:07 -0700256template <typename T1, typename T2, typename Tmin, typename Tmax>
257constexpr bool CheckMinMax(T1 a, T2 b, Tmin min, Tmax max) {
258 return TypeCheckMinMax<T1, T2, Tmin, Tmax>() && SafeMin(a, b) == min &&
259 SafeMax(a, b) == max;
260}
261
kwiberg07038562017-06-12 11:40:47 -0700262template <typename T, typename L, typename H, typename R>
263bool CheckClamp(T x, L min, H max, R clamped) {
264 return TypeCheckClamp<T, L, H, R>() && SafeClamp(x, min, max) == clamped;
265}
266
kwiberg7885d3f2017-04-25 12:35:07 -0700267// SafeMin/SafeMax: Check a few values.
268static_assert(CheckMinMax(int8_t{1}, int8_t{-1}, int8_t{-1}, int8_t{1}), "");
269static_assert(CheckMinMax(uint8_t{1}, int8_t{-1}, int8_t{-1}, uint8_t{1}), "");
270static_assert(CheckMinMax(uint8_t{5}, uint64_t{2}, uint8_t{2}, uint64_t{5}),
271 "");
272static_assert(CheckMinMax(std::numeric_limits<int32_t>::min(),
273 std::numeric_limits<uint32_t>::max(),
274 std::numeric_limits<int32_t>::min(),
275 std::numeric_limits<uint32_t>::max()),
276 "");
277static_assert(CheckMinMax(std::numeric_limits<int32_t>::min(),
278 std::numeric_limits<uint16_t>::max(),
279 std::numeric_limits<int32_t>::min(),
280 int32_t{std::numeric_limits<uint16_t>::max()}),
281 "");
282// static_assert(CheckMinMax(1.f, 2, 1.f, 2.f), "");
283static_assert(CheckMinMax(1.f, 0.0, 0.0, 1.0), "");
284
kwiberg07038562017-06-12 11:40:47 -0700285// SafeClamp: Check a few values.
286TEST(SafeMinmaxTest, Clamp) {
287 EXPECT_TRUE(CheckClamp(int32_t{-1000000}, std::numeric_limits<int16_t>::min(),
288 std::numeric_limits<int16_t>::max(),
289 std::numeric_limits<int16_t>::min()));
290 EXPECT_TRUE(CheckClamp(uint32_t{1000000}, std::numeric_limits<int16_t>::min(),
291 std::numeric_limits<int16_t>::max(),
292 std::numeric_limits<int16_t>::max()));
293 EXPECT_TRUE(CheckClamp(3.f, -1.0, 1.f, 1.0));
294 EXPECT_TRUE(CheckClamp(3.0, -1.f, 1.f, 1.0));
295}
296
kwiberg7885d3f2017-04-25 12:35:07 -0700297} // namespace
298
kwiberg7885d3f2017-04-25 12:35:07 -0700299// These functions aren't used in the tests, but it's useful to look at the
kwiberg07038562017-06-12 11:40:47 -0700300// compiler output for them, and verify that (1) the same-signedness Test*Safe
301// functions result in exactly the same code as their Test*Ref counterparts,
302// and that (2) the mixed-signedness Test*Safe functions have just a few extra
kwiberg7885d3f2017-04-25 12:35:07 -0700303// arithmetic and logic instructions (but no extra control flow instructions).
kwiberg07038562017-06-12 11:40:47 -0700304
305// clang-format off
kwiberg7885d3f2017-04-25 12:35:07 -0700306int32_t TestMinRef( int32_t a, int32_t b) { return std::min(a, b); }
307uint32_t TestMinRef( uint32_t a, uint32_t b) { return std::min(a, b); }
308int32_t TestMinSafe( int32_t a, int32_t b) { return SafeMin(a, b); }
309int32_t TestMinSafe( int32_t a, uint32_t b) { return SafeMin(a, b); }
310int32_t TestMinSafe(uint32_t a, int32_t b) { return SafeMin(a, b); }
311uint32_t TestMinSafe(uint32_t a, uint32_t b) { return SafeMin(a, b); }
kwiberg7885d3f2017-04-25 12:35:07 -0700312// clang-format on
313
kwiberg07038562017-06-12 11:40:47 -0700314int32_t TestClampRef(int32_t x, int32_t a, int32_t b) {
315 return std::max(a, std::min(x, b));
316}
317uint32_t TestClampRef(uint32_t x, uint32_t a, uint32_t b) {
318 return std::max(a, std::min(x, b));
319}
320int32_t TestClampSafe(int32_t x, int32_t a, int32_t b) {
321 return SafeClamp(x, a, b);
322}
323int32_t TestClampSafe(int32_t x, int32_t a, uint32_t b) {
324 return SafeClamp(x, a, b);
325}
326int32_t TestClampSafe(int32_t x, uint32_t a, int32_t b) {
327 return SafeClamp(x, a, b);
328}
329uint32_t TestClampSafe(int32_t x, uint32_t a, uint32_t b) {
330 return SafeClamp(x, a, b);
331}
332int32_t TestClampSafe(uint32_t x, int32_t a, int32_t b) {
333 return SafeClamp(x, a, b);
334}
335uint32_t TestClampSafe(uint32_t x, int32_t a, uint32_t b) {
336 return SafeClamp(x, a, b);
337}
338int32_t TestClampSafe(uint32_t x, uint32_t a, int32_t b) {
339 return SafeClamp(x, a, b);
340}
341uint32_t TestClampSafe(uint32_t x, uint32_t a, uint32_t b) {
342 return SafeClamp(x, a, b);
343}
344
kwiberg7885d3f2017-04-25 12:35:07 -0700345} // namespace rtc