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