blob: c795d88b308ac0a16ed7a84bf6c0c8a3661a4056 [file] [log] [blame]
//
//! Copyright (c) 2011
//! Brandon Kohn
//
// Distributed under the Boost Software License, Version 1.0. (See
// accompanying file LICENSE_1_0.txt or copy at
// http://www.boost.org/LICENSE_1_0.txt)
//
#include <boost/operators.hpp>
#include <boost/numeric/conversion/cast.hpp>
#include <boost/preprocessor/control/iif.hpp>
#include <boost/preprocessor/comparison/less.hpp>
#include <boost/preprocessor/comparison/not_equal.hpp>
#include <boost/preprocessor/repetition/for.hpp>
#include <boost/preprocessor/tuple/elem.hpp>
#include <boost/preprocessor/seq/elem.hpp>
#include <boost/preprocessor/seq/size.hpp>
#include <boost/test/minimal.hpp>
//! Generate default traits for the specified source and target.
#define BOOST_NUMERIC_CONVERSION_GENERATE_CAST_TRAITS(r, state) \
template <> \
struct numeric_cast_traits< \
BOOST_PP_SEQ_ELEM( BOOST_PP_TUPLE_ELEM(4,0,state) \
, BOOST_PP_TUPLE_ELEM(4,3,state) ) \
, BOOST_PP_TUPLE_ELEM(4,2,state)> \
{ \
typedef def_overflow_handler overflow_policy; \
typedef UseInternalRangeChecker range_checking_policy; \
typedef Trunc<BOOST_PP_TUPLE_ELEM(4,2,state)> rounding_policy; \
}; \
/***/
#define BOOST_NUMERIC_CONVERSION_TUPLE_SENTINAL(r, state) \
BOOST_PP_LESS \
( \
BOOST_PP_TUPLE_ELEM(4,0,state) \
, BOOST_PP_TUPLE_ELEM(4,1,state) \
) \
/***/
#define BOOST_NUMERIC_CONVERSION_INC_OP(r, state) \
( \
BOOST_PP_INC(BOOST_PP_TUPLE_ELEM(4,0,state)) \
, BOOST_PP_TUPLE_ELEM(4,1,state) \
, BOOST_PP_TUPLE_ELEM(4,2,state) \
, BOOST_PP_TUPLE_ELEM(4,3,state) \
) \
/***/
#define BOOST_NUMERIC_CONVERSION_GENERATE_CAST_TARGET_STEP(r, state) \
BOOST_PP_FOR \
( \
( \
0 \
, BOOST_PP_TUPLE_ELEM(4,1,state) \
, BOOST_PP_SEQ_ELEM(BOOST_PP_TUPLE_ELEM(4,0,state),BOOST_PP_TUPLE_ELEM(4,2,state)) \
, BOOST_PP_TUPLE_ELEM(4,2,state) \
) \
, BOOST_NUMERIC_CONVERSION_TUPLE_SENTINAL \
, BOOST_NUMERIC_CONVERSION_INC_OP \
, BOOST_NUMERIC_CONVERSION_GENERATE_CAST_TRAITS \
) \
/***/
#define BOOST_NUMERIC_CONVERSION_GENERATE_BUILTIN_CAST_TRAITS(types) \
BOOST_PP_FOR \
( \
(0,BOOST_PP_SEQ_SIZE(types),types,_) \
, BOOST_NUMERIC_CONVERSION_TUPLE_SENTINAL \
, BOOST_NUMERIC_CONVERSION_INC_OP \
, BOOST_NUMERIC_CONVERSION_GENERATE_CAST_TARGET_STEP \
) \
/***/
namespace boost { namespace numeric {
#if !defined( BOOST_NO_INT64_T )
//! Generate the specializations for the built-in types.
BOOST_NUMERIC_CONVERSION_GENERATE_BUILTIN_CAST_TRAITS
(
(char)
(boost::int8_t)
(boost::uint8_t)
(boost::int16_t)
(boost::uint16_t)
(boost::int32_t)
(boost::uint32_t)
(boost::int64_t)
(boost::uint64_t)
(float)
(double)
(long double)
)
#else
BOOST_NUMERIC_CONVERSION_GENERATE_BUILTIN_CAST_TRAITS
(
(char)
(boost::int8_t)
(boost::uint8_t)
(boost::int16_t)
(boost::uint16_t)
(boost::int32_t)
(boost::uint32_t)
(float)
(double)
(long double)
)
#endif
}}//namespace boost::numeric;
int test_main( int argc, char * argv[] )
{
//! This test should not compile.
return 1;
}
#undef BOOST_NUMERIC_CONVERSION_GENERATE_BUILTIN_CAST_TRAITS
#undef BOOST_NUMERIC_CONVERSION_GENERATE_CAST_TARGET_STEP
#undef BOOST_NUMERIC_CONVERSION_INC_OP
#undef BOOST_NUMERIC_CONVERSION_TUPLE_SENTINAL
#undef BOOST_NUMERIC_CONVERSION_GENERATE_CAST_TRAITS