18 #define TEST(expected,code) \
25 if (thrown != expected) { \
44 TEST(
false,i8 += 200);
65 TEST(
false,i8 += 110);
104 for (n1 = 0; n1 < 1250; ++n1) {
105 for (n2 = 0; n2 < 1250; ++n2) {
107 TEST(
false,num = n1 * n2);
111 <<
"*** ERROR: safe_num<uint64> operator*("
117 assert(num == n1 * n2);
125 assert(max_limit<bool>() ==
true);
126 assert(min_limit<bool>() ==
false);
128 assert(max_limit<char>() == CHAR_MAX);
129 assert(min_limit<char>() == CHAR_MIN);
131 assert(max_limit<signed char>() == SCHAR_MAX);
132 assert(min_limit<signed char>() == SCHAR_MIN);
134 assert(max_limit<unsigned char>() == UCHAR_MAX);
135 assert(min_limit<unsigned char>() == 0);
137 assert(max_limit<short>() == SHRT_MAX);
138 assert(min_limit<short>() == SHRT_MIN);
140 assert(max_limit<unsigned short>() == USHRT_MAX);
141 assert(min_limit<unsigned short>() == 0);
143 assert(max_limit<int>() == INT_MAX);
144 assert(min_limit<int>() == INT_MIN);
146 assert(max_limit<unsigned int>() == UINT_MAX);
147 assert(min_limit<unsigned int>() == 0);
149 assert(max_limit<long>() == LONG_MAX);
150 assert(min_limit<long>() == LONG_MIN);
152 assert(max_limit<unsigned long>() == ULONG_MAX);
153 assert(min_limit<unsigned long>() == 0);
162 assert(max_limit<bool>() == std::numeric_limits<bool>::max());
163 assert(min_limit<bool>() == std::numeric_limits<bool>::min());
165 assert(max_limit<char>() == std::numeric_limits<char>::max());
166 assert(min_limit<char>() == std::numeric_limits<char>::min());
168 assert(max_limit<signed char>() == std::numeric_limits<signed char>::max());
169 assert(min_limit<signed char>() == std::numeric_limits<signed char>::min());
171 assert(max_limit<unsigned char>() == std::numeric_limits<unsigned char>::max());
172 assert(min_limit<unsigned char>() == std::numeric_limits<unsigned char>::min());
174 assert(max_limit<short>() == std::numeric_limits<short>::max());
175 assert(min_limit<short>() == std::numeric_limits<short>::min());
177 assert(max_limit<unsigned short>() == std::numeric_limits<unsigned short>::max());
178 assert(min_limit<unsigned short>() == std::numeric_limits<unsigned short>::min());
180 assert(max_limit<int>() == std::numeric_limits<int>::max());
181 assert(min_limit<int>() == std::numeric_limits<int>::min());
183 assert(max_limit<unsigned int>() == std::numeric_limits<unsigned int>::max());
184 assert(min_limit<unsigned int>() == std::numeric_limits<unsigned int>::min());
186 assert(max_limit<long>() == std::numeric_limits<long>::max());
187 assert(min_limit<long>() == std::numeric_limits<long>::min());
189 assert(max_limit<unsigned long>() == std::numeric_limits<unsigned long>::max());
190 assert(min_limit<unsigned long>() == std::numeric_limits<unsigned long>::min());
206 assert(si.
value() == 0);
207 TEST(
false,si++ == 0);
208 assert(si.
value() == 1);
209 TEST(
false,si++ == 1);
210 assert(si.
value() == 2);
211 TEST(
false,++si == 3);
212 assert(si.
value() == 3);
213 TEST(
false,si-- == 3);
214 assert(si.
value() == 2);
215 TEST(
false,--si == 1)
216 assert(si.
value() == 1);
217 TEST(
false,--si == 0);
218 TEST(
true,--si == 0);
219 TEST(
false,si = max_limit<unsigned short>());
220 TEST(
true,++si == max_limit<unsigned short>());
231 assert(si2 % si1 == 1);
235 TEST(
false,si == 15);
237 TEST(
false,si == 10);
239 TEST(
false,si == 50);
241 TEST(
false,si == 10);
252 assert(si.
value() == 0);
253 TEST(
false,si++ == 0);
254 assert(si.
value() == 1);
255 TEST(
false,si++ == 1);
256 assert(si.
value() == 2);
257 TEST(
false,++si == 3);
258 assert(si.
value() == 3);
259 TEST(
false,si-- == 3);
260 assert(si.
value() == 2);
261 TEST(
false,--si == 1)
262 assert(si.
value() == 1);
263 TEST(
false,--si == 0);
264 TEST(
false,--si == -1);
265 TEST(
false,si = max_limit<short>());
266 TEST(
true,++si == max_limit<short>());
267 TEST(
false,si = min_limit<short>());
268 TEST(
true,--si == max_limit<short>());
286 for (ci1 = min_limit<char>(); ci1 < max_limit<char>(); ++ci1)
288 for (ci2 = min_limit<char>(); ci2 < max_limit<char>(); ++ci2)
298 should_throw =
false;
300 if ((si > max_limit<char>()) || (si < min_limit<char>()))
302 if (ci2 == min_limit<char>())
304 assert(thrown == should_throw);
314 should_throw =
false;
316 if ((si > max_limit<char>()) || (si < min_limit<char>()))
318 if (ci2 == min_limit<char>())
320 assert(thrown == should_throw);
330 should_throw =
false;
332 if ((si > max_limit<char>()) || (si < min_limit<char>()))
334 if ((ci1 != 0) && (ci1 != 1) && (ci2 == min_limit<char>()))
336 assert(thrown == should_throw);
346 should_throw =
false;
347 if (ci2.
value() == 0)
351 if ((si > max_limit<char>()) || (si < min_limit<char>()))
354 assert(thrown == should_throw);
402 int main(
int argc,
char const * argv[])
T absolute(const T &a_num)
Return the absolute value of a numeric type.
Safely manipulate numbers without worryiung about over/underflow error.
Basic types definitions and templates.
const T value(void) const
Return the value.
#define TEST(expected, code)
static const T max_limit()
A small set of numeric limits routines, since gcc prior to 3.x doesn't have numeric_limits.
const float max_limit< float >()
Return the largest possible number that a float may hold.
int main(int argc, char const *argv[])
const double min_limit< double >()
Return the smallest positive number that a double may hold.
const float min_limit< float >()
Return the smallest positive number that a float may hold.
const double max_limit< double >()
Return the largest possible number that a double may hold.