|
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/Casting.h" |
|
7 |
|
8 #include <stdint.h> |
|
9 |
|
10 using mozilla::BitwiseCast; |
|
11 using mozilla::detail::IsInBounds; |
|
12 |
|
13 template<typename Uint, typename Ulong, bool = (sizeof(Uint) == sizeof(Ulong))> |
|
14 struct UintUlongBitwiseCast; |
|
15 |
|
16 template<typename Uint, typename Ulong> |
|
17 struct UintUlongBitwiseCast<Uint, Ulong, true> |
|
18 { |
|
19 static void test() { |
|
20 MOZ_RELEASE_ASSERT(BitwiseCast<Ulong>(Uint(8675309)) == Ulong(8675309)); |
|
21 } |
|
22 }; |
|
23 |
|
24 template<typename Uint, typename Ulong> |
|
25 struct UintUlongBitwiseCast<Uint, Ulong, false> |
|
26 { |
|
27 static void test() { } |
|
28 }; |
|
29 |
|
30 static void |
|
31 TestBitwiseCast() |
|
32 { |
|
33 MOZ_RELEASE_ASSERT(BitwiseCast<int>(int(8675309)) == int(8675309)); |
|
34 UintUlongBitwiseCast<unsigned int, unsigned long>::test(); |
|
35 } |
|
36 |
|
37 static void |
|
38 TestSameSize() |
|
39 { |
|
40 MOZ_RELEASE_ASSERT((IsInBounds<int16_t, int16_t>(int16_t(0)))); |
|
41 MOZ_RELEASE_ASSERT((IsInBounds<int16_t, int16_t>(int16_t(INT16_MIN)))); |
|
42 MOZ_RELEASE_ASSERT((IsInBounds<int16_t, int16_t>(int16_t(INT16_MAX)))); |
|
43 MOZ_RELEASE_ASSERT((IsInBounds<uint16_t, uint16_t>(uint16_t(UINT16_MAX)))); |
|
44 MOZ_RELEASE_ASSERT((IsInBounds<uint16_t, int16_t>(uint16_t(0)))); |
|
45 MOZ_RELEASE_ASSERT((!IsInBounds<uint16_t, int16_t>(uint16_t(-1)))); |
|
46 MOZ_RELEASE_ASSERT((!IsInBounds<int16_t, uint16_t>(int16_t(-1)))); |
|
47 MOZ_RELEASE_ASSERT((IsInBounds<int16_t, uint16_t>(int16_t(INT16_MAX)))); |
|
48 MOZ_RELEASE_ASSERT((!IsInBounds<int16_t, uint16_t>(int16_t(INT16_MIN)))); |
|
49 MOZ_RELEASE_ASSERT((IsInBounds<int32_t, uint32_t>(int32_t(INT32_MAX)))); |
|
50 MOZ_RELEASE_ASSERT((!IsInBounds<int32_t, uint32_t>(int32_t(INT32_MIN)))); |
|
51 } |
|
52 |
|
53 static void |
|
54 TestToBiggerSize() |
|
55 { |
|
56 MOZ_RELEASE_ASSERT((IsInBounds<int16_t, int32_t>(int16_t(0)))); |
|
57 MOZ_RELEASE_ASSERT((IsInBounds<int16_t, int32_t>(int16_t(INT16_MIN)))); |
|
58 MOZ_RELEASE_ASSERT((IsInBounds<int16_t, int32_t>(int16_t(INT16_MAX)))); |
|
59 MOZ_RELEASE_ASSERT((IsInBounds<uint16_t, uint32_t>(uint16_t(UINT16_MAX)))); |
|
60 MOZ_RELEASE_ASSERT((IsInBounds<uint16_t, int32_t>(uint16_t(0)))); |
|
61 MOZ_RELEASE_ASSERT((IsInBounds<uint16_t, int32_t>(uint16_t(-1)))); |
|
62 MOZ_RELEASE_ASSERT((!IsInBounds<int16_t, uint32_t>(int16_t(-1)))); |
|
63 MOZ_RELEASE_ASSERT((IsInBounds<int16_t, uint32_t>(int16_t(INT16_MAX)))); |
|
64 MOZ_RELEASE_ASSERT((!IsInBounds<int16_t, uint32_t>(int16_t(INT16_MIN)))); |
|
65 MOZ_RELEASE_ASSERT((IsInBounds<int32_t, uint64_t>(int32_t(INT32_MAX)))); |
|
66 MOZ_RELEASE_ASSERT((!IsInBounds<int32_t, uint64_t>(int32_t(INT32_MIN)))); |
|
67 } |
|
68 |
|
69 static void |
|
70 TestToSmallerSize() |
|
71 { |
|
72 MOZ_RELEASE_ASSERT((IsInBounds<int16_t, int8_t>(int16_t(0)))); |
|
73 MOZ_RELEASE_ASSERT((!IsInBounds<int16_t, int8_t>(int16_t(INT16_MIN)))); |
|
74 MOZ_RELEASE_ASSERT((!IsInBounds<int16_t, int8_t>(int16_t(INT16_MAX)))); |
|
75 MOZ_RELEASE_ASSERT((!IsInBounds<uint16_t, uint8_t>(uint16_t(UINT16_MAX)))); |
|
76 MOZ_RELEASE_ASSERT((IsInBounds<uint16_t, int8_t>(uint16_t(0)))); |
|
77 MOZ_RELEASE_ASSERT((!IsInBounds<uint16_t, int8_t>(uint16_t(-1)))); |
|
78 MOZ_RELEASE_ASSERT((!IsInBounds<int16_t, uint8_t>(int16_t(-1)))); |
|
79 MOZ_RELEASE_ASSERT((!IsInBounds<int16_t, uint8_t>(int16_t(INT16_MAX)))); |
|
80 MOZ_RELEASE_ASSERT((!IsInBounds<int16_t, uint8_t>(int16_t(INT16_MIN)))); |
|
81 MOZ_RELEASE_ASSERT((!IsInBounds<int32_t, uint16_t>(int32_t(INT32_MAX)))); |
|
82 MOZ_RELEASE_ASSERT((!IsInBounds<int32_t, uint16_t>(int32_t(INT32_MIN)))); |
|
83 |
|
84 // Boundary cases |
|
85 MOZ_RELEASE_ASSERT((!IsInBounds<int64_t, int32_t>(int64_t(INT32_MIN) - 1))); |
|
86 MOZ_RELEASE_ASSERT((IsInBounds<int64_t, int32_t>(int64_t(INT32_MIN)))); |
|
87 MOZ_RELEASE_ASSERT((IsInBounds<int64_t, int32_t>(int64_t(INT32_MIN) + 1))); |
|
88 MOZ_RELEASE_ASSERT((IsInBounds<int64_t, int32_t>(int64_t(INT32_MAX) - 1))); |
|
89 MOZ_RELEASE_ASSERT((IsInBounds<int64_t, int32_t>(int64_t(INT32_MAX)))); |
|
90 MOZ_RELEASE_ASSERT((!IsInBounds<int64_t, int32_t>(int64_t(INT32_MAX) + 1))); |
|
91 |
|
92 MOZ_RELEASE_ASSERT((!IsInBounds<int64_t, uint32_t>(int64_t(-1)))); |
|
93 MOZ_RELEASE_ASSERT((IsInBounds<int64_t, uint32_t>(int64_t(0)))); |
|
94 MOZ_RELEASE_ASSERT((IsInBounds<int64_t, uint32_t>(int64_t(1)))); |
|
95 MOZ_RELEASE_ASSERT((IsInBounds<int64_t, uint32_t>(int64_t(UINT32_MAX) - 1))); |
|
96 MOZ_RELEASE_ASSERT((IsInBounds<int64_t, uint32_t>(int64_t(UINT32_MAX)))); |
|
97 MOZ_RELEASE_ASSERT((!IsInBounds<int64_t, uint32_t>(int64_t(UINT32_MAX) + 1))); |
|
98 } |
|
99 |
|
100 int |
|
101 main() |
|
102 { |
|
103 TestBitwiseCast(); |
|
104 |
|
105 TestSameSize(); |
|
106 TestToBiggerSize(); |
|
107 TestToSmallerSize(); |
|
108 } |