williamr@2: williamr@2: #ifndef BOOST_MPL_AUX_LAMBDA_SUPPORT_HPP_INCLUDED williamr@2: #define BOOST_MPL_AUX_LAMBDA_SUPPORT_HPP_INCLUDED williamr@2: williamr@2: // Copyright Aleksey Gurtovoy 2001-2004 williamr@2: // williamr@2: // Distributed under the Boost Software License, Version 1.0. williamr@2: // (See accompanying file LICENSE_1_0.txt or copy at williamr@2: // http://www.boost.org/LICENSE_1_0.txt) williamr@2: // williamr@2: // See http://www.boost.org/libs/mpl for documentation. williamr@2: williamr@2: // $Source: /cvsroot/boost/boost/boost/mpl/aux_/lambda_support.hpp,v $ williamr@2: // $Date: 2005/08/25 16:27:21 $ williamr@2: // $Revision: 1.13 $ williamr@2: williamr@2: #include williamr@2: williamr@2: #if !defined(BOOST_MPL_CFG_NO_FULL_LAMBDA_SUPPORT) williamr@2: williamr@2: # define BOOST_MPL_AUX_LAMBDA_SUPPORT_SPEC(i, name, params) /**/ williamr@2: # define BOOST_MPL_AUX_LAMBDA_SUPPORT(i,name,params) /**/ williamr@2: williamr@2: #else williamr@2: williamr@2: # include williamr@2: # include williamr@2: # include williamr@2: # include williamr@2: # include williamr@2: # include williamr@2: # include williamr@2: williamr@2: # include williamr@2: # include williamr@2: # include williamr@2: # include williamr@2: williamr@2: # define BOOST_MPL_AUX_LAMBDA_SUPPORT_ARG_TYPEDEF_FUNC(R,typedef_,i,param) \ williamr@2: typedef_ param BOOST_PP_CAT(arg,BOOST_PP_INC(i)); \ williamr@2: /**/ williamr@2: williamr@2: // agurt, 07/mar/03: restore an old revision for the sake of SGI MIPSpro C++ williamr@2: #if BOOST_WORKAROUND(__EDG_VERSION__, <= 238) williamr@2: williamr@2: # define BOOST_MPL_AUX_LAMBDA_SUPPORT(i, name, params) \ williamr@2: typedef BOOST_MPL_AUX_ADL_BARRIER_NAMESPACE::int_ arity; \ williamr@2: BOOST_PP_LIST_FOR_EACH_I_R( \ williamr@2: 1 \ williamr@2: , BOOST_MPL_AUX_LAMBDA_SUPPORT_ARG_TYPEDEF_FUNC \ williamr@2: , typedef \ williamr@2: , BOOST_PP_TUPLE_TO_LIST(i,params) \ williamr@2: ) \ williamr@2: struct rebind \ williamr@2: { \ williamr@2: template< BOOST_MPL_PP_PARAMS(i,typename U) > struct apply \ williamr@2: : name< BOOST_MPL_PP_PARAMS(i,U) > \ williamr@2: { \ williamr@2: }; \ williamr@2: }; \ williamr@2: /**/ williamr@2: williamr@2: # define BOOST_MPL_AUX_LAMBDA_SUPPORT_SPEC(i, name, params) \ williamr@2: BOOST_MPL_AUX_LAMBDA_SUPPORT(i, name, params) \ williamr@2: /**/ williamr@2: williamr@2: #elif BOOST_WORKAROUND(__EDG_VERSION__, <= 244) && !defined(BOOST_INTEL_CXX_VERSION) williamr@2: // agurt, 18/jan/03: old EDG-based compilers actually enforce 11.4 para 9 williamr@2: // (in strict mode), so we have to provide an alternative to the williamr@2: // MSVC-optimized implementation williamr@2: williamr@2: # define BOOST_MPL_AUX_LAMBDA_SUPPORT_SPEC(i, name, params) \ williamr@2: typedef BOOST_MPL_AUX_ADL_BARRIER_NAMESPACE::int_ arity; \ williamr@2: BOOST_PP_LIST_FOR_EACH_I_R( \ williamr@2: 1 \ williamr@2: , BOOST_MPL_AUX_LAMBDA_SUPPORT_ARG_TYPEDEF_FUNC \ williamr@2: , typedef \ williamr@2: , BOOST_PP_TUPLE_TO_LIST(i,params) \ williamr@2: ) \ williamr@2: struct rebind; \ williamr@2: /**/ williamr@2: williamr@2: # define BOOST_MPL_AUX_LAMBDA_SUPPORT(i, name, params) \ williamr@2: BOOST_MPL_AUX_LAMBDA_SUPPORT_SPEC(i, name, params) \ williamr@2: }; \ williamr@2: template< BOOST_MPL_PP_PARAMS(i,typename T) > \ williamr@2: struct name::rebind \ williamr@2: { \ williamr@2: template< BOOST_MPL_PP_PARAMS(i,typename U) > struct apply \ williamr@2: : name< BOOST_MPL_PP_PARAMS(i,U) > \ williamr@2: { \ williamr@2: }; \ williamr@2: /**/ williamr@2: williamr@2: #else // __EDG_VERSION__ williamr@2: williamr@2: namespace boost { namespace mpl { namespace aux { williamr@2: template< typename T > struct has_rebind_tag; williamr@2: }}} williamr@2: williamr@2: # define BOOST_MPL_AUX_LAMBDA_SUPPORT_SPEC(i, name, params) \ williamr@2: typedef BOOST_MPL_AUX_ADL_BARRIER_NAMESPACE::int_ arity; \ williamr@2: BOOST_PP_LIST_FOR_EACH_I_R( \ williamr@2: 1 \ williamr@2: , BOOST_MPL_AUX_LAMBDA_SUPPORT_ARG_TYPEDEF_FUNC \ williamr@2: , typedef \ williamr@2: , BOOST_PP_TUPLE_TO_LIST(i,params) \ williamr@2: ) \ williamr@2: friend class BOOST_PP_CAT(name,_rebind); \ williamr@2: typedef BOOST_PP_CAT(name,_rebind) rebind; \ williamr@2: /**/ williamr@2: williamr@2: #if BOOST_WORKAROUND(__BORLANDC__, < 0x600) williamr@2: # define BOOST_MPL_AUX_LAMBDA_SUPPORT_HAS_REBIND(i, name, params) \ williamr@2: template< BOOST_MPL_PP_PARAMS(i,typename T) > \ williamr@2: ::boost::mpl::aux::yes_tag operator|( \ williamr@2: ::boost::mpl::aux::has_rebind_tag \ williamr@2: , name* \ williamr@2: ); \ williamr@2: ::boost::mpl::aux::no_tag operator|( \ williamr@2: ::boost::mpl::aux::has_rebind_tag \ williamr@2: , name< BOOST_MPL_PP_ENUM(i,::boost::mpl::na) >* \ williamr@2: ); \ williamr@2: /**/ williamr@2: #elif !BOOST_WORKAROUND(BOOST_MSVC, < 1300) williamr@2: # define BOOST_MPL_AUX_LAMBDA_SUPPORT_HAS_REBIND(i, name, params) \ williamr@2: template< BOOST_MPL_PP_PARAMS(i,typename T) > \ williamr@2: ::boost::mpl::aux::yes_tag operator|( \ williamr@2: ::boost::mpl::aux::has_rebind_tag \ williamr@2: , ::boost::mpl::aux::has_rebind_tag< name >* \ williamr@2: ); \ williamr@2: /**/ williamr@2: #else williamr@2: # define BOOST_MPL_AUX_LAMBDA_SUPPORT_HAS_REBIND(i, name, params) /**/ williamr@2: #endif williamr@2: williamr@2: # if !defined(__BORLANDC__) williamr@2: # define BOOST_MPL_AUX_LAMBDA_SUPPORT(i, name, params) \ williamr@2: BOOST_MPL_AUX_LAMBDA_SUPPORT_SPEC(i, name, params) \ williamr@2: }; \ williamr@2: BOOST_MPL_AUX_LAMBDA_SUPPORT_HAS_REBIND(i, name, params) \ williamr@2: class BOOST_PP_CAT(name,_rebind) \ williamr@2: { \ williamr@2: public: \ williamr@2: template< BOOST_MPL_PP_PARAMS(i,typename U) > struct apply \ williamr@2: : name< BOOST_MPL_PP_PARAMS(i,U) > \ williamr@2: { \ williamr@2: }; \ williamr@2: /**/ williamr@2: # else williamr@2: # define BOOST_MPL_AUX_LAMBDA_SUPPORT(i, name, params) \ williamr@2: BOOST_MPL_AUX_LAMBDA_SUPPORT_SPEC(i, name, params) \ williamr@2: }; \ williamr@2: BOOST_MPL_AUX_LAMBDA_SUPPORT_HAS_REBIND(i, name, params) \ williamr@2: class BOOST_PP_CAT(name,_rebind) \ williamr@2: { \ williamr@2: public: \ williamr@2: template< BOOST_MPL_PP_PARAMS(i,typename U) > struct apply \ williamr@2: { \ williamr@2: typedef typename name< BOOST_MPL_PP_PARAMS(i,U) >::type type; \ williamr@2: }; \ williamr@2: /**/ williamr@2: # endif // __BORLANDC__ williamr@2: williamr@2: #endif // __EDG_VERSION__ williamr@2: williamr@2: #endif // BOOST_MPL_CFG_NO_FULL_LAMBDA_SUPPORT williamr@2: williamr@2: #endif // BOOST_MPL_AUX_LAMBDA_SUPPORT_HPP_INCLUDED