Back to home page

EIC code displayed by LXR

 
 

    


File indexing completed on 2025-01-31 10:02:38

0001 /*=============================================================================
0002     Copyright (c) 2001-2014 Joel de Guzman
0003     Copyright (c) 2001-2011 Hartmut Kaiser
0004     http://spirit.sourceforge.net/
0005 
0006     Distributed under the Boost Software License, Version 1.0. (See accompanying
0007     file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
0008 =============================================================================*/
0009 #if !defined(BOOST_SPIRIT_X3_POW10_DECEMBER_26_2008_1118AM)
0010 #define BOOST_SPIRIT_X3_POW10_DECEMBER_26_2008_1118AM
0011 
0012 #include <boost/config/no_tr1/cmath.hpp>
0013 #include <boost/limits.hpp>
0014 #include <boost/spirit/home/x3/support/unused.hpp>
0015 #include <boost/spirit/home/x3/support/traits/numeric_traits.hpp>
0016 #include <cfloat>
0017 
0018 #if BOOST_WORKAROUND(BOOST_MSVC, >= 1400)
0019 # pragma warning(push)
0020 # pragma warning(disable: 4244)   // conversion from 'double' to 'float', possible loss of data
0021 #endif
0022 
0023 namespace boost { namespace spirit { namespace x3 { namespace traits
0024 {
0025     namespace detail
0026     {
0027         template <typename T, typename Enable = void>
0028         struct pow10_helper
0029         {
0030             static T call(unsigned dim)
0031             {
0032                 using namespace std;    // allow for ADL to find the correct overload
0033                 return pow(T(10), T(dim));
0034             }
0035         };
0036 
0037         template <>
0038         struct pow10_helper<unused_type>
0039         {
0040             static unused_type call(unused_type)
0041             {
0042                 return unused;
0043             }
0044         };
0045 
0046 #if (DBL_MAX_10_EXP == 308) // for IEEE-754
0047         template <>
0048         struct pow10_helper<double>
0049         {
0050             static double call(unsigned dim)
0051             {
0052                 static double const exponents[] =
0053                 {
0054                     1e0,   1e1,   1e2,   1e3,   1e4,   1e5,   1e6,   1e7,   1e8,    1e9,
0055                     1e10,  1e11,  1e12,  1e13,  1e14,  1e15,  1e16,  1e17,  1e18,  1e19,
0056                     1e20,  1e21,  1e22,  1e23,  1e24,  1e25,  1e26,  1e27,  1e28,  1e29,
0057                     1e30,  1e31,  1e32,  1e33,  1e34,  1e35,  1e36,  1e37,  1e38,  1e39,
0058                     1e40,  1e41,  1e42,  1e43,  1e44,  1e45,  1e46,  1e47,  1e48,  1e49,
0059                     1e50,  1e51,  1e52,  1e53,  1e54,  1e55,  1e56,  1e57,  1e58,  1e59,
0060                     1e60,  1e61,  1e62,  1e63,  1e64,  1e65,  1e66,  1e67,  1e68,  1e69,
0061                     1e70,  1e71,  1e72,  1e73,  1e74,  1e75,  1e76,  1e77,  1e78,  1e79,
0062                     1e80,  1e81,  1e82,  1e83,  1e84,  1e85,  1e86,  1e87,  1e88,  1e89,
0063                     1e90,  1e91,  1e92,  1e93,  1e94,  1e95,  1e96,  1e97,  1e98,  1e99,
0064                     1e100, 1e101, 1e102, 1e103, 1e104, 1e105, 1e106, 1e107, 1e108, 1e109,
0065                     1e110, 1e111, 1e112, 1e113, 1e114, 1e115, 1e116, 1e117, 1e118, 1e119,
0066                     1e120, 1e121, 1e122, 1e123, 1e124, 1e125, 1e126, 1e127, 1e128, 1e129,
0067                     1e130, 1e131, 1e132, 1e133, 1e134, 1e135, 1e136, 1e137, 1e138, 1e139,
0068                     1e140, 1e141, 1e142, 1e143, 1e144, 1e145, 1e146, 1e147, 1e148, 1e149,
0069                     1e150, 1e151, 1e152, 1e153, 1e154, 1e155, 1e156, 1e157, 1e158, 1e159,
0070                     1e160, 1e161, 1e162, 1e163, 1e164, 1e165, 1e166, 1e167, 1e168, 1e169,
0071                     1e170, 1e171, 1e172, 1e173, 1e174, 1e175, 1e176, 1e177, 1e178, 1e179,
0072                     1e180, 1e181, 1e182, 1e183, 1e184, 1e185, 1e186, 1e187, 1e188, 1e189,
0073                     1e190, 1e191, 1e192, 1e193, 1e194, 1e195, 1e196, 1e197, 1e198, 1e199,
0074                     1e200, 1e201, 1e202, 1e203, 1e204, 1e205, 1e206, 1e207, 1e208, 1e209,
0075                     1e210, 1e211, 1e212, 1e213, 1e214, 1e215, 1e216, 1e217, 1e218, 1e219,
0076                     1e220, 1e221, 1e222, 1e223, 1e224, 1e225, 1e226, 1e227, 1e228, 1e229,
0077                     1e230, 1e231, 1e232, 1e233, 1e234, 1e235, 1e236, 1e237, 1e238, 1e239,
0078                     1e240, 1e241, 1e242, 1e243, 1e244, 1e245, 1e246, 1e247, 1e248, 1e249,
0079                     1e250, 1e251, 1e252, 1e253, 1e254, 1e255, 1e256, 1e257, 1e258, 1e259,
0080                     1e260, 1e261, 1e262, 1e263, 1e264, 1e265, 1e266, 1e267, 1e268, 1e269,
0081                     1e270, 1e271, 1e272, 1e273, 1e274, 1e275, 1e276, 1e277, 1e278, 1e279,
0082                     1e280, 1e281, 1e282, 1e283, 1e284, 1e285, 1e286, 1e287, 1e288, 1e289,
0083                     1e290, 1e291, 1e292, 1e293, 1e294, 1e295, 1e296, 1e297, 1e298, 1e299,
0084                     1e300, 1e301, 1e302, 1e303, 1e304, 1e305, 1e306, 1e307, 1e308,
0085                 };
0086                 BOOST_ASSERT(dim < sizeof(exponents)/sizeof(double));
0087                 return exponents[dim];
0088             }
0089         };
0090 
0091         template <>
0092         struct pow10_helper<float>
0093         {
0094             static float call(unsigned dim)
0095             {
0096                 return pow10_helper<double>::call(dim);
0097             }
0098         };
0099 #endif // for IEEE-754
0100     }
0101 
0102     template <typename T>
0103     inline T pow10(unsigned dim)
0104     {
0105         return detail::pow10_helper<T>::call(dim);
0106     }
0107 }}}}
0108 
0109 #if BOOST_WORKAROUND(BOOST_MSVC, >= 1400)
0110 # pragma warning(pop)
0111 #endif
0112 
0113 #endif