00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017 #ifndef VCSN_MISC_LIMITS_HH
00018 # define VCSN_MISC_LIMITS_HH
00019
00030 # include <vaucanson/config/math.hh>
00031
00032 # ifdef USE_C_LIMITS
00033 # include <climits>
00034 # else
00035 # include <limits>
00036 # endif
00037
00038 namespace vcsn
00039 {
00040 namespace misc
00041 {
00042 template<typename T>
00043 struct limits
00044 # ifndef USE_C_LIMITS
00045 : std::numeric_limits<T>
00046 { };
00047 # else
00048 {
00049 static const bool is_specialized = false;
00050 };
00051
00052 template<>
00053 struct limits<bool>
00054 {
00055 static const int digits = sizeof (bool)*8;
00056 static const int digits10 = 1;
00057 static const bool is_specialized = true;
00058 static bool min () throw () { return false; }
00059 static bool max () throw () { return false; }
00060 static const bool has_infinity = false;
00061 static bool infinity () throw () { return false; }
00062 static const bool has_quiet_NaN = false;
00063 static bool quiet_NaN () throw ()
00064 { return static_cast<bool> (0); }
00065 static const bool is_signed = false;
00066 static const bool is_integer = true;
00067 static const bool is_exact = true;
00068 static const int radix = 2;
00069 static const bool is_iec559 = true;
00070 static const bool is_bounded = true;
00071 static const bool is_modulo = true;
00072 };
00073
00074 template<>
00075 struct limits<signed char>
00076 {
00077 static const int digits = sizeof (signed char)*8 - 1;
00078 static const int digits10 = 3;
00079 static const bool is_specialized = true;
00080 static signed char min () throw () { return SCHAR_MIN; }
00081 static signed char max () throw () { return SCHAR_MAX; }
00082 static const bool is_signed = true;
00083 static const bool is_integer = true;
00084 static const bool is_exact = true;
00085 static const int radix = 2;
00086 static const bool has_infinity = false;
00087 static signed char infinity () throw ()
00088 { return static_cast<signed char> (0); }
00089 static const bool has_quiet_NaN = false;
00090 static signed char quiet_NaN () throw ()
00091 { return static_cast<signed char> (0); }
00092 static const bool is_iec559 = false;
00093 static const bool is_bounded = true;
00094 static const bool is_modulo = false;
00095 };
00096
00097 template<>
00098 struct limits<unsigned char>
00099 {
00100 static const int digits = sizeof (unsigned char)*8;
00101 static const int digits10 = 3;
00102 static const bool is_specialized = true;
00103 static unsigned char min () throw () { return 0; }
00104 static unsigned char max () throw () { return UCHAR_MAX; }
00105 static const bool is_signed = false;
00106 static const bool is_integer = true;
00107 static const bool is_exact = true;
00108 static const int radix = 2;
00109 static const bool has_infinity = false;
00110 static unsigned char infinity () throw ()
00111 { return static_cast<unsigned char> (0); }
00112 static const bool has_quiet_NaN = false;
00113 static unsigned char quiet_NaN () throw ()
00114 { return static_cast<unsigned char> (0); }
00115 static const bool is_iec559 = false;
00116 static const bool is_bounded = true;
00117 static const bool is_modulo = true;
00118 };
00119
00120 template<>
00121 struct limits<int>
00122 {
00123 static const int digits = sizeof (int)*8 - 1;
00124 static const int digits10 = 19;
00125 static const bool is_specialized = true;
00126 static int min () throw () { return INT_MIN; }
00127 static int max () throw () { return INT_MAX; }
00128 static const bool is_signed = true;
00129 static const bool is_integer = true;
00130 static const bool is_exact = true;
00131 static const int radix = 2;
00132 static const bool has_infinity = false;
00133 static int infinity () throw ()
00134 { return static_cast<int> (0); }
00135 static const bool has_quiet_NaN = false;
00136 static int quiet_NaN () throw ()
00137 { return static_cast<int> (0); }
00138 static const bool is_iec559 = true;
00139 static const bool is_bounded = true;
00140 static const bool is_modulo = false;
00141 };
00142
00143 template<>
00144 struct limits<unsigned int>
00145 {
00146 static const int digits = sizeof (unsigned int)*8;
00147 static const int digits10 = 19;
00148 static const bool is_specialized = true;
00149 static unsigned int min () throw () { return 0; }
00150 static unsigned int max () throw () { return UINT_MAX; }
00151 static const bool is_signed = false;
00152 static const bool is_integer = true;
00153 static const bool is_exact = true;
00154 static const int radix = 2;
00155 static const bool has_infinity = false;
00156 static unsigned int infinity () throw ()
00157 { return static_cast<unsigned int> (0); }
00158 static const bool has_quiet_NaN = false;
00159 static unsigned int quiet_NaN () throw ()
00160 { return static_cast<unsigned int> (0); }
00161 static const bool is_iec559 = true;
00162 static const bool is_bounded = true;
00163 static const bool is_modulo = true;
00164 };
00165
00166 template<>
00167 struct limits<float>
00168 {
00169 static const int digits = sizeof (float)*8;
00170 static const int digits10 = 33;
00171 static const bool is_specialized = true;
00172 static float min () throw () { return -HUGE_VAL; }
00173 static float max () throw () { return HUGE_VAL; }
00174 static const bool is_signed = true;
00175 static const bool is_integer = false;
00176 static const bool is_exact = false;
00177 static const int radix = 2;
00178 static const bool has_infinity = true;
00179 static float infinity () throw ()
00180 { return HUGE_VAL; }
00181 static const bool has_quiet_NaN = true;
00182 static float quiet_NaN () throw ()
00183 { return NAN; }
00184 static const bool is_iec559 = false;
00185 static const bool is_bounded = false;
00186 static const bool is_modulo = false;
00187 };
00188
00189 template<>
00190 struct limits<double>
00191 {
00192 static const int digits = sizeof (float)*8;
00193 static const int digits10 = 33;
00194 static const bool is_specialized = true;
00195 static float min () throw () { return -HUGE_VAL; }
00196 static float max () throw () { return HUGE_VAL; }
00197 static const bool is_signed = true;
00198 static const bool is_integer = false;
00199 static const bool is_exact = false;
00200 static const int radix = 2;
00201 static const bool has_infinity = true;
00202 static float infinity () throw ()
00203 { return HUGE_VAL; }
00204 static const bool has_quiet_NaN = true;
00205 static float quiet_NaN () throw ()
00206 { return NAN; }
00207 static const bool is_iec559 = false;
00208 static const bool is_bounded = false;
00209 static const bool is_modulo = false;
00210 };
00211
00212 # endif
00213
00214 }
00215 }
00216
00217
00218 #endif // ! VCSN_MISC_LIMITS_HH