Fri, 16 Jan 2015 18:13:44 +0100
Integrate suggestion from review to improve consistency with existing code.
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/. */
6 #include "mozilla/MathAlgorithms.h"
8 using mozilla::CeilingLog2;
9 using mozilla::FloorLog2;
10 using mozilla::RoundUpPow2;
12 static void
13 TestCeiling()
14 {
15 for (uint32_t i = 0; i <= 1; i++)
16 MOZ_RELEASE_ASSERT(CeilingLog2(i) == 0);
18 for (uint32_t i = 2; i <= 2; i++)
19 MOZ_RELEASE_ASSERT(CeilingLog2(i) == 1);
21 for (uint32_t i = 3; i <= 4; i++)
22 MOZ_RELEASE_ASSERT(CeilingLog2(i) == 2);
24 for (uint32_t i = 5; i <= 8; i++)
25 MOZ_RELEASE_ASSERT(CeilingLog2(i) == 3);
27 for (uint32_t i = 9; i <= 16; i++)
28 MOZ_RELEASE_ASSERT(CeilingLog2(i) == 4);
29 }
31 static void
32 TestFloor()
33 {
34 for (uint32_t i = 0; i <= 1; i++)
35 MOZ_RELEASE_ASSERT(FloorLog2(i) == 0);
37 for (uint32_t i = 2; i <= 3; i++)
38 MOZ_RELEASE_ASSERT(FloorLog2(i) == 1);
40 for (uint32_t i = 4; i <= 7; i++)
41 MOZ_RELEASE_ASSERT(FloorLog2(i) == 2);
43 for (uint32_t i = 8; i <= 15; i++)
44 MOZ_RELEASE_ASSERT(FloorLog2(i) == 3);
46 for (uint32_t i = 16; i <= 31; i++)
47 MOZ_RELEASE_ASSERT(FloorLog2(i) == 4);
48 }
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);
64 MOZ_RELEASE_ASSERT(RoundUpPow2(15) == 16);
65 MOZ_RELEASE_ASSERT(RoundUpPow2(16) == 16);
66 MOZ_RELEASE_ASSERT(RoundUpPow2(17) == 32);
68 MOZ_RELEASE_ASSERT(RoundUpPow2(31) == 32);
69 MOZ_RELEASE_ASSERT(RoundUpPow2(32) == 32);
70 MOZ_RELEASE_ASSERT(RoundUpPow2(33) == 64);
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 }
78 int main()
79 {
80 TestCeiling();
81 TestFloor();
83 TestRoundUpPow2();
84 return 0;
85 }