|
1 /* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ |
|
2 /* This Source Code Form is subject to the terms of the Mozilla Public |
|
3 * License, v. 2.0. If a copy of the MPL was not distributed with this file, |
|
4 * You can obtain one at http://mozilla.org/MPL/2.0/. */ |
|
5 |
|
6 #include "mozilla/MathAlgorithms.h" |
|
7 |
|
8 using mozilla::CeilingLog2; |
|
9 using mozilla::FloorLog2; |
|
10 using mozilla::RoundUpPow2; |
|
11 |
|
12 static void |
|
13 TestCeiling() |
|
14 { |
|
15 for (uint32_t i = 0; i <= 1; i++) |
|
16 MOZ_RELEASE_ASSERT(CeilingLog2(i) == 0); |
|
17 |
|
18 for (uint32_t i = 2; i <= 2; i++) |
|
19 MOZ_RELEASE_ASSERT(CeilingLog2(i) == 1); |
|
20 |
|
21 for (uint32_t i = 3; i <= 4; i++) |
|
22 MOZ_RELEASE_ASSERT(CeilingLog2(i) == 2); |
|
23 |
|
24 for (uint32_t i = 5; i <= 8; i++) |
|
25 MOZ_RELEASE_ASSERT(CeilingLog2(i) == 3); |
|
26 |
|
27 for (uint32_t i = 9; i <= 16; i++) |
|
28 MOZ_RELEASE_ASSERT(CeilingLog2(i) == 4); |
|
29 } |
|
30 |
|
31 static void |
|
32 TestFloor() |
|
33 { |
|
34 for (uint32_t i = 0; i <= 1; i++) |
|
35 MOZ_RELEASE_ASSERT(FloorLog2(i) == 0); |
|
36 |
|
37 for (uint32_t i = 2; i <= 3; i++) |
|
38 MOZ_RELEASE_ASSERT(FloorLog2(i) == 1); |
|
39 |
|
40 for (uint32_t i = 4; i <= 7; i++) |
|
41 MOZ_RELEASE_ASSERT(FloorLog2(i) == 2); |
|
42 |
|
43 for (uint32_t i = 8; i <= 15; i++) |
|
44 MOZ_RELEASE_ASSERT(FloorLog2(i) == 3); |
|
45 |
|
46 for (uint32_t i = 16; i <= 31; i++) |
|
47 MOZ_RELEASE_ASSERT(FloorLog2(i) == 4); |
|
48 } |
|
49 |
|
50 static void |
|
51 TestRoundUpPow2() |
|
52 { |
|
53 MOZ_RELEASE_ASSERT(RoundUpPow2(0) == 1); |
|
54 MOZ_RELEASE_ASSERT(RoundUpPow2(1) == 1); |
|
55 MOZ_RELEASE_ASSERT(RoundUpPow2(2) == 2); |
|
56 MOZ_RELEASE_ASSERT(RoundUpPow2(3) == 4); |
|
57 MOZ_RELEASE_ASSERT(RoundUpPow2(4) == 4); |
|
58 MOZ_RELEASE_ASSERT(RoundUpPow2(5) == 8); |
|
59 MOZ_RELEASE_ASSERT(RoundUpPow2(6) == 8); |
|
60 MOZ_RELEASE_ASSERT(RoundUpPow2(7) == 8); |
|
61 MOZ_RELEASE_ASSERT(RoundUpPow2(8) == 8); |
|
62 MOZ_RELEASE_ASSERT(RoundUpPow2(9) == 16); |
|
63 |
|
64 MOZ_RELEASE_ASSERT(RoundUpPow2(15) == 16); |
|
65 MOZ_RELEASE_ASSERT(RoundUpPow2(16) == 16); |
|
66 MOZ_RELEASE_ASSERT(RoundUpPow2(17) == 32); |
|
67 |
|
68 MOZ_RELEASE_ASSERT(RoundUpPow2(31) == 32); |
|
69 MOZ_RELEASE_ASSERT(RoundUpPow2(32) == 32); |
|
70 MOZ_RELEASE_ASSERT(RoundUpPow2(33) == 64); |
|
71 |
|
72 size_t MaxPow2 = size_t(1) << (sizeof(size_t) * CHAR_BIT - 1); |
|
73 MOZ_RELEASE_ASSERT(RoundUpPow2(MaxPow2 - 1) == MaxPow2); |
|
74 MOZ_RELEASE_ASSERT(RoundUpPow2(MaxPow2) == MaxPow2); |
|
75 // not valid to round up when past the max power of two |
|
76 } |
|
77 |
|
78 int main() |
|
79 { |
|
80 TestCeiling(); |
|
81 TestFloor(); |
|
82 |
|
83 TestRoundUpPow2(); |
|
84 return 0; |
|
85 } |