lean cpp library
A lean C++ library providing efficient utility classes for high-performance C++ applications.
limits.h
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