File indexing completed on 2025-01-31 10:02:38
0001
0002
0003
0004
0005
0006
0007
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)
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;
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)
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
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