Vaucanson 1.4
limits.hh
Go to the documentation of this file.
00001 // limits.hh: this file is part of the Vaucanson project.
00002 //
00003 // Vaucanson, a generic library for finite state machines.
00004 //
00005 // Copyright (C) 2001, 2002, 2003, 2004, 2005, 2006 The Vaucanson Group.
00006 //
00007 // This program is free software; you can redistribute it and/or
00008 // modify it under the terms of the GNU General Public License
00009 // as published by the Free Software Foundation; either version 2
00010 // of the License, or (at your option) any later version.
00011 //
00012 // The complete GNU General Public Licence Notice can be found as the
00013 // `COPYING' file in the root directory.
00014 //
00015 // The Vaucanson Group consists of people listed in the `AUTHORS' file.
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   } // end of namespace misc.
00215 } // end of namespace vcsn.
00216 
00217 
00218 #endif // ! VCSN_MISC_LIMITS_HH