Back to home page

EIC code displayed by LXR

 
 

    


File indexing completed on 2025-01-19 09:47:51

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