478 lines
		
	
	
		
			18 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
			
		
		
	
	
			478 lines
		
	
	
		
			18 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
| 
 | |
| #pragma once
 | |
| 
 | |
| #if !defined(BAD_APPLE_OS_LIMITS_INCLUDED)
 | |
| #define BAD_APPLE_OS_LIMITS_INCLUDED
 | |
| 
 | |
| #include <cfloat>
 | |
| #include <climits>
 | |
| #include <cmath>
 | |
| #include <cstdint>
 | |
| 
 | |
| namespace std
 | |
| {
 | |
| namespace detail
 | |
| {
 | |
| inline constexpr double LOG10_2 = 0.3010299956639812;
 | |
| }
 | |
| enum float_round_style
 | |
| {
 | |
|     round_indeterminate       = -1,
 | |
|     round_toward_zero         = 0,
 | |
|     round_to_nearest          = 1,
 | |
|     round_toward_infinity     = 2,
 | |
|     round_toward_neg_infinity = 3
 | |
| };
 | |
| 
 | |
| template<typename T>
 | |
| class numeric_limits
 | |
| {
 | |
| public:
 | |
|     static constexpr bool is_specialized = false;
 | |
|     static constexpr bool is_signed = false;
 | |
|     static constexpr bool is_integer = false;
 | |
|     static constexpr bool is_exact = false;
 | |
|     static constexpr bool has_infinity = false;
 | |
|     static constexpr bool has_quiet_NaN = false;
 | |
|     static constexpr bool has_signaling_NaN = false;
 | |
|     static constexpr float_round_style round_style = round_toward_zero;
 | |
|     static constexpr bool is_iec559 = false;
 | |
|     static constexpr bool is_bounded = false;
 | |
|     static constexpr bool is_modulo = false;
 | |
|     static constexpr int digits = 0;
 | |
|     static constexpr int digits10 = 0;
 | |
|     static constexpr int max_digits10 = 0;
 | |
|     static constexpr int radix = 0;
 | |
|     static constexpr int min_exponent = 0;
 | |
|     static constexpr int min_exponent10 = 0;
 | |
|     static constexpr int max_exponent = 0;
 | |
|     static constexpr int max_exponent10 = 0;
 | |
|     static constexpr bool traps = false;
 | |
|     static constexpr bool tinyness_before = false;
 | |
| 
 | |
|     static constexpr T min() noexcept { return T(); }
 | |
|     static constexpr T lowest() noexcept { return T(); }
 | |
|     static constexpr T max() noexcept { return T(); }
 | |
|     static constexpr T epsilon() noexcept { return T(); }
 | |
|     static constexpr T round_error() noexcept { return T(); }
 | |
|     static constexpr T infinity() noexcept { return T(); }
 | |
|     static constexpr T quiet_NaN() noexcept { return T(); }
 | |
|     static constexpr T signaling_NaN() noexcept { return T(); }
 | |
|     static constexpr T denorm_min() noexcept { return T(); }
 | |
| };
 | |
| 
 | |
| template<>
 | |
| class numeric_limits<bool>
 | |
| {
 | |
| public:
 | |
|     static constexpr bool is_specialized = true;
 | |
|     static constexpr bool is_integer = true;
 | |
|     static constexpr bool is_exact = true;
 | |
|     static constexpr bool is_bounded = true;
 | |
|     static constexpr int digits = 1;
 | |
|     static constexpr int radix = 2;
 | |
| 
 | |
|     static constexpr bool min() noexcept { return false; }
 | |
|     static constexpr bool lowest() noexcept { return false; }
 | |
|     static constexpr bool max() noexcept { return true; }
 | |
| };
 | |
| 
 | |
| template<>
 | |
| class numeric_limits<char>
 | |
| {
 | |
| public:
 | |
|     static constexpr bool is_specialized = true;
 | |
|     static constexpr bool is_signed = (CHAR_MIN < 0);
 | |
|     static constexpr bool is_integer = true;
 | |
|     static constexpr bool is_exact = true;
 | |
|     static constexpr bool is_bounded = true;
 | |
|     static constexpr bool is_modulo = true;
 | |
|     static constexpr int digits = (CHAR_BIT - is_signed);
 | |
|     static constexpr int digits10 = static_cast<int>(digits * detail::LOG10_2);
 | |
|     static constexpr int radix = 2;
 | |
|     static constexpr bool traps = true;
 | |
| 
 | |
|     static constexpr char min() noexcept { return CHAR_MIN; }
 | |
|     static constexpr char lowest() noexcept { return CHAR_MIN; }
 | |
|     static constexpr char max() noexcept { return CHAR_MAX; }
 | |
| };
 | |
| 
 | |
| template<>
 | |
| class numeric_limits<signed char>
 | |
| {
 | |
| public:
 | |
|     static constexpr bool is_specialized = true;
 | |
|     static constexpr bool is_signed = true;
 | |
|     static constexpr bool is_integer = true;
 | |
|     static constexpr bool is_exact = true;
 | |
|     static constexpr bool is_bounded = true;
 | |
|     static constexpr bool is_modulo = true;
 | |
|     static constexpr int digits = (CHAR_BIT - 1);
 | |
|     static constexpr int digits10 = static_cast<int>(digits * detail::LOG10_2);
 | |
|     static constexpr int radix = 2;
 | |
|     static constexpr bool traps = true;
 | |
| 
 | |
|     static constexpr signed char min() noexcept { return SCHAR_MIN; }
 | |
|     static constexpr signed char lowest() noexcept { return SCHAR_MIN; }
 | |
|     static constexpr signed char max() noexcept { return SCHAR_MAX; }
 | |
| };
 | |
| 
 | |
| template<>
 | |
| class numeric_limits<unsigned char>
 | |
| {
 | |
| public:
 | |
|     static constexpr bool is_specialized = true;
 | |
|     static constexpr bool is_signed = false;
 | |
|     static constexpr bool is_integer = true;
 | |
|     static constexpr bool is_exact = true;
 | |
|     static constexpr bool is_bounded = true;
 | |
|     static constexpr bool is_modulo = true;
 | |
|     static constexpr int digits = CHAR_BIT;
 | |
|     static constexpr int digits10 = static_cast<int>(digits * detail::LOG10_2);
 | |
|     static constexpr int radix = 2;
 | |
|     static constexpr bool traps = true;
 | |
| 
 | |
|     static constexpr unsigned char min() noexcept { return 0; }
 | |
|     static constexpr unsigned char lowest() noexcept { return 0; }
 | |
|     static constexpr unsigned char max() noexcept { return UCHAR_MAX; }
 | |
| };
 | |
| 
 | |
| template<>
 | |
| class numeric_limits<wchar_t>
 | |
| {
 | |
| public:
 | |
|     static constexpr bool is_specialized = true;
 | |
|     static constexpr bool is_signed = (WCHAR_MIN < 0);
 | |
|     static constexpr bool is_integer = true;
 | |
|     static constexpr bool is_exact = true;
 | |
|     static constexpr bool is_bounded = true;
 | |
|     static constexpr bool is_modulo = true;
 | |
|     static constexpr int digits = CHAR_BIT * sizeof(wchar_t) - is_signed;
 | |
|     static constexpr int digits10 = static_cast<int>(digits * detail::LOG10_2);
 | |
|     static constexpr int radix = 2;
 | |
|     static constexpr bool traps = true;
 | |
| 
 | |
|     static constexpr wchar_t min() noexcept { return WCHAR_MIN; }
 | |
|     static constexpr wchar_t lowest() noexcept { return WCHAR_MIN; }
 | |
|     static constexpr wchar_t max() noexcept { return WCHAR_MAX; }
 | |
| };
 | |
| 
 | |
| template<>
 | |
| class numeric_limits<char8_t>
 | |
| {
 | |
| public:
 | |
|     static constexpr bool is_specialized = true;
 | |
|     static constexpr bool is_signed = false;
 | |
|     static constexpr bool is_integer = true;
 | |
|     static constexpr bool is_exact = true;
 | |
|     static constexpr bool is_bounded = true;
 | |
|     static constexpr bool is_modulo = true;
 | |
|     static constexpr int digits = CHAR_BIT;
 | |
|     static constexpr int digits10 = static_cast<int>(digits * detail::LOG10_2);
 | |
|     static constexpr int radix = 2;
 | |
|     static constexpr bool traps = true;
 | |
| 
 | |
|     static constexpr char8_t min() noexcept { return 0; }
 | |
|     static constexpr char8_t lowest() noexcept { return 0; }
 | |
|     static constexpr char8_t max() noexcept { return UCHAR_MAX; }
 | |
| };
 | |
| 
 | |
| template<>
 | |
| class numeric_limits<char16_t>
 | |
| {
 | |
| public:
 | |
|     static constexpr bool is_specialized = true;
 | |
|     static constexpr bool is_signed = false;
 | |
|     static constexpr bool is_integer = true;
 | |
|     static constexpr bool is_exact = true;
 | |
|     static constexpr bool is_bounded = true;
 | |
|     static constexpr bool is_modulo = true;
 | |
|     static constexpr int digits = CHAR_BIT * sizeof(char16_t);
 | |
|     static constexpr int digits10 = static_cast<int>(digits * detail::LOG10_2);
 | |
|     static constexpr int radix = 2;
 | |
|     static constexpr bool traps = true;
 | |
| 
 | |
|     static constexpr char16_t min() noexcept { return 0; }
 | |
|     static constexpr char16_t lowest() noexcept { return 0; }
 | |
|     static constexpr char16_t max() noexcept { return UINT_LEAST16_MAX; }
 | |
| };
 | |
| 
 | |
| template<>
 | |
| class numeric_limits<char32_t>
 | |
| {
 | |
| public:
 | |
|     static constexpr bool is_specialized = true;
 | |
|     static constexpr bool is_signed = false;
 | |
|     static constexpr bool is_integer = true;
 | |
|     static constexpr bool is_exact = true;
 | |
|     static constexpr bool is_bounded = true;
 | |
|     static constexpr bool is_modulo = true;
 | |
|     static constexpr int digits = CHAR_BIT * sizeof(char32_t);
 | |
|     static constexpr int digits10 = static_cast<int>(digits * detail::LOG10_2);
 | |
|     static constexpr int radix = 2;
 | |
|     static constexpr bool traps = true;
 | |
| 
 | |
|     static constexpr char32_t min() noexcept { return 0; }
 | |
|     static constexpr char32_t lowest() noexcept { return 0; }
 | |
|     static constexpr char32_t max() noexcept { return UINT_LEAST32_MAX; }
 | |
| };
 | |
| 
 | |
| template<>
 | |
| class numeric_limits<short>
 | |
| {
 | |
| public:
 | |
|     static constexpr bool is_specialized = true;
 | |
|     static constexpr bool is_signed = true;
 | |
|     static constexpr bool is_integer = true;
 | |
|     static constexpr bool is_exact = true;
 | |
|     static constexpr bool is_bounded = true;
 | |
|     static constexpr bool is_modulo = true;
 | |
|     static constexpr int digits = CHAR_BIT * sizeof(short) - 1;
 | |
|     static constexpr int digits10 = static_cast<int>(digits * detail::LOG10_2);
 | |
|     static constexpr int radix = 2;
 | |
|     static constexpr bool traps = true;
 | |
| 
 | |
|     static constexpr short min() noexcept { return SHRT_MIN; }
 | |
|     static constexpr short lowest() noexcept { return SHRT_MIN; }
 | |
|     static constexpr short max() noexcept { return SHRT_MAX; }
 | |
| };
 | |
| 
 | |
| template<>
 | |
| class numeric_limits<unsigned short>
 | |
| {
 | |
| public:
 | |
|     static constexpr bool is_specialized = true;
 | |
|     static constexpr bool is_signed = false;
 | |
|     static constexpr bool is_integer = true;
 | |
|     static constexpr bool is_exact = true;
 | |
|     static constexpr bool is_bounded = true;
 | |
|     static constexpr bool is_modulo = true;
 | |
|     static constexpr int digits = CHAR_BIT * sizeof(short);
 | |
|     static constexpr int digits10 = static_cast<int>(digits * detail::LOG10_2);
 | |
|     static constexpr int radix = 2;
 | |
|     static constexpr bool traps = true;
 | |
| 
 | |
|     static constexpr unsigned short min() noexcept { return 0; }
 | |
|     static constexpr unsigned short lowest() noexcept { return 0; }
 | |
|     static constexpr unsigned short max() noexcept { return USHRT_MAX; }
 | |
| };
 | |
| 
 | |
| template<>
 | |
| class numeric_limits<int>
 | |
| {
 | |
| public:
 | |
|     static constexpr bool is_specialized = true;
 | |
|     static constexpr bool is_signed = true;
 | |
|     static constexpr bool is_integer = true;
 | |
|     static constexpr bool is_exact = true;
 | |
|     static constexpr bool is_bounded = true;
 | |
|     static constexpr bool is_modulo = true;
 | |
|     static constexpr int digits = CHAR_BIT * sizeof(int) - 1;
 | |
|     static constexpr int digits10 = static_cast<int>(digits * detail::LOG10_2);
 | |
|     static constexpr int radix = 2;
 | |
|     static constexpr bool traps = true;
 | |
| 
 | |
|     static constexpr int min() noexcept { return INT_MIN; }
 | |
|     static constexpr int lowest() noexcept { return INT_MIN; }
 | |
|     static constexpr int max() noexcept { return INT_MAX; }
 | |
| };
 | |
| 
 | |
| template<>
 | |
| class numeric_limits<unsigned int>
 | |
| {
 | |
| public:
 | |
|     static constexpr bool is_specialized = true;
 | |
|     static constexpr bool is_signed = false;
 | |
|     static constexpr bool is_integer = true;
 | |
|     static constexpr bool is_exact = true;
 | |
|     static constexpr bool is_bounded = true;
 | |
|     static constexpr bool is_modulo = true;
 | |
|     static constexpr int digits = CHAR_BIT * sizeof(int);
 | |
|     static constexpr int digits10 = static_cast<int>(digits * detail::LOG10_2);
 | |
|     static constexpr int radix = 2;
 | |
|     static constexpr bool traps = true;
 | |
| 
 | |
|     static constexpr unsigned int min() noexcept { return 0; }
 | |
|     static constexpr unsigned int lowest() noexcept { return 0; }
 | |
|     static constexpr unsigned int max() noexcept { return UINT_MAX; }
 | |
| };
 | |
| 
 | |
| template<>
 | |
| class numeric_limits<long>
 | |
| {
 | |
| public:
 | |
|     static constexpr bool is_specialized = true;
 | |
|     static constexpr bool is_signed = true;
 | |
|     static constexpr bool is_integer = true;
 | |
|     static constexpr bool is_exact = true;
 | |
|     static constexpr bool is_bounded = true;
 | |
|     static constexpr bool is_modulo = true;
 | |
|     static constexpr int digits = CHAR_BIT * sizeof(long) - 1;
 | |
|     static constexpr int digits10 = static_cast<int>(digits * detail::LOG10_2);
 | |
|     static constexpr int radix = 2;
 | |
|     static constexpr bool traps = true;
 | |
| 
 | |
|     static constexpr long min() noexcept { return LONG_MIN; }
 | |
|     static constexpr long lowest() noexcept { return LONG_MIN; }
 | |
|     static constexpr long max() noexcept { return LONG_MAX; }
 | |
| };
 | |
| 
 | |
| template<>
 | |
| class numeric_limits<unsigned long>
 | |
| {
 | |
| public:
 | |
|     static constexpr bool is_specialized = true;
 | |
|     static constexpr bool is_signed = false;
 | |
|     static constexpr bool is_integer = true;
 | |
|     static constexpr bool is_exact = true;
 | |
|     static constexpr bool is_bounded = true;
 | |
|     static constexpr bool is_modulo = true;
 | |
|     static constexpr int digits = CHAR_BIT * sizeof(long);
 | |
|     static constexpr int digits10 = static_cast<int>(digits * detail::LOG10_2);
 | |
|     static constexpr int radix = 2;
 | |
|     static constexpr bool traps = true;
 | |
| 
 | |
|     static constexpr unsigned long min() noexcept { return 0; }
 | |
|     static constexpr unsigned long lowest() noexcept { return 0; }
 | |
|     static constexpr unsigned long max() noexcept { return ULONG_MAX; }
 | |
| };
 | |
| 
 | |
| template<>
 | |
| class numeric_limits<long long>
 | |
| {
 | |
| public:
 | |
|     static constexpr bool is_specialized = true;
 | |
|     static constexpr bool is_signed = true;
 | |
|     static constexpr bool is_integer = true;
 | |
|     static constexpr bool is_exact = true;
 | |
|     static constexpr bool is_bounded = true;
 | |
|     static constexpr bool is_modulo = true;
 | |
|     static constexpr int digits = CHAR_BIT * sizeof(long long) - 1;
 | |
|     static constexpr int digits10 = static_cast<int>(digits * detail::LOG10_2);
 | |
|     static constexpr int radix = 2;
 | |
|     static constexpr bool traps = true;
 | |
| 
 | |
|     static constexpr long long min() noexcept { return LLONG_MIN; }
 | |
|     static constexpr long long lowest() noexcept { return LLONG_MIN; }
 | |
|     static constexpr long long max() noexcept { return LLONG_MAX; }
 | |
| };
 | |
| 
 | |
| template<>
 | |
| class numeric_limits<unsigned long long>
 | |
| {
 | |
| public:
 | |
|     static constexpr bool is_specialized = true;
 | |
|     static constexpr bool is_signed = false;
 | |
|     static constexpr bool is_integer = true;
 | |
|     static constexpr bool is_exact = true;
 | |
|     static constexpr bool is_bounded = true;
 | |
|     static constexpr bool is_modulo = true;
 | |
|     static constexpr int digits = CHAR_BIT * sizeof(long long);
 | |
|     static constexpr int digits10 = static_cast<int>(digits * detail::LOG10_2);
 | |
|     static constexpr int radix = 2;
 | |
|     static constexpr bool traps = true;
 | |
| 
 | |
|     static constexpr unsigned long long min() noexcept { return 0; }
 | |
|     static constexpr unsigned long long lowest() noexcept { return 0; }
 | |
|     static constexpr unsigned long long max() noexcept { return ULLONG_MAX; }
 | |
| };
 | |
| 
 | |
| template<>
 | |
| class numeric_limits<float>
 | |
| {
 | |
| public:
 | |
|     static constexpr bool is_specialized = true;
 | |
|     static constexpr bool is_signed = true;
 | |
|     static constexpr bool has_infinity = true;
 | |
|     static constexpr bool has_quiet_NaN = true;
 | |
|     static constexpr bool has_signaling_NaN = true;
 | |
|     static constexpr float_round_style round_style = round_to_nearest;
 | |
|     static constexpr bool is_iec559 = true;
 | |
|     static constexpr bool is_bounded = true;
 | |
|     static constexpr int digits = FLT_MANT_DIG;
 | |
|     static constexpr int digits10 = FLT_DIG;
 | |
|     static constexpr int max_digits10 = FLT_DECIMAL_DIG;
 | |
|     static constexpr int radix = FLT_RADIX;
 | |
|     static constexpr int min_exponent = FLT_MIN_EXP;
 | |
|     static constexpr int min_exponent10 = FLT_MIN_10_EXP;
 | |
|     static constexpr int max_exponent = FLT_MAX_EXP;
 | |
|     static constexpr int max_exponent10 = FLT_MAX_10_EXP;
 | |
| 
 | |
|     static constexpr float min() noexcept { return FLT_MIN; }
 | |
|     static constexpr float lowest() noexcept { return -FLT_MAX; }
 | |
|     static constexpr float max() noexcept { return FLT_MAX; }
 | |
|     static constexpr float epsilon() noexcept { return FLT_EPSILON; }
 | |
|     static constexpr float round_error() noexcept { return 0.5f; }
 | |
|     static constexpr float infinity() noexcept { return HUGE_VALF; }
 | |
|     static constexpr float quiet_NaN() noexcept { return FLT_QNAN; }
 | |
|     static constexpr float signaling_NaN() noexcept { return FLT_SNAN; }
 | |
|     static constexpr float denorm_min() noexcept { return FLT_TRUE_MIN; }
 | |
| };
 | |
| 
 | |
| template<>
 | |
| class numeric_limits<double>
 | |
| {
 | |
| public:
 | |
|     static constexpr bool is_specialized = true;
 | |
|     static constexpr bool is_signed = true;
 | |
|     static constexpr bool has_infinity = true;
 | |
|     static constexpr bool has_quiet_NaN = true;
 | |
|     static constexpr bool has_signaling_NaN = true;
 | |
|     static constexpr float_round_style round_style = round_to_nearest;
 | |
|     static constexpr bool is_iec559 = true;
 | |
|     static constexpr bool is_bounded = true;
 | |
|     static constexpr int digits = DBL_MANT_DIG;
 | |
|     static constexpr int digits10 = DBL_DIG;
 | |
|     static constexpr int max_digits10 = DBL_DECIMAL_DIG;
 | |
|     static constexpr int radix = FLT_RADIX;
 | |
|     static constexpr int min_exponent = DBL_MIN_EXP;
 | |
|     static constexpr int min_exponent10 = DBL_MIN_10_EXP;
 | |
|     static constexpr int max_exponent = DBL_MAX_EXP;
 | |
|     static constexpr int max_exponent10 = DBL_MAX_10_EXP;
 | |
| 
 | |
|     static constexpr double min() noexcept { return DBL_MIN; }
 | |
|     static constexpr double lowest() noexcept { return -DBL_MAX; }
 | |
|     static constexpr double max() noexcept { return DBL_MAX; }
 | |
|     static constexpr double epsilon() noexcept { return DBL_EPSILON; }
 | |
|     static constexpr double round_error() noexcept { return 0.5; }
 | |
|     static constexpr double infinity() noexcept { return HUGE_VAL; }
 | |
|     static constexpr double quiet_NaN() noexcept { return DBL_QNAN; }
 | |
|     static constexpr double signaling_NaN() noexcept { return DBL_SNAN; }
 | |
|     static constexpr double denorm_min() noexcept { return DBL_TRUE_MIN; }
 | |
| };
 | |
| 
 | |
| template<>
 | |
| class numeric_limits<long double>
 | |
| {
 | |
| public:
 | |
|     static constexpr bool is_specialized = true;
 | |
|     static constexpr bool is_signed = true;
 | |
|     static constexpr bool has_infinity = true;
 | |
|     static constexpr bool has_quiet_NaN = true;
 | |
|     static constexpr bool has_signaling_NaN = true;
 | |
|     static constexpr float_round_style round_style = round_to_nearest;
 | |
|     static constexpr bool is_iec559 = true;
 | |
|     static constexpr bool is_bounded = true;
 | |
|     static constexpr int digits = LDBL_MANT_DIG;
 | |
|     static constexpr int digits10 = LDBL_DIG;
 | |
|     static constexpr int max_digits10 = LDBL_DECIMAL_DIG;
 | |
|     static constexpr int radix = FLT_RADIX;
 | |
|     static constexpr int min_exponent = LDBL_MIN_EXP;
 | |
|     static constexpr int min_exponent10 = LDBL_MIN_10_EXP;
 | |
|     static constexpr int max_exponent = LDBL_MAX_EXP;
 | |
|     static constexpr int max_exponent10 = LDBL_MAX_10_EXP;
 | |
| 
 | |
|     static constexpr long double min() noexcept { return LDBL_MIN; }
 | |
|     static constexpr long double lowest() noexcept { return -LDBL_MAX; }
 | |
|     static constexpr long double max() noexcept { return LDBL_MAX; }
 | |
|     static constexpr long double epsilon() noexcept { return LDBL_EPSILON; }
 | |
|     static constexpr long double round_error() noexcept { return 0.5l; }
 | |
|     static constexpr long double infinity() noexcept { return HUGE_VALL; }
 | |
|     static constexpr long double quiet_NaN() noexcept { return LDBL_QNAN; }
 | |
|     static constexpr long double signaling_NaN() noexcept { return LDBL_SNAN; }
 | |
|     static constexpr long double denorm_min() noexcept { return LDBL_TRUE_MIN; }
 | |
| };
 | |
| }
 | |
| 
 | |
| #endif // !defined(BAD_APPLE_OS_LIMITS_INCLUDED)
 |