| | |
| | |
| | |
| | |
| | |
| | |
| | |
| |
|
| | #include <assert.h> |
| | #include <cmath> |
| | #include <cstdint> |
| | #include <type_traits> |
| |
|
| | #include "test_macros.h" |
| |
|
| | template<class T> |
| | struct correct_size_int |
| | { |
| | typedef typename std::conditional<sizeof(T) < sizeof(int), int, T>::type type; |
| | }; |
| |
|
| | template <class Source, class Result> |
| | void test_abs() |
| | { |
| | Source neg_val = -5; |
| | Source pos_val = 5; |
| | Result res = 5; |
| |
|
| | ASSERT_SAME_TYPE(decltype(std::abs(neg_val)), Result); |
| |
|
| | assert(std::abs(neg_val) == res); |
| | assert(std::abs(pos_val) == res); |
| | } |
| |
|
| | void test_big() |
| | { |
| | long long int big_value = std::numeric_limits<long long int>::max(); |
| | long long int negative_big_value = -big_value; |
| | assert(std::abs(negative_big_value) == big_value); |
| | } |
| |
|
| | |
| | |
| |
|
| | int main(int, char**) |
| | { |
| | |
| | |
| | typedef typename std::conditional< |
| | std::is_signed<char>::value, char, signed char |
| | >::type SignedChar; |
| |
|
| | |
| | test_abs<short int, int>(); |
| | test_abs<SignedChar, int>(); |
| | test_abs<signed char, int>(); |
| |
|
| | |
| | test_abs<int, int>(); |
| | test_abs<long int, long int>(); |
| | test_abs<long long int, long long int>(); |
| |
|
| | |
| | |
| | test_abs<std::int8_t, typename correct_size_int<std::int8_t>::type>(); |
| | test_abs<std::int16_t, typename correct_size_int<std::int16_t>::type>(); |
| | test_abs<std::int32_t, typename correct_size_int<std::int32_t>::type>(); |
| | test_abs<std::int64_t, typename correct_size_int<std::int64_t>::type>(); |
| |
|
| | test_abs<long double, long double>(); |
| | test_abs<double, double>(); |
| | test_abs<float, float>(); |
| |
|
| | test_big(); |
| |
|
| | return 0; |
| | } |
| |
|
| |
|