#include #include #include #define try_convert(exp_pass, fn, i) \ try_convert_real(#fn "(" #i ")", exp_pass, fn, i) template static void try_convert_real( char const* description, bool exp_pass, To (*fn)(From const&), From const& i) { bool passed = false; try { To result = fn(i); passed = true; std::cout << description << ": " << i << " " << result; } catch (std::range_error& e) { std::cout << description << ": " << e.what(); passed = false; } std::cout << ((passed == exp_pass) ? " PASSED" : " FAILED") << std::endl; } int main() { uint32_t u1 = 3141592653U; // Too big for signed type int32_t i1 = -1153374643; // Same bit pattern as u1 uint64_t ul1 = 1099511627776LL; // Too big for 32-bit uint64_t ul2 = 12345; // Fits into 32-bit int32_t i2 = 81; // Fits in char and uchar char c1 = '\xf7'; // Signed vaule when char // Verify i1 and u1 have same bit pattern assert(static_cast(i1) == u1); // Verify that we can unsafely convert between char and unsigned char assert(c1 == static_cast(static_cast(c1))); try_convert(true, QIntC::to_int, i1); try_convert(true, QIntC::to_uint, u1); try_convert(false, QIntC::to_int, u1); try_convert(false, QIntC::to_uint, i1); try_convert(false, QIntC::to_int, ul1); try_convert(true, QIntC::to_int, ul2); try_convert(true, QIntC::to_uint, ul2); try_convert(true, QIntC::to_offset, u1); try_convert(true, QIntC::to_offset, i1); try_convert(false, QIntC::to_ulonglong, i1); try_convert(true, QIntC::to_char, i2); try_convert(true, QIntC::to_uchar, i2); try_convert(false, QIntC::to_uchar, c1); return 0; }