[29] | 1 | // boost integer.hpp test program ------------------------------------------// |
---|
| 2 | |
---|
| 3 | // Copyright Beman Dawes 1999. Distributed under the Boost |
---|
| 4 | // Software License, Version 1.0. (See accompanying file |
---|
| 5 | // LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) |
---|
| 6 | |
---|
| 7 | |
---|
| 8 | // See http://www.boost.org/libs/integer for documentation. |
---|
| 9 | |
---|
| 10 | // Revision History |
---|
| 11 | // 04 Oct 01 Added tests for new templates; rewrote code (Daryle Walker) |
---|
| 12 | // 10 Mar 01 Boost Test Library now used for tests (Beman Dawes) |
---|
| 13 | // 31 Aug 99 Initial version |
---|
| 14 | |
---|
| 15 | #include <boost/test/minimal.hpp> // for main, BOOST_CHECK |
---|
| 16 | |
---|
| 17 | #include <boost/config.hpp> // for BOOST_NO_USING_TEMPLATE |
---|
| 18 | #include <boost/cstdlib.hpp> // for boost::exit_success |
---|
| 19 | #include <boost/integer.hpp> // for boost::int_t, boost::uint_t |
---|
| 20 | |
---|
| 21 | #include <climits> // for ULONG_MAX, LONG_MAX, LONG_MIN |
---|
| 22 | #include <iostream> // for std::cout (std::endl indirectly) |
---|
| 23 | #include <typeinfo> // for std::type_info |
---|
| 24 | |
---|
| 25 | |
---|
| 26 | // Control if the names of the types for each version |
---|
| 27 | // of the integer templates will be printed. |
---|
| 28 | #ifndef CONTROL_SHOW_TYPES |
---|
| 29 | #define CONTROL_SHOW_TYPES 0 |
---|
| 30 | #endif |
---|
| 31 | |
---|
| 32 | |
---|
| 33 | // If specializations have not already been done, then we can confirm |
---|
| 34 | // the effects of the "fast" types by making a specialization. |
---|
| 35 | namespace boost |
---|
| 36 | { |
---|
| 37 | template < > |
---|
| 38 | struct int_fast_t< short > |
---|
| 39 | { |
---|
| 40 | typedef long fast; |
---|
| 41 | }; |
---|
| 42 | } |
---|
| 43 | |
---|
| 44 | |
---|
| 45 | // Show the types of an integer template version |
---|
| 46 | #if CONTROL_SHOW_TYPES |
---|
| 47 | #define SHOW_TYPE(Template, Number, Type) ::std::cout << "Type \"" \ |
---|
| 48 | #Template "<" #Number ">::" #Type "\" is \"" << typeid(Template < \ |
---|
| 49 | Number > :: Type).name() << ".\"\n" |
---|
| 50 | #else |
---|
| 51 | #define SHOW_TYPE(Template, Number, Type) |
---|
| 52 | #endif |
---|
| 53 | |
---|
| 54 | #define SHOW_TYPES(Template, Type) SHOW_TYPE(Template, 32, Type); \ |
---|
| 55 | SHOW_TYPE(Template, 31, Type); SHOW_TYPE(Template, 30, Type); \ |
---|
| 56 | SHOW_TYPE(Template, 29, Type); SHOW_TYPE(Template, 28, Type); \ |
---|
| 57 | SHOW_TYPE(Template, 27, Type); SHOW_TYPE(Template, 26, Type); \ |
---|
| 58 | SHOW_TYPE(Template, 25, Type); SHOW_TYPE(Template, 24, Type); \ |
---|
| 59 | SHOW_TYPE(Template, 23, Type); SHOW_TYPE(Template, 22, Type); \ |
---|
| 60 | SHOW_TYPE(Template, 21, Type); SHOW_TYPE(Template, 20, Type); \ |
---|
| 61 | SHOW_TYPE(Template, 19, Type); SHOW_TYPE(Template, 18, Type); \ |
---|
| 62 | SHOW_TYPE(Template, 17, Type); SHOW_TYPE(Template, 16, Type); \ |
---|
| 63 | SHOW_TYPE(Template, 15, Type); SHOW_TYPE(Template, 14, Type); \ |
---|
| 64 | SHOW_TYPE(Template, 13, Type); SHOW_TYPE(Template, 12, Type); \ |
---|
| 65 | SHOW_TYPE(Template, 11, Type); SHOW_TYPE(Template, 10, Type); \ |
---|
| 66 | SHOW_TYPE(Template, 9, Type); SHOW_TYPE(Template, 8, Type); \ |
---|
| 67 | SHOW_TYPE(Template, 7, Type); SHOW_TYPE(Template, 6, Type); \ |
---|
| 68 | SHOW_TYPE(Template, 5, Type); SHOW_TYPE(Template, 4, Type); \ |
---|
| 69 | SHOW_TYPE(Template, 3, Type); SHOW_TYPE(Template, 2, Type); \ |
---|
| 70 | SHOW_TYPE(Template, 1, Type); SHOW_TYPE(Template, 0, Type) |
---|
| 71 | |
---|
| 72 | #define SHOW_SHIFTED_TYPE(Template, Number, Type) SHOW_TYPE(Template, (1UL << Number), Type) |
---|
| 73 | |
---|
| 74 | #define SHOW_SHIFTED_TYPES(Template, Type) SHOW_SHIFTED_TYPE(Template, 30, Type); \ |
---|
| 75 | SHOW_SHIFTED_TYPE(Template, 29, Type); SHOW_SHIFTED_TYPE(Template, 28, Type); \ |
---|
| 76 | SHOW_SHIFTED_TYPE(Template, 27, Type); SHOW_SHIFTED_TYPE(Template, 26, Type); \ |
---|
| 77 | SHOW_SHIFTED_TYPE(Template, 25, Type); SHOW_SHIFTED_TYPE(Template, 24, Type); \ |
---|
| 78 | SHOW_SHIFTED_TYPE(Template, 23, Type); SHOW_SHIFTED_TYPE(Template, 22, Type); \ |
---|
| 79 | SHOW_SHIFTED_TYPE(Template, 21, Type); SHOW_SHIFTED_TYPE(Template, 20, Type); \ |
---|
| 80 | SHOW_SHIFTED_TYPE(Template, 19, Type); SHOW_SHIFTED_TYPE(Template, 18, Type); \ |
---|
| 81 | SHOW_SHIFTED_TYPE(Template, 17, Type); SHOW_SHIFTED_TYPE(Template, 16, Type); \ |
---|
| 82 | SHOW_SHIFTED_TYPE(Template, 15, Type); SHOW_SHIFTED_TYPE(Template, 14, Type); \ |
---|
| 83 | SHOW_SHIFTED_TYPE(Template, 13, Type); SHOW_SHIFTED_TYPE(Template, 12, Type); \ |
---|
| 84 | SHOW_SHIFTED_TYPE(Template, 11, Type); SHOW_SHIFTED_TYPE(Template, 10, Type); \ |
---|
| 85 | SHOW_SHIFTED_TYPE(Template, 9, Type); SHOW_SHIFTED_TYPE(Template, 8, Type); \ |
---|
| 86 | SHOW_SHIFTED_TYPE(Template, 7, Type); SHOW_SHIFTED_TYPE(Template, 6, Type); \ |
---|
| 87 | SHOW_SHIFTED_TYPE(Template, 5, Type); SHOW_SHIFTED_TYPE(Template, 4, Type); \ |
---|
| 88 | SHOW_SHIFTED_TYPE(Template, 3, Type); SHOW_SHIFTED_TYPE(Template, 2, Type); \ |
---|
| 89 | SHOW_SHIFTED_TYPE(Template, 1, Type); SHOW_SHIFTED_TYPE(Template, 0, Type) |
---|
| 90 | |
---|
| 91 | #define SHOW_POS_SHIFTED_TYPE(Template, Number, Type) SHOW_TYPE(Template, +(1L << Number), Type) |
---|
| 92 | |
---|
| 93 | #define SHOW_POS_SHIFTED_TYPES(Template, Type) SHOW_POS_SHIFTED_TYPE(Template, 30, Type); \ |
---|
| 94 | SHOW_POS_SHIFTED_TYPE(Template, 29, Type); SHOW_POS_SHIFTED_TYPE(Template, 28, Type); \ |
---|
| 95 | SHOW_POS_SHIFTED_TYPE(Template, 27, Type); SHOW_POS_SHIFTED_TYPE(Template, 26, Type); \ |
---|
| 96 | SHOW_POS_SHIFTED_TYPE(Template, 25, Type); SHOW_POS_SHIFTED_TYPE(Template, 24, Type); \ |
---|
| 97 | SHOW_POS_SHIFTED_TYPE(Template, 23, Type); SHOW_POS_SHIFTED_TYPE(Template, 22, Type); \ |
---|
| 98 | SHOW_POS_SHIFTED_TYPE(Template, 21, Type); SHOW_POS_SHIFTED_TYPE(Template, 20, Type); \ |
---|
| 99 | SHOW_POS_SHIFTED_TYPE(Template, 19, Type); SHOW_POS_SHIFTED_TYPE(Template, 18, Type); \ |
---|
| 100 | SHOW_POS_SHIFTED_TYPE(Template, 17, Type); SHOW_POS_SHIFTED_TYPE(Template, 16, Type); \ |
---|
| 101 | SHOW_POS_SHIFTED_TYPE(Template, 15, Type); SHOW_POS_SHIFTED_TYPE(Template, 14, Type); \ |
---|
| 102 | SHOW_POS_SHIFTED_TYPE(Template, 13, Type); SHOW_POS_SHIFTED_TYPE(Template, 12, Type); \ |
---|
| 103 | SHOW_POS_SHIFTED_TYPE(Template, 11, Type); SHOW_POS_SHIFTED_TYPE(Template, 10, Type); \ |
---|
| 104 | SHOW_POS_SHIFTED_TYPE(Template, 9, Type); SHOW_POS_SHIFTED_TYPE(Template, 8, Type); \ |
---|
| 105 | SHOW_POS_SHIFTED_TYPE(Template, 7, Type); SHOW_POS_SHIFTED_TYPE(Template, 6, Type); \ |
---|
| 106 | SHOW_POS_SHIFTED_TYPE(Template, 5, Type); SHOW_POS_SHIFTED_TYPE(Template, 4, Type); \ |
---|
| 107 | SHOW_POS_SHIFTED_TYPE(Template, 3, Type); SHOW_POS_SHIFTED_TYPE(Template, 2, Type); \ |
---|
| 108 | SHOW_POS_SHIFTED_TYPE(Template, 1, Type); SHOW_POS_SHIFTED_TYPE(Template, 0, Type) |
---|
| 109 | |
---|
| 110 | #define SHOW_NEG_SHIFTED_TYPE(Template, Number, Type) SHOW_TYPE(Template, -(1L << Number), Type) |
---|
| 111 | |
---|
| 112 | #define SHOW_NEG_SHIFTED_TYPES(Template, Type) SHOW_NEG_SHIFTED_TYPE(Template, 30, Type); \ |
---|
| 113 | SHOW_NEG_SHIFTED_TYPE(Template, 29, Type); SHOW_NEG_SHIFTED_TYPE(Template, 28, Type); \ |
---|
| 114 | SHOW_NEG_SHIFTED_TYPE(Template, 27, Type); SHOW_NEG_SHIFTED_TYPE(Template, 26, Type); \ |
---|
| 115 | SHOW_NEG_SHIFTED_TYPE(Template, 25, Type); SHOW_NEG_SHIFTED_TYPE(Template, 24, Type); \ |
---|
| 116 | SHOW_NEG_SHIFTED_TYPE(Template, 23, Type); SHOW_NEG_SHIFTED_TYPE(Template, 22, Type); \ |
---|
| 117 | SHOW_NEG_SHIFTED_TYPE(Template, 21, Type); SHOW_NEG_SHIFTED_TYPE(Template, 20, Type); \ |
---|
| 118 | SHOW_NEG_SHIFTED_TYPE(Template, 19, Type); SHOW_NEG_SHIFTED_TYPE(Template, 18, Type); \ |
---|
| 119 | SHOW_NEG_SHIFTED_TYPE(Template, 17, Type); SHOW_NEG_SHIFTED_TYPE(Template, 16, Type); \ |
---|
| 120 | SHOW_NEG_SHIFTED_TYPE(Template, 15, Type); SHOW_NEG_SHIFTED_TYPE(Template, 14, Type); \ |
---|
| 121 | SHOW_NEG_SHIFTED_TYPE(Template, 13, Type); SHOW_NEG_SHIFTED_TYPE(Template, 12, Type); \ |
---|
| 122 | SHOW_NEG_SHIFTED_TYPE(Template, 11, Type); SHOW_NEG_SHIFTED_TYPE(Template, 10, Type); \ |
---|
| 123 | SHOW_NEG_SHIFTED_TYPE(Template, 9, Type); SHOW_NEG_SHIFTED_TYPE(Template, 8, Type); \ |
---|
| 124 | SHOW_NEG_SHIFTED_TYPE(Template, 7, Type); SHOW_NEG_SHIFTED_TYPE(Template, 6, Type); \ |
---|
| 125 | SHOW_NEG_SHIFTED_TYPE(Template, 5, Type); SHOW_NEG_SHIFTED_TYPE(Template, 4, Type); \ |
---|
| 126 | SHOW_NEG_SHIFTED_TYPE(Template, 3, Type); SHOW_NEG_SHIFTED_TYPE(Template, 2, Type); \ |
---|
| 127 | SHOW_NEG_SHIFTED_TYPE(Template, 1, Type); SHOW_NEG_SHIFTED_TYPE(Template, 0, Type) |
---|
| 128 | |
---|
| 129 | |
---|
| 130 | // Test if a constant can fit within a certain type |
---|
| 131 | #define PRIVATE_FIT_TEST(Template, Number, Type, Value) BOOST_CHECK( Template < Number > :: Type ( Value ) == Value ) |
---|
| 132 | |
---|
| 133 | #if ULONG_MAX > 0xFFFFFFFFL |
---|
| 134 | #define PRIVATE_FIT_TESTS(Template, Type, ValType, InitVal) do { ValType v = InitVal ; \ |
---|
| 135 | PRIVATE_FIT_TEST(Template, 64, Type, v); v >>= 1; \ |
---|
| 136 | PRIVATE_FIT_TEST(Template, 63, Type, v); v >>= 1; PRIVATE_FIT_TEST(Template, 62, Type, v); v >>= 1; \ |
---|
| 137 | PRIVATE_FIT_TEST(Template, 61, Type, v); v >>= 1; PRIVATE_FIT_TEST(Template, 60, Type, v); v >>= 1; \ |
---|
| 138 | PRIVATE_FIT_TEST(Template, 59, Type, v); v >>= 1; PRIVATE_FIT_TEST(Template, 58, Type, v); v >>= 1; \ |
---|
| 139 | PRIVATE_FIT_TEST(Template, 57, Type, v); v >>= 1; PRIVATE_FIT_TEST(Template, 56, Type, v); v >>= 1; \ |
---|
| 140 | PRIVATE_FIT_TEST(Template, 55, Type, v); v >>= 1; PRIVATE_FIT_TEST(Template, 54, Type, v); v >>= 1; \ |
---|
| 141 | PRIVATE_FIT_TEST(Template, 53, Type, v); v >>= 1; PRIVATE_FIT_TEST(Template, 52, Type, v); v >>= 1; \ |
---|
| 142 | PRIVATE_FIT_TEST(Template, 51, Type, v); v >>= 1; PRIVATE_FIT_TEST(Template, 50, Type, v); v >>= 1; \ |
---|
| 143 | PRIVATE_FIT_TEST(Template, 49, Type, v); v >>= 1; PRIVATE_FIT_TEST(Template, 48, Type, v); v >>= 1; \ |
---|
| 144 | PRIVATE_FIT_TEST(Template, 47, Type, v); v >>= 1; PRIVATE_FIT_TEST(Template, 46, Type, v); v >>= 1; \ |
---|
| 145 | PRIVATE_FIT_TEST(Template, 45, Type, v); v >>= 1; PRIVATE_FIT_TEST(Template, 44, Type, v); v >>= 1; \ |
---|
| 146 | PRIVATE_FIT_TEST(Template, 43, Type, v); v >>= 1; PRIVATE_FIT_TEST(Template, 42, Type, v); v >>= 1; \ |
---|
| 147 | PRIVATE_FIT_TEST(Template, 41, Type, v); v >>= 1; PRIVATE_FIT_TEST(Template, 40, Type, v); v >>= 1; \ |
---|
| 148 | PRIVATE_FIT_TEST(Template, 39, Type, v); v >>= 1; PRIVATE_FIT_TEST(Template, 38, Type, v); v >>= 1; \ |
---|
| 149 | PRIVATE_FIT_TEST(Template, 37, Type, v); v >>= 1; PRIVATE_FIT_TEST(Template, 36, Type, v); v >>= 1; \ |
---|
| 150 | PRIVATE_FIT_TEST(Template, 35, Type, v); v >>= 1; PRIVATE_FIT_TEST(Template, 34, Type, v); v >>= 1; \ |
---|
| 151 | PRIVATE_FIT_TEST(Template, 33, Type, v); v >>= 1; PRIVATE_FIT_TEST(Template, 32, Type, v); v >>= 1; \ |
---|
| 152 | PRIVATE_FIT_TEST(Template, 31, Type, v); v >>= 1; PRIVATE_FIT_TEST(Template, 30, Type, v); v >>= 1; \ |
---|
| 153 | PRIVATE_FIT_TEST(Template, 29, Type, v); v >>= 1; PRIVATE_FIT_TEST(Template, 28, Type, v); v >>= 1; \ |
---|
| 154 | PRIVATE_FIT_TEST(Template, 27, Type, v); v >>= 1; PRIVATE_FIT_TEST(Template, 26, Type, v); v >>= 1; \ |
---|
| 155 | PRIVATE_FIT_TEST(Template, 25, Type, v); v >>= 1; PRIVATE_FIT_TEST(Template, 24, Type, v); v >>= 1; \ |
---|
| 156 | PRIVATE_FIT_TEST(Template, 23, Type, v); v >>= 1; PRIVATE_FIT_TEST(Template, 22, Type, v); v >>= 1; \ |
---|
| 157 | PRIVATE_FIT_TEST(Template, 21, Type, v); v >>= 1; PRIVATE_FIT_TEST(Template, 20, Type, v); v >>= 1; \ |
---|
| 158 | PRIVATE_FIT_TEST(Template, 19, Type, v); v >>= 1; PRIVATE_FIT_TEST(Template, 18, Type, v); v >>= 1; \ |
---|
| 159 | PRIVATE_FIT_TEST(Template, 17, Type, v); v >>= 1; PRIVATE_FIT_TEST(Template, 16, Type, v); v >>= 1; \ |
---|
| 160 | PRIVATE_FIT_TEST(Template, 15, Type, v); v >>= 1; PRIVATE_FIT_TEST(Template, 14, Type, v); v >>= 1; \ |
---|
| 161 | PRIVATE_FIT_TEST(Template, 13, Type, v); v >>= 1; PRIVATE_FIT_TEST(Template, 12, Type, v); v >>= 1; \ |
---|
| 162 | PRIVATE_FIT_TEST(Template, 11, Type, v); v >>= 1; PRIVATE_FIT_TEST(Template, 10, Type, v); v >>= 1; \ |
---|
| 163 | PRIVATE_FIT_TEST(Template, 9, Type, v); v >>= 1; PRIVATE_FIT_TEST(Template, 8, Type, v); v >>= 1; \ |
---|
| 164 | PRIVATE_FIT_TEST(Template, 7, Type, v); v >>= 1; PRIVATE_FIT_TEST(Template, 6, Type, v); v >>= 1; \ |
---|
| 165 | PRIVATE_FIT_TEST(Template, 5, Type, v); v >>= 1; PRIVATE_FIT_TEST(Template, 4, Type, v); v >>= 1; \ |
---|
| 166 | PRIVATE_FIT_TEST(Template, 3, Type, v); v >>= 1; PRIVATE_FIT_TEST(Template, 2, Type, v); v >>= 1; \ |
---|
| 167 | PRIVATE_FIT_TEST(Template, 1, Type, v); v >>= 1; PRIVATE_FIT_TEST(Template, 0, Type, v); } while ( false ) |
---|
| 168 | #else |
---|
| 169 | #define PRIVATE_FIT_TESTS(Template, Type, ValType, InitVal) do { ValType v = InitVal ; \ |
---|
| 170 | PRIVATE_FIT_TEST(Template, 32, Type, v); v >>= 1; \ |
---|
| 171 | PRIVATE_FIT_TEST(Template, 31, Type, v); v >>= 1; PRIVATE_FIT_TEST(Template, 30, Type, v); v >>= 1; \ |
---|
| 172 | PRIVATE_FIT_TEST(Template, 29, Type, v); v >>= 1; PRIVATE_FIT_TEST(Template, 28, Type, v); v >>= 1; \ |
---|
| 173 | PRIVATE_FIT_TEST(Template, 27, Type, v); v >>= 1; PRIVATE_FIT_TEST(Template, 26, Type, v); v >>= 1; \ |
---|
| 174 | PRIVATE_FIT_TEST(Template, 25, Type, v); v >>= 1; PRIVATE_FIT_TEST(Template, 24, Type, v); v >>= 1; \ |
---|
| 175 | PRIVATE_FIT_TEST(Template, 23, Type, v); v >>= 1; PRIVATE_FIT_TEST(Template, 22, Type, v); v >>= 1; \ |
---|
| 176 | PRIVATE_FIT_TEST(Template, 21, Type, v); v >>= 1; PRIVATE_FIT_TEST(Template, 20, Type, v); v >>= 1; \ |
---|
| 177 | PRIVATE_FIT_TEST(Template, 19, Type, v); v >>= 1; PRIVATE_FIT_TEST(Template, 18, Type, v); v >>= 1; \ |
---|
| 178 | PRIVATE_FIT_TEST(Template, 17, Type, v); v >>= 1; PRIVATE_FIT_TEST(Template, 16, Type, v); v >>= 1; \ |
---|
| 179 | PRIVATE_FIT_TEST(Template, 15, Type, v); v >>= 1; PRIVATE_FIT_TEST(Template, 14, Type, v); v >>= 1; \ |
---|
| 180 | PRIVATE_FIT_TEST(Template, 13, Type, v); v >>= 1; PRIVATE_FIT_TEST(Template, 12, Type, v); v >>= 1; \ |
---|
| 181 | PRIVATE_FIT_TEST(Template, 11, Type, v); v >>= 1; PRIVATE_FIT_TEST(Template, 10, Type, v); v >>= 1; \ |
---|
| 182 | PRIVATE_FIT_TEST(Template, 9, Type, v); v >>= 1; PRIVATE_FIT_TEST(Template, 8, Type, v); v >>= 1; \ |
---|
| 183 | PRIVATE_FIT_TEST(Template, 7, Type, v); v >>= 1; PRIVATE_FIT_TEST(Template, 6, Type, v); v >>= 1; \ |
---|
| 184 | PRIVATE_FIT_TEST(Template, 5, Type, v); v >>= 1; PRIVATE_FIT_TEST(Template, 4, Type, v); v >>= 1; \ |
---|
| 185 | PRIVATE_FIT_TEST(Template, 3, Type, v); v >>= 1; PRIVATE_FIT_TEST(Template, 2, Type, v); v >>= 1; \ |
---|
| 186 | PRIVATE_FIT_TEST(Template, 1, Type, v); v >>= 1; PRIVATE_FIT_TEST(Template, 0, Type, v); } while ( false ) |
---|
| 187 | #endif |
---|
| 188 | |
---|
| 189 | #define PRIVATE_SHIFTED_FIT_TEST(Template, Number, Type, Value) BOOST_CHECK( Template < (ULONG_MAX >> Number) > :: Type ( Value ) == Value ) |
---|
| 190 | |
---|
| 191 | #define PRIVATE_SHIFTED_FIT_TESTS(Template, Type, ValType, InitVal) do { ValType v = InitVal ; \ |
---|
| 192 | PRIVATE_SHIFTED_FIT_TEST(Template, 0, Type, v); v >>= 1; PRIVATE_SHIFTED_FIT_TEST(Template, 1, Type, v); v >>= 1; \ |
---|
| 193 | PRIVATE_SHIFTED_FIT_TEST(Template, 2, Type, v); v >>= 1; PRIVATE_SHIFTED_FIT_TEST(Template, 3, Type, v); v >>= 1; \ |
---|
| 194 | PRIVATE_SHIFTED_FIT_TEST(Template, 4, Type, v); v >>= 1; PRIVATE_SHIFTED_FIT_TEST(Template, 5, Type, v); v >>= 1; \ |
---|
| 195 | PRIVATE_SHIFTED_FIT_TEST(Template, 6, Type, v); v >>= 1; PRIVATE_SHIFTED_FIT_TEST(Template, 7, Type, v); v >>= 1; \ |
---|
| 196 | PRIVATE_SHIFTED_FIT_TEST(Template, 8, Type, v); v >>= 1; PRIVATE_SHIFTED_FIT_TEST(Template, 9, Type, v); v >>= 1; \ |
---|
| 197 | PRIVATE_SHIFTED_FIT_TEST(Template, 10, Type, v); v >>= 1; PRIVATE_SHIFTED_FIT_TEST(Template, 11, Type, v); v >>= 1; \ |
---|
| 198 | PRIVATE_SHIFTED_FIT_TEST(Template, 12, Type, v); v >>= 1; PRIVATE_SHIFTED_FIT_TEST(Template, 13, Type, v); v >>= 1; \ |
---|
| 199 | PRIVATE_SHIFTED_FIT_TEST(Template, 14, Type, v); v >>= 1; PRIVATE_SHIFTED_FIT_TEST(Template, 15, Type, v); v >>= 1; \ |
---|
| 200 | PRIVATE_SHIFTED_FIT_TEST(Template, 16, Type, v); v >>= 1; PRIVATE_SHIFTED_FIT_TEST(Template, 17, Type, v); v >>= 1; \ |
---|
| 201 | PRIVATE_SHIFTED_FIT_TEST(Template, 18, Type, v); v >>= 1; PRIVATE_SHIFTED_FIT_TEST(Template, 19, Type, v); v >>= 1; \ |
---|
| 202 | PRIVATE_SHIFTED_FIT_TEST(Template, 20, Type, v); v >>= 1; PRIVATE_SHIFTED_FIT_TEST(Template, 21, Type, v); v >>= 1; \ |
---|
| 203 | PRIVATE_SHIFTED_FIT_TEST(Template, 22, Type, v); v >>= 1; PRIVATE_SHIFTED_FIT_TEST(Template, 23, Type, v); v >>= 1; \ |
---|
| 204 | PRIVATE_SHIFTED_FIT_TEST(Template, 24, Type, v); v >>= 1; PRIVATE_SHIFTED_FIT_TEST(Template, 25, Type, v); v >>= 1; \ |
---|
| 205 | PRIVATE_SHIFTED_FIT_TEST(Template, 26, Type, v); v >>= 1; PRIVATE_SHIFTED_FIT_TEST(Template, 27, Type, v); v >>= 1; \ |
---|
| 206 | PRIVATE_SHIFTED_FIT_TEST(Template, 28, Type, v); v >>= 1; PRIVATE_SHIFTED_FIT_TEST(Template, 29, Type, v); v >>= 1; \ |
---|
| 207 | PRIVATE_SHIFTED_FIT_TEST(Template, 30, Type, v); v >>= 1; PRIVATE_SHIFTED_FIT_TEST(Template, 31, Type, v); } while ( false ) |
---|
| 208 | |
---|
| 209 | #define PRIVATE_POS_SHIFTED_FIT_TEST(Template, Number, Type, Value) BOOST_CHECK( Template < (LONG_MAX >> Number) > :: Type ( Value ) == Value ) |
---|
| 210 | |
---|
| 211 | #define PRIVATE_POS_FIT_TESTS(Template, Type, ValType, InitVal) do { ValType v = InitVal ; \ |
---|
| 212 | PRIVATE_POS_SHIFTED_FIT_TEST(Template, 0, Type, v); v >>= 1; PRIVATE_POS_SHIFTED_FIT_TEST(Template, 1, Type, v); v >>= 1; \ |
---|
| 213 | PRIVATE_POS_SHIFTED_FIT_TEST(Template, 2, Type, v); v >>= 1; PRIVATE_POS_SHIFTED_FIT_TEST(Template, 3, Type, v); v >>= 1; \ |
---|
| 214 | PRIVATE_POS_SHIFTED_FIT_TEST(Template, 4, Type, v); v >>= 1; PRIVATE_POS_SHIFTED_FIT_TEST(Template, 5, Type, v); v >>= 1; \ |
---|
| 215 | PRIVATE_POS_SHIFTED_FIT_TEST(Template, 6, Type, v); v >>= 1; PRIVATE_POS_SHIFTED_FIT_TEST(Template, 7, Type, v); v >>= 1; \ |
---|
| 216 | PRIVATE_POS_SHIFTED_FIT_TEST(Template, 8, Type, v); v >>= 1; PRIVATE_POS_SHIFTED_FIT_TEST(Template, 9, Type, v); v >>= 1; \ |
---|
| 217 | PRIVATE_POS_SHIFTED_FIT_TEST(Template, 10, Type, v); v >>= 1; PRIVATE_POS_SHIFTED_FIT_TEST(Template, 11, Type, v); v >>= 1; \ |
---|
| 218 | PRIVATE_POS_SHIFTED_FIT_TEST(Template, 12, Type, v); v >>= 1; PRIVATE_POS_SHIFTED_FIT_TEST(Template, 13, Type, v); v >>= 1; \ |
---|
| 219 | PRIVATE_POS_SHIFTED_FIT_TEST(Template, 14, Type, v); v >>= 1; PRIVATE_POS_SHIFTED_FIT_TEST(Template, 15, Type, v); v >>= 1; \ |
---|
| 220 | PRIVATE_POS_SHIFTED_FIT_TEST(Template, 16, Type, v); v >>= 1; PRIVATE_POS_SHIFTED_FIT_TEST(Template, 17, Type, v); v >>= 1; \ |
---|
| 221 | PRIVATE_POS_SHIFTED_FIT_TEST(Template, 18, Type, v); v >>= 1; PRIVATE_POS_SHIFTED_FIT_TEST(Template, 19, Type, v); v >>= 1; \ |
---|
| 222 | PRIVATE_POS_SHIFTED_FIT_TEST(Template, 20, Type, v); v >>= 1; PRIVATE_POS_SHIFTED_FIT_TEST(Template, 21, Type, v); v >>= 1; \ |
---|
| 223 | PRIVATE_POS_SHIFTED_FIT_TEST(Template, 22, Type, v); v >>= 1; PRIVATE_POS_SHIFTED_FIT_TEST(Template, 23, Type, v); v >>= 1; \ |
---|
| 224 | PRIVATE_POS_SHIFTED_FIT_TEST(Template, 24, Type, v); v >>= 1; PRIVATE_POS_SHIFTED_FIT_TEST(Template, 25, Type, v); v >>= 1; \ |
---|
| 225 | PRIVATE_POS_SHIFTED_FIT_TEST(Template, 26, Type, v); v >>= 1; PRIVATE_POS_SHIFTED_FIT_TEST(Template, 27, Type, v); v >>= 1; \ |
---|
| 226 | PRIVATE_POS_SHIFTED_FIT_TEST(Template, 28, Type, v); v >>= 1; PRIVATE_POS_SHIFTED_FIT_TEST(Template, 29, Type, v); v >>= 1; \ |
---|
| 227 | PRIVATE_POS_SHIFTED_FIT_TEST(Template, 30, Type, v); v >>= 1; PRIVATE_POS_SHIFTED_FIT_TEST(Template, 31, Type, v); } while ( false ) |
---|
| 228 | |
---|
| 229 | #define PRIVATE_NEG_SHIFTED_FIT_TEST(Template, Number, Type, Value) BOOST_CHECK( Template < (LONG_MIN >> Number) > :: Type ( Value ) == Value ) |
---|
| 230 | |
---|
| 231 | #define PRIVATE_NEG_FIT_TESTS(Template, Type, ValType, InitVal) do { ValType v = InitVal ; \ |
---|
| 232 | PRIVATE_NEG_SHIFTED_FIT_TEST(Template, 0, Type, v); v >>= 1; PRIVATE_NEG_SHIFTED_FIT_TEST(Template, 1, Type, v); v >>= 1; \ |
---|
| 233 | PRIVATE_NEG_SHIFTED_FIT_TEST(Template, 2, Type, v); v >>= 1; PRIVATE_NEG_SHIFTED_FIT_TEST(Template, 3, Type, v); v >>= 1; \ |
---|
| 234 | PRIVATE_NEG_SHIFTED_FIT_TEST(Template, 4, Type, v); v >>= 1; PRIVATE_NEG_SHIFTED_FIT_TEST(Template, 5, Type, v); v >>= 1; \ |
---|
| 235 | PRIVATE_NEG_SHIFTED_FIT_TEST(Template, 6, Type, v); v >>= 1; PRIVATE_NEG_SHIFTED_FIT_TEST(Template, 7, Type, v); v >>= 1; \ |
---|
| 236 | PRIVATE_NEG_SHIFTED_FIT_TEST(Template, 8, Type, v); v >>= 1; PRIVATE_NEG_SHIFTED_FIT_TEST(Template, 9, Type, v); v >>= 1; \ |
---|
| 237 | PRIVATE_NEG_SHIFTED_FIT_TEST(Template, 10, Type, v); v >>= 1; PRIVATE_NEG_SHIFTED_FIT_TEST(Template, 11, Type, v); v >>= 1; \ |
---|
| 238 | PRIVATE_NEG_SHIFTED_FIT_TEST(Template, 12, Type, v); v >>= 1; PRIVATE_NEG_SHIFTED_FIT_TEST(Template, 13, Type, v); v >>= 1; \ |
---|
| 239 | PRIVATE_NEG_SHIFTED_FIT_TEST(Template, 14, Type, v); v >>= 1; PRIVATE_NEG_SHIFTED_FIT_TEST(Template, 15, Type, v); v >>= 1; \ |
---|
| 240 | PRIVATE_NEG_SHIFTED_FIT_TEST(Template, 16, Type, v); v >>= 1; PRIVATE_NEG_SHIFTED_FIT_TEST(Template, 17, Type, v); v >>= 1; \ |
---|
| 241 | PRIVATE_NEG_SHIFTED_FIT_TEST(Template, 18, Type, v); v >>= 1; PRIVATE_NEG_SHIFTED_FIT_TEST(Template, 19, Type, v); v >>= 1; \ |
---|
| 242 | PRIVATE_NEG_SHIFTED_FIT_TEST(Template, 20, Type, v); v >>= 1; PRIVATE_NEG_SHIFTED_FIT_TEST(Template, 21, Type, v); v >>= 1; \ |
---|
| 243 | PRIVATE_NEG_SHIFTED_FIT_TEST(Template, 22, Type, v); v >>= 1; PRIVATE_NEG_SHIFTED_FIT_TEST(Template, 23, Type, v); v >>= 1; \ |
---|
| 244 | PRIVATE_NEG_SHIFTED_FIT_TEST(Template, 24, Type, v); v >>= 1; PRIVATE_NEG_SHIFTED_FIT_TEST(Template, 25, Type, v); v >>= 1; \ |
---|
| 245 | PRIVATE_NEG_SHIFTED_FIT_TEST(Template, 26, Type, v); v >>= 1; PRIVATE_NEG_SHIFTED_FIT_TEST(Template, 27, Type, v); v >>= 1; \ |
---|
| 246 | PRIVATE_NEG_SHIFTED_FIT_TEST(Template, 28, Type, v); v >>= 1; PRIVATE_NEG_SHIFTED_FIT_TEST(Template, 29, Type, v); v >>= 1; \ |
---|
| 247 | PRIVATE_NEG_SHIFTED_FIT_TEST(Template, 30, Type, v); v >>= 1; PRIVATE_NEG_SHIFTED_FIT_TEST(Template, 31, Type, v); } while ( false ) |
---|
| 248 | |
---|
| 249 | |
---|
| 250 | // Test program |
---|
| 251 | int |
---|
| 252 | test_main |
---|
| 253 | ( |
---|
| 254 | int, |
---|
| 255 | char*[] |
---|
| 256 | ) |
---|
| 257 | { |
---|
| 258 | #ifndef BOOST_NO_USING_TEMPLATE |
---|
| 259 | using boost::int_t; |
---|
| 260 | using boost::uint_t; |
---|
| 261 | using boost::int_max_value_t; |
---|
| 262 | using boost::int_min_value_t; |
---|
| 263 | using boost::uint_value_t; |
---|
| 264 | #else |
---|
| 265 | using namespace boost; |
---|
| 266 | #endif |
---|
| 267 | |
---|
| 268 | SHOW_TYPES( int_t, least ); |
---|
| 269 | SHOW_TYPES( int_t, fast ); |
---|
| 270 | SHOW_TYPES( uint_t, least ); |
---|
| 271 | SHOW_TYPES( uint_t, fast ); |
---|
| 272 | SHOW_POS_SHIFTED_TYPES( int_max_value_t, least ); |
---|
| 273 | SHOW_POS_SHIFTED_TYPES( int_max_value_t, fast ); |
---|
| 274 | SHOW_NEG_SHIFTED_TYPES( int_min_value_t, least ); |
---|
| 275 | SHOW_NEG_SHIFTED_TYPES( int_min_value_t, fast ); |
---|
| 276 | SHOW_SHIFTED_TYPES( uint_value_t, least ); |
---|
| 277 | SHOW_SHIFTED_TYPES( uint_value_t, fast ); |
---|
| 278 | |
---|
| 279 | PRIVATE_FIT_TESTS( int_t, least, long, LONG_MAX ); |
---|
| 280 | PRIVATE_FIT_TESTS( int_t, fast, long, LONG_MAX ); |
---|
| 281 | PRIVATE_FIT_TESTS( uint_t, least, unsigned long, ULONG_MAX ); |
---|
| 282 | PRIVATE_FIT_TESTS( uint_t, fast, unsigned long, ULONG_MAX ); |
---|
| 283 | PRIVATE_POS_FIT_TESTS( int_max_value_t, least, long, LONG_MAX ); |
---|
| 284 | PRIVATE_POS_FIT_TESTS( int_max_value_t, fast, long, LONG_MAX ); |
---|
| 285 | PRIVATE_NEG_FIT_TESTS( int_min_value_t, least, long, LONG_MIN ); |
---|
| 286 | PRIVATE_NEG_FIT_TESTS( int_min_value_t, fast, long, LONG_MIN ); |
---|
| 287 | PRIVATE_SHIFTED_FIT_TESTS( uint_value_t, least, unsigned long, ULONG_MAX ); |
---|
| 288 | PRIVATE_SHIFTED_FIT_TESTS( uint_value_t, fast, unsigned long, ULONG_MAX ); |
---|
| 289 | |
---|
| 290 | return boost::exit_success; |
---|
| 291 | } |
---|