File indexing completed on 2025-01-19 09:47:51
0001
0002
0003
0004
0005
0006
0007
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)
0025 #endif
0026
0027 namespace boost { namespace spirit { namespace traits
0028 {
0029 template <typename T, typename Enable>
0030 struct pow10_helper
0031 {
0032 static T call(unsigned dim)
0033 {
0034 using namespace std;
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)
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
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