lean cpp library
A lean C++ library providing efficient utility classes for high-performance C++ applications.
|
00001 /*****************************************************/ 00002 /* lean built-in types (c) Tobias Zirr 2011 */ 00003 /*****************************************************/ 00004 00005 #ifndef LEAN_LIMITS 00006 #define LEAN_LIMITS 00007 00008 #include <cstddef> 00009 #include <limits> 00010 #include <cfloat> 00011 #include "cpp0x.h" 00012 00013 #ifdef DOXYGEN_READ_THIS 00014 00015 00016 #define LEAN_BUILTIN_SIZE_T 00017 #undef LEAN_BUILTIN_SIZE_T 00018 #endif 00019 00020 namespace lean 00021 { 00022 00023 namespace types 00024 { 00025 00026 namespace 00027 { 00028 00030 template <class Type> 00031 struct numeric_limits 00032 { 00033 // Always checked, therefore use static_assert with care 00034 LEAN_STATIC_ASSERT_MSG_ALT(!sizeof(Type), // = false, dependent 00035 "No numeric limits available for the given type.", 00036 No_numeric_limits_available_for_the_given_type); 00037 00039 static const bool is_int; 00041 static const bool is_float; 00043 static const bool is_unsigned; 00045 static const Type min; 00047 static const Type max; 00049 static const bool has_infinity; 00051 static const Type infinity; 00052 }; 00053 00054 namespace impl 00055 { 00056 template <class Integer> 00057 struct int_limits_base 00058 { 00059 static const bool is_int = true; 00060 static const bool is_float = false; 00061 static const bool has_infinity = false; 00062 static const Integer infinity = static_cast<Integer>(0); 00063 }; 00064 00065 template <class SInteger> 00066 struct sint_limits_base : public int_limits_base<SInteger> 00067 { 00068 static const bool is_unsigned = false; 00069 }; 00070 00071 template <class UInteger> 00072 struct uint_limits_base : public int_limits_base<UInteger> 00073 { 00074 static const bool is_unsigned = true; 00075 static const UInteger min = static_cast<UInteger>(0); 00076 }; 00077 00078 struct float_limits_base 00079 { 00080 static const bool is_int = false; 00081 static const bool is_float = true; 00082 static const bool is_unsigned = false; 00083 }; 00084 } 00085 00086 template <> 00087 struct numeric_limits<char> : public impl::sint_limits_base<char> 00088 { 00089 static const char min = CHAR_MIN; 00090 static const char max = CHAR_MAX; 00091 }; 00092 template <> 00093 struct numeric_limits<unsigned char> : public impl::uint_limits_base<unsigned char> 00094 { 00095 static const unsigned char max = UCHAR_MAX; 00096 }; 00097 00098 template <> 00099 struct numeric_limits<short> : public impl::sint_limits_base<short> 00100 { 00101 static const short min = SHRT_MIN; 00102 static const short max = SHRT_MAX; 00103 }; 00104 template <> 00105 struct numeric_limits<unsigned short> : public impl::uint_limits_base<unsigned short> 00106 { 00107 static const unsigned short max = USHRT_MAX; 00108 }; 00109 00110 template <> 00111 struct numeric_limits<int> : public impl::sint_limits_base<int> 00112 { 00113 static const int min = INT_MIN; 00114 static const int max = INT_MAX; 00115 }; 00116 template <> 00117 struct numeric_limits<unsigned int> : public impl::uint_limits_base<unsigned int> 00118 { 00119 static const unsigned int max = UINT_MAX; 00120 }; 00121 00122 template <> 00123 struct numeric_limits<long> : public impl::sint_limits_base<long> 00124 { 00125 static const long min = LONG_MIN; 00126 static const long max = LONG_MAX; 00127 }; 00128 template <> 00129 struct numeric_limits<unsigned long> : public impl::uint_limits_base<unsigned long> 00130 { 00131 static const unsigned long max = ULONG_MAX; 00132 }; 00133 00134 template <> 00135 struct numeric_limits<long long> : public impl::sint_limits_base<long long> 00136 { 00137 static const long long min = LLONG_MIN; 00138 static const long long max = LLONG_MAX; 00139 }; 00140 template <> 00141 struct numeric_limits<unsigned long long> : public impl::uint_limits_base<unsigned long long> 00142 { 00143 static const unsigned long long max = ULLONG_MAX; 00144 }; 00145 00146 #ifdef LEAN_BUILTIN_SIZE_T 00147 template <> 00148 struct numeric_limits<size_t> : public impl::uint_limits_base<size_t> 00149 { 00150 static const size_t max = SIZE_MAX; 00151 }; 00152 #endif 00153 00154 template <> 00155 struct numeric_limits<float> : public impl::float_limits_base 00156 { 00157 static const float min; 00158 static const float max; 00159 static const float has_infinity; 00160 static const float infinity; 00161 }; 00162 const float numeric_limits<float>::min = FLT_MIN; 00163 const float numeric_limits<float>::max = FLT_MAX; 00164 const float numeric_limits<float>::has_infinity = std::numeric_limits<float>::has_infinity; 00165 const float numeric_limits<float>::infinity = std::numeric_limits<float>::infinity(); 00166 00167 template <> 00168 struct numeric_limits<double> : public impl::float_limits_base 00169 { 00170 static const double min; 00171 static const double max; 00172 static const double has_infinity; 00173 static const double infinity; 00174 }; 00175 const double numeric_limits<double>::min = DBL_MIN; 00176 const double numeric_limits<double>::max = DBL_MAX; 00177 const double numeric_limits<double>::has_infinity = std::numeric_limits<double>::has_infinity; 00178 const double numeric_limits<double>::infinity = std::numeric_limits<double>::infinity(); 00179 00180 template <> 00181 struct numeric_limits<long double> : public impl::float_limits_base 00182 { 00183 static const long double min; 00184 static const long double max; 00185 static const long double has_infinity; 00186 static const long double infinity; 00187 }; 00188 const long double numeric_limits<long double>::min = LDBL_MIN; 00189 const long double numeric_limits<long double>::max = LDBL_MAX; 00190 const long double numeric_limits<long double>::has_infinity = std::numeric_limits<long double>::has_infinity; 00191 const long double numeric_limits<long double>::infinity = std::numeric_limits<long double>::infinity(); 00192 00193 } 00194 00195 } 00196 00197 using types::numeric_limits; 00198 00199 } 00200 00201 #endif