Chris@16: // Copyright Daniel Wallin 2006. Use, modification and distribution is Chris@16: // subject to the Boost Software License, Version 1.0. (See accompanying Chris@16: // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) Chris@16: Chris@16: #ifndef BOOST_PARAMETER_CAST_060902_HPP Chris@16: # define BOOST_PARAMETER_CAST_060902_HPP Chris@16: Chris@16: # include Chris@16: Chris@16: # if !defined(BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION) \ Chris@16: && !BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x564)) Chris@16: # include Chris@16: # include Chris@16: # endif Chris@16: Chris@16: namespace boost { namespace parameter { namespace aux { Chris@16: Chris@16: struct use_default_tag {}; Chris@16: Chris@16: # if defined(BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION) \ Chris@16: || BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x564)) Chris@16: Chris@16: # define BOOST_PARAMETER_FUNCTION_CAST(value, predicate) value Chris@16: Chris@16: # else Chris@16: Chris@16: // Handles possible implicit casts. Used by preprocessor.hpp to Chris@16: // normalize user input. Chris@16: // Chris@16: // cast::execute() is identity Chris@16: // cast::execute() is identity Chris@16: // cast::execute() casts to X Chris@16: // Chris@16: // preprocessor.hpp uses this like this: Chris@16: // Chris@16: // #define X(value, predicate) Chris@16: // cast::execute(value) Chris@16: // Chris@16: // X(something, *) Chris@16: // X(something, *(predicate)) Chris@16: // X(something, (int)) Chris@16: Chris@16: template Chris@16: struct cast; Chris@16: Chris@16: template Chris@16: struct cast Chris@16: { Chris@16: static use_default_tag execute(use_default_tag) Chris@16: { Chris@16: return use_default_tag(); Chris@16: } Chris@16: Chris@16: static use_default_tag remove_const(use_default_tag) Chris@16: { Chris@16: return use_default_tag(); Chris@16: } Chris@16: Chris@16: template Chris@16: static U& execute(U& value) Chris@16: { Chris@16: return value; Chris@16: } Chris@16: Chris@16: template Chris@16: static U& remove_const(U& x) Chris@16: { Chris@16: return x; Chris@16: } Chris@16: }; Chris@16: Chris@16: #if BOOST_WORKAROUND(__SUNPRO_CC, BOOST_TESTED_AT(0x580)) Chris@16: Chris@16: typedef void* voidstar; Chris@16: Chris@16: template Chris@16: struct cast Chris@16: : cast Chris@16: { Chris@16: }; Chris@16: Chris@16: #else Chris@16: Chris@16: template Chris@16: struct cast Chris@16: : cast Chris@16: { Chris@16: }; Chris@16: Chris@16: #endif Chris@16: Chris@16: // This is a hack used in cast<> to turn the user supplied type, Chris@16: // which may or may not be a placeholder expression into one, so Chris@16: // that it will be properly evaluated by mpl::apply. Chris@16: template Chris@16: struct as_placeholder_expr Chris@16: { Chris@16: typedef T type; Chris@16: }; Chris@16: Chris@16: template Chris@16: struct cast Chris@16: { Chris@16: typedef typename mpl::apply2< Chris@16: as_placeholder_expr, Args, Args>::type type0; Chris@16: Chris@16: typedef typename boost::add_reference< Chris@16: typename boost::remove_const::type Chris@16: >::type reference; Chris@16: Chris@16: static use_default_tag execute(use_default_tag) Chris@16: { Chris@16: return use_default_tag(); Chris@16: } Chris@16: Chris@16: static use_default_tag remove_const(use_default_tag) Chris@16: { Chris@16: return use_default_tag(); Chris@16: } Chris@16: Chris@16: static type0 execute(type0 value) Chris@16: { Chris@16: return value; Chris@16: } Chris@16: Chris@16: template Chris@16: static reference remove_const(U const& x) Chris@16: { Chris@16: return const_cast(x); Chris@16: } Chris@16: }; Chris@16: Chris@16: # define BOOST_PARAMETER_FUNCTION_CAST(value, predicate, args) \ Chris@16: boost::parameter::aux::cast::remove_const( \ Chris@16: boost::parameter::aux::cast::execute(value) \ Chris@16: ) Chris@16: Chris@16: # endif Chris@16: Chris@16: }}} // namespace boost::parameter::aux Chris@16: Chris@16: #endif // BOOST_PARAMETER_CAST_060902_HPP Chris@16: