1 // 2 //! Copyright (c) 2011-2012 3 //! Brandon Kohn 4 // 5 // Distributed under the Boost Software License, Version 1.0. (See 6 // accompanying file LICENSE_1_0.txt or copy at 7 // http://www.boost.org/LICENSE_1_0.txt) 8 // 9 10 #if !defined(BOOST_NUMERIC_CONVERSION_DONT_USE_PREPROCESSED_FILES) 11 12 #include <boost/numeric/conversion/detail/preprocessed/numeric_cast_traits_common.hpp> 13 14 #if !defined(BOOST_NO_LONG_LONG) 15 #include <boost/numeric/conversion/detail/preprocessed/numeric_cast_traits_long_long.hpp> 16 #endif 17 18 #else 19 #if !BOOST_PP_IS_ITERATING 20 21 #include <boost/preprocessor/seq/elem.hpp> 22 #include <boost/preprocessor/seq/size.hpp> 23 #include <boost/preprocessor/iteration/iterate.hpp> 24 25 #if defined(__WAVE__) && defined(BOOST_NUMERIC_CONVERSION_CREATE_PREPROCESSED_FILES) 26 #pragma wave option(preserve: 2, line: 0, output: "preprocessed/numeric_cast_traits_common.hpp") 27 #endif 28 // 29 //! Copyright (c) 2011-2012 30 //! Brandon Kohn 31 // 32 // Distributed under the Boost Software License, Version 1.0. (See 33 // accompanying file LICENSE_1_0.txt or copy at 34 // http://www.boost.org/LICENSE_1_0.txt) 35 // 36 #if defined(__WAVE__) && defined(BOOST_NUMERIC_CONVERSION_CREATE_PREPROCESSED_FILES) 37 #pragma wave option(preserve: 1) 38 #endif 39 40 //! These are the assumed common built in fundamental types (not typedefs/macros.) 41 #define BOOST_NUMERIC_CONVERSION_BASE_BUILTIN_TYPES() \ 42 (char) \ 43 (signed char) \ 44 (unsigned char) \ 45 (short) \ 46 (unsigned short) \ 47 (int) \ 48 (unsigned int) \ 49 (long) \ 50 (unsigned long) \ 51 (float) \ 52 (double) \ 53 (long double) \ 54 /***/ 55 56 #define BOOST_NUMERIC_CONVERSION_SEQ_A() BOOST_NUMERIC_CONVERSION_BASE_BUILTIN_TYPES() 57 #define BOOST_NUMERIC_CONVERSION_SEQ_B() BOOST_NUMERIC_CONVERSION_BASE_BUILTIN_TYPES() 58 59 namespace boost { namespace numeric { 60 61 #define BOOST_PP_ITERATION_PARAMS_1 (3, (0, BOOST_PP_DEC(BOOST_PP_SEQ_SIZE(BOOST_NUMERIC_CONVERSION_SEQ_A())), <boost/numeric/conversion/detail/numeric_cast_traits.hpp>)) 62 #include BOOST_PP_ITERATE() 63 64 }}//namespace boost::numeric; 65 66 #if defined(__WAVE__) && defined(BOOST_NUMERIC_CONVERSION_CREATE_PREPROCESSED_FILES) 67 #pragma wave option(output: null) 68 #endif 69 70 #if ( defined(__WAVE__) && defined(BOOST_NUMERIC_CONVERSION_CREATE_PREPROCESSED_FILES) ) || !defined(BOOST_NO_LONG_LONG) 71 72 #undef BOOST_NUMERIC_CONVERSION_SEQ_A 73 #undef BOOST_NUMERIC_CONVERSION_SEQ_B 74 75 #if defined(__WAVE__) && defined(BOOST_NUMERIC_CONVERSION_CREATE_PREPROCESSED_FILES) 76 #pragma wave option(preserve: 2, line: 0, output: "preprocessed/numeric_cast_traits_long_long.hpp") 77 #endif 78 79 // 80 //! Copyright (c) 2011-2012 81 //! Brandon Kohn 82 // 83 // Distributed under the Boost Software License, Version 1.0. (See 84 // accompanying file LICENSE_1_0.txt or copy at 85 // http://www.boost.org/LICENSE_1_0.txt) 86 // 87 #if defined(__WAVE__) && defined(BOOST_NUMERIC_CONVERSION_CREATE_PREPROCESSED_FILES) 88 #pragma wave option(preserve: 1) 89 #endif 90 91 namespace boost { namespace numeric { 92 93 #define BOOST_NUMERIC_CONVERSION_SEQ_A() BOOST_NUMERIC_CONVERSION_BASE_BUILTIN_TYPES()(boost::long_long_type)(boost::ulong_long_type) 94 #define BOOST_NUMERIC_CONVERSION_SEQ_B() (boost::long_long_type)(boost::ulong_long_type) 95 96 #define BOOST_PP_ITERATION_PARAMS_1 (3, (0, BOOST_PP_DEC(BOOST_PP_SEQ_SIZE(BOOST_NUMERIC_CONVERSION_SEQ_A())), <boost/numeric/conversion/detail/numeric_cast_traits.hpp>)) 97 #include BOOST_PP_ITERATE() 98 99 }}//namespace boost::numeric; 100 101 #if defined(__WAVE__) && defined(BOOST_NUMERIC_CONVERSION_CREATE_PREPROCESSED_FILES) 102 #pragma wave option(output: null) 103 #endif 104 105 #endif 106 107 #undef BOOST_NUMERIC_CONVERSION_BASE_BUILTIN_TYPES 108 #undef BOOST_NUMERIC_CONVERSION_SEQ_A 109 #undef BOOST_NUMERIC_CONVERSION_SEQ_B 110 111 #elif BOOST_PP_ITERATION_DEPTH() == 1 112 113 #define BOOST_PP_ITERATION_PARAMS_2 (3, (0, BOOST_PP_DEC(BOOST_PP_SEQ_SIZE(BOOST_NUMERIC_CONVERSION_SEQ_B())), <boost/numeric/conversion/detail/numeric_cast_traits.hpp>)) 114 #include BOOST_PP_ITERATE() 115 116 #elif BOOST_PP_ITERATION_DEPTH() == 2 117 118 //! Generate default traits for the specified source and target. 119 #define BOOST_NUMERIC_CONVERSION_A BOOST_PP_FRAME_ITERATION(1) 120 #define BOOST_NUMERIC_CONVERSION_B BOOST_PP_FRAME_ITERATION(2) 121 122 template <> 123 struct numeric_cast_traits 124 < 125 BOOST_PP_SEQ_ELEM(BOOST_NUMERIC_CONVERSION_A, BOOST_NUMERIC_CONVERSION_SEQ_A()) 126 , BOOST_PP_SEQ_ELEM(BOOST_NUMERIC_CONVERSION_B, BOOST_NUMERIC_CONVERSION_SEQ_B()) 127 > 128 { 129 typedef def_overflow_handler overflow_policy; 130 typedef UseInternalRangeChecker range_checking_policy; 131 typedef Trunc<BOOST_PP_SEQ_ELEM(BOOST_NUMERIC_CONVERSION_B, BOOST_NUMERIC_CONVERSION_SEQ_B())> rounding_policy; 132 }; 133 134 #undef BOOST_NUMERIC_CONVERSION_A 135 #undef BOOST_NUMERIC_CONVERSION_B 136 137 #endif//! Depth 2. 138 #endif// BOOST_NUMERIC_CONVERSION_DONT_USE_PREPROCESSED_FILES 139