12ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh 22ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh#ifndef BOOST_MPL_HAS_XXX_HPP_INCLUDED 32ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh#define BOOST_MPL_HAS_XXX_HPP_INCLUDED 42ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh 52ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh// Copyright Aleksey Gurtovoy 2002-2006 62ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh// Copyright David Abrahams 2002-2003 72ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh// Copyright Daniel Walker 2007 82ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh// 92ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh// Distributed under the Boost Software License, Version 1.0. 102ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh// (See accompanying file LICENSE_1_0.txt or copy at 112ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh// http://www.boost.org/LICENSE_1_0.txt) 122ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh// 132ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh// See http://www.boost.org/libs/mpl for documentation. 142ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh 152ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh// $Id: has_xxx.hpp 64146 2010-07-19 00:46:31Z djwalker $ 162ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh// $Date: 2010-07-18 17:46:31 -0700 (Sun, 18 Jul 2010) $ 172ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh// $Revision: 64146 $ 182ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh 192ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh#include <boost/mpl/bool.hpp> 202ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh#include <boost/mpl/aux_/na_spec.hpp> 212ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh#include <boost/mpl/aux_/type_wrapper.hpp> 222ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh#include <boost/mpl/aux_/yes_no.hpp> 232ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh#include <boost/mpl/aux_/config/gcc.hpp> 242ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh#include <boost/mpl/aux_/config/has_xxx.hpp> 252ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh#include <boost/mpl/aux_/config/msvc_typename.hpp> 262ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh#include <boost/mpl/aux_/config/msvc.hpp> 272ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh#include <boost/mpl/aux_/config/static_constant.hpp> 282ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh#include <boost/mpl/aux_/config/workaround.hpp> 292ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh 302ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh#include <boost/preprocessor/array/elem.hpp> 312ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh#include <boost/preprocessor/cat.hpp> 322ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh#include <boost/preprocessor/control/if.hpp> 332ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh#include <boost/preprocessor/repetition/enum_params.hpp> 342ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh#include <boost/preprocessor/repetition/enum_trailing_params.hpp> 352ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh 362ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh#if BOOST_WORKAROUND( __BORLANDC__, BOOST_TESTED_AT(0x590) ) 372ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh# include <boost/type_traits/is_class.hpp> 382ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh#endif 392ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh 402ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh#if !defined(BOOST_MPL_CFG_NO_HAS_XXX) 412ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh 422ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh# if BOOST_WORKAROUND(BOOST_MSVC, <= 1300) 432ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh 442ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh// agurt, 11/sep/02: MSVC-specific version (< 7.1), based on a USENET 452ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh// newsgroup's posting by John Madsen (comp.lang.c++.moderated, 462ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh// 1999-11-12 19:17:06 GMT); the code is _not_ standard-conforming, but 472ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh// it works way more reliably than the SFINAE-based implementation 482ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh 492ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh// Modified dwa 8/Oct/02 to handle reference types. 502ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh 512ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh# include <boost/mpl/if.hpp> 522ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh# include <boost/mpl/bool.hpp> 532ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh 542ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsiehnamespace boost { namespace mpl { namespace aux { 552ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh 562ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsiehstruct has_xxx_tag; 572ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh 582ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh#if BOOST_WORKAROUND(BOOST_MSVC, == 1300) 592ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsiehtemplate< typename U > struct msvc_incomplete_array 602ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh{ 612ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh typedef char (&type)[sizeof(U) + 1]; 622ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh}; 632ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh#endif 642ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh 652ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsiehtemplate< typename T > 662ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsiehstruct msvc_is_incomplete 672ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh{ 682ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh // MSVC is capable of some kinds of SFINAE. If U is an incomplete 692ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh // type, it won't pick the second overload 702ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh static char tester(...); 712ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh 722ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh#if BOOST_WORKAROUND(BOOST_MSVC, == 1300) 732ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh template< typename U > 742ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh static typename msvc_incomplete_array<U>::type tester(type_wrapper<U>); 752ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh#else 762ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh template< typename U > 772ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh static char (& tester(type_wrapper<U>) )[sizeof(U)+1]; 782ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh#endif 792ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh 802ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh BOOST_STATIC_CONSTANT(bool, value = 812ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh sizeof(tester(type_wrapper<T>())) == 1 822ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh ); 832ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh}; 842ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh 852ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsiehtemplate<> 862ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsiehstruct msvc_is_incomplete<int> 872ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh{ 882ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh BOOST_STATIC_CONSTANT(bool, value = false); 892ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh}; 902ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh 912ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh}}} 922ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh 932ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh# define BOOST_MPL_HAS_XXX_TRAIT_NAMED_DEF_(trait, name, default_) \ 942ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsiehtemplate< typename T, typename name = ::boost::mpl::aux::has_xxx_tag > \ 952ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsiehstruct BOOST_PP_CAT(trait,_impl) : T \ 962ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh{ \ 972ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh static boost::mpl::aux::no_tag \ 982ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh test(void(*)(::boost::mpl::aux::has_xxx_tag)); \ 992ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh \ 1002ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh static boost::mpl::aux::yes_tag test(...); \ 1012ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh \ 1022ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh BOOST_STATIC_CONSTANT(bool, value = \ 1032ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh sizeof(test(static_cast<void(*)(name)>(0))) \ 1042ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh != sizeof(boost::mpl::aux::no_tag) \ 1052ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh ); \ 1062ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh typedef boost::mpl::bool_<value> type; \ 1072ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh}; \ 1082ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh\ 1092ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsiehtemplate< typename T, typename fallback_ = boost::mpl::bool_<default_> > \ 1102ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsiehstruct trait \ 1112ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh : boost::mpl::if_c< \ 1122ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh boost::mpl::aux::msvc_is_incomplete<T>::value \ 1132ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh , boost::mpl::bool_<false> \ 1142ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh , BOOST_PP_CAT(trait,_impl)<T> \ 1152ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh >::type \ 1162ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh{ \ 1172ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh}; \ 1182ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh\ 1192ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew HsiehBOOST_MPL_AUX_HAS_XXX_TRAIT_SPEC(trait, void) \ 1202ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew HsiehBOOST_MPL_AUX_HAS_XXX_TRAIT_SPEC(trait, bool) \ 1212ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew HsiehBOOST_MPL_AUX_HAS_XXX_TRAIT_SPEC(trait, char) \ 1222ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew HsiehBOOST_MPL_AUX_HAS_XXX_TRAIT_SPEC(trait, signed char) \ 1232ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew HsiehBOOST_MPL_AUX_HAS_XXX_TRAIT_SPEC(trait, unsigned char) \ 1242ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew HsiehBOOST_MPL_AUX_HAS_XXX_TRAIT_SPEC(trait, signed short) \ 1252ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew HsiehBOOST_MPL_AUX_HAS_XXX_TRAIT_SPEC(trait, unsigned short) \ 1262ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew HsiehBOOST_MPL_AUX_HAS_XXX_TRAIT_SPEC(trait, signed int) \ 1272ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew HsiehBOOST_MPL_AUX_HAS_XXX_TRAIT_SPEC(trait, unsigned int) \ 1282ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew HsiehBOOST_MPL_AUX_HAS_XXX_TRAIT_SPEC(trait, signed long) \ 1292ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew HsiehBOOST_MPL_AUX_HAS_XXX_TRAIT_SPEC(trait, unsigned long) \ 1302ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew HsiehBOOST_MPL_AUX_HAS_XXX_TRAIT_SPEC(trait, float) \ 1312ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew HsiehBOOST_MPL_AUX_HAS_XXX_TRAIT_SPEC(trait, double) \ 1322ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew HsiehBOOST_MPL_AUX_HAS_XXX_TRAIT_SPEC(trait, long double) \ 1332ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh/**/ 1342ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh 1352ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh# define BOOST_MPL_AUX_HAS_XXX_TRAIT_SPEC(trait, T) \ 1362ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsiehtemplate<> struct trait<T> \ 1372ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh{ \ 1382ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh BOOST_STATIC_CONSTANT(bool, value = false); \ 1392ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh typedef boost::mpl::bool_<false> type; \ 1402ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh}; \ 1412ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh/**/ 1422ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh 1432ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh#if !defined(BOOST_NO_INTRINSIC_WCHAR_T) 1442ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh# define BOOST_MPL_HAS_XXX_TRAIT_NAMED_DEF(trait, name, unused) \ 1452ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh BOOST_MPL_HAS_XXX_TRAIT_NAMED_DEF_(trait, name, unused) \ 1462ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh BOOST_MPL_AUX_HAS_XXX_TRAIT_SPEC(trait, wchar_t) \ 1472ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh/**/ 1482ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh#else 1492ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh# define BOOST_MPL_HAS_XXX_TRAIT_NAMED_DEF(trait, name, unused) \ 1502ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh BOOST_MPL_HAS_XXX_TRAIT_NAMED_DEF_(trait, name, unused) \ 1512ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh/**/ 1522ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh#endif 1532ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh 1542ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh 1552ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh// SFINAE-based implementations below are derived from a USENET newsgroup's 1562ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh// posting by Rani Sharoni (comp.lang.c++.moderated, 2002-03-17 07:45:09 PST) 1572ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh 1582ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh# elif BOOST_WORKAROUND(BOOST_MSVC, BOOST_TESTED_AT(1400)) \ 1592ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh || BOOST_WORKAROUND(__IBMCPP__, <= 700) 1602ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh 1612ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh// MSVC 7.1+ & VACPP 1622ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh 1632ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh// agurt, 15/jun/05: replace overload-based SFINAE implementation with SFINAE 1642ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh// applied to partial specialization to fix some apparently random failures 1652ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh// (thanks to Daniel Wallin for researching this!) 1662ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh 1672ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh# define BOOST_MPL_HAS_XXX_TRAIT_NAMED_DEF(trait, name, default_) \ 1682ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsiehtemplate< typename T > \ 1692ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsiehstruct BOOST_PP_CAT(trait, _msvc_sfinae_helper) \ 1702ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh{ \ 1712ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh typedef void type; \ 1722ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh};\ 1732ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh\ 1742ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsiehtemplate< typename T, typename U = void > \ 1752ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsiehstruct BOOST_PP_CAT(trait,_impl_) \ 1762ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh{ \ 1772ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh BOOST_STATIC_CONSTANT(bool, value = false); \ 1782ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh typedef boost::mpl::bool_<value> type; \ 1792ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh}; \ 1802ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh\ 1812ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsiehtemplate< typename T > \ 1822ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsiehstruct BOOST_PP_CAT(trait,_impl_)< \ 1832ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh T \ 1842ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh , typename BOOST_PP_CAT(trait, _msvc_sfinae_helper)< typename T::name >::type \ 1852ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh > \ 1862ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh{ \ 1872ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh BOOST_STATIC_CONSTANT(bool, value = true); \ 1882ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh typedef boost::mpl::bool_<value> type; \ 1892ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh}; \ 1902ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh\ 1912ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsiehtemplate< typename T, typename fallback_ = boost::mpl::bool_<default_> > \ 1922ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsiehstruct trait \ 1932ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh : BOOST_PP_CAT(trait,_impl_)<T> \ 1942ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh{ \ 1952ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh}; \ 1962ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh/**/ 1972ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh 1982ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh# elif BOOST_WORKAROUND( __BORLANDC__, BOOST_TESTED_AT(0x590) ) 1992ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh 2002ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh# define BOOST_MPL_HAS_XXX_TRAIT_NAMED_BCB_DEF(trait, trait_tester, name, default_) \ 2012ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsiehtemplate< typename T, bool IS_CLASS > \ 2022ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsiehstruct trait_tester \ 2032ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh{ \ 2042ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh BOOST_STATIC_CONSTANT( bool, value = false ); \ 2052ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh}; \ 2062ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsiehtemplate< typename T > \ 2072ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsiehstruct trait_tester< T, true > \ 2082ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh{ \ 2092ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh struct trait_tester_impl \ 2102ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh { \ 2112ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh template < class U > \ 2122ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh static int resolve( boost::mpl::aux::type_wrapper<U> const volatile * \ 2132ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh , boost::mpl::aux::type_wrapper<typename U::name >* = 0 ); \ 2142ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh static char resolve( ... ); \ 2152ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh }; \ 2162ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh typedef boost::mpl::aux::type_wrapper<T> t_; \ 2172ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh BOOST_STATIC_CONSTANT( bool, value = ( sizeof( trait_tester_impl::resolve( static_cast< t_ * >(0) ) ) == sizeof(int) ) ); \ 2182ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh}; \ 2192ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsiehtemplate< typename T, typename fallback_ = boost::mpl::bool_<default_> > \ 2202ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsiehstruct trait \ 2212ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh{ \ 2222ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh BOOST_STATIC_CONSTANT( bool, value = (trait_tester< T, boost::is_class< T >::value >::value) ); \ 2232ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh typedef boost::mpl::bool_< trait< T, fallback_ >::value > type; \ 2242ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh}; 2252ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh 2262ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh# define BOOST_MPL_HAS_XXX_TRAIT_NAMED_DEF(trait, name, default_) \ 2272ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh BOOST_MPL_HAS_XXX_TRAIT_NAMED_BCB_DEF( trait \ 2282ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh , BOOST_PP_CAT(trait,_tester) \ 2292ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh , name \ 2302ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh , default_ ) \ 2312ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh/**/ 2322ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh 2332ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh# else // other SFINAE-capable compilers 2342ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh 2352ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh# define BOOST_MPL_HAS_XXX_TRAIT_NAMED_DEF(trait, name, default_) \ 2362ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsiehtemplate< typename T, typename fallback_ = boost::mpl::bool_<default_> > \ 2372ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsiehstruct trait \ 2382ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh{ \ 2392ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh struct gcc_3_2_wknd \ 2402ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh { \ 2412ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh template< typename U > \ 2422ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh static boost::mpl::aux::yes_tag test( \ 2432ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh boost::mpl::aux::type_wrapper<U> const volatile* \ 2442ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh , boost::mpl::aux::type_wrapper<BOOST_MSVC_TYPENAME U::name>* = 0 \ 2452ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh ); \ 2462ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh \ 2472ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh static boost::mpl::aux::no_tag test(...); \ 2482ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh }; \ 2492ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh \ 2502ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh typedef boost::mpl::aux::type_wrapper<T> t_; \ 2512ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh BOOST_STATIC_CONSTANT(bool, value = \ 2522ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh sizeof(gcc_3_2_wknd::test(static_cast<t_*>(0))) \ 2532ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh == sizeof(boost::mpl::aux::yes_tag) \ 2542ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh ); \ 2552ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh typedef boost::mpl::bool_<value> type; \ 2562ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh}; \ 2572ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh/**/ 2582ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh 2592ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh# endif // BOOST_WORKAROUND(BOOST_MSVC, <= 1300) 2602ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh 2612ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh 2622ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh#else // BOOST_MPL_CFG_NO_HAS_XXX 2632ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh 2642ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh// placeholder implementation 2652ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh 2662ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh# define BOOST_MPL_HAS_XXX_TRAIT_NAMED_DEF(trait, name, default_) \ 2672ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsiehtemplate< typename T, typename fallback_ = boost::mpl::bool_<default_> > \ 2682ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsiehstruct trait \ 2692ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh{ \ 2702ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh BOOST_STATIC_CONSTANT(bool, value = fallback_::value); \ 2712ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh typedef fallback_ type; \ 2722ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh}; \ 2732ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh/**/ 2742ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh 2752ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh#endif 2762ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh 2772ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh#define BOOST_MPL_HAS_XXX_TRAIT_DEF(name) \ 2782ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh BOOST_MPL_HAS_XXX_TRAIT_NAMED_DEF(BOOST_PP_CAT(has_,name), name, false) \ 2792ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh/**/ 2802ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh 2812ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh 2822ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh#if !defined(BOOST_MPL_CFG_NO_HAS_XXX_TEMPLATE) 2832ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh 2842ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh// Create a boolean Metafunction to detect a nested template 2852ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh// member. This implementation is based on a USENET newsgroup's 2862ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh// posting by Aleksey Gurtovoy (comp.lang.c++.moderated, 2002-03-19), 2872ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh// Rani Sharoni's USENET posting cited above, the non-template has_xxx 2882ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh// implementations above, and discussion on the Boost mailing list. 2892ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh 2902ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh# if !defined(BOOST_MPL_HAS_XXX_NO_WRAPPED_TYPES) 2912ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh# if BOOST_WORKAROUND(BOOST_MSVC, <= 1400) 2922ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh# define BOOST_MPL_HAS_XXX_NO_WRAPPED_TYPES 1 2932ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh# endif 2942ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh# endif 2952ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh 2962ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh# if !defined(BOOST_MPL_HAS_XXX_NO_EXPLICIT_TEST_FUNCTION) 2972ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh# if (defined(BOOST_NO_EXPLICIT_FUNCTION_TEMPLATE_ARGUMENTS)) 2982ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh# define BOOST_MPL_HAS_XXX_NO_EXPLICIT_TEST_FUNCTION 1 2992ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh# endif 3002ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh# endif 3012ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh 3022ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh# if !defined(BOOST_MPL_HAS_XXX_NEEDS_TEMPLATE_SFINAE) 3032ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh# if BOOST_WORKAROUND(BOOST_MSVC, <= 1400) 3042ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh# define BOOST_MPL_HAS_XXX_NEEDS_TEMPLATE_SFINAE 1 3052ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh# endif 3062ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh# endif 3072ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh 3082ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh// NOTE: Many internal implementation macros take a Boost.Preprocessor 3092ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh// array argument called args which is of the following form. 3102ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh// ( 4, ( trait, name, max_arity, default_ ) ) 3112ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh 3122ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh# define BOOST_MPL_HAS_MEMBER_INTROSPECTION_NAME(args) \ 3132ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh BOOST_PP_CAT(BOOST_PP_ARRAY_ELEM(0, args) , _introspect) \ 3142ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh /**/ 3152ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh 3162ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh# define BOOST_MPL_HAS_MEMBER_INTROSPECTION_SUBSTITUTE_NAME(args, n) \ 3172ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh BOOST_PP_CAT(BOOST_PP_CAT(BOOST_PP_ARRAY_ELEM(0, args) , _substitute), n) \ 3182ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh /**/ 3192ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh 3202ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh# define BOOST_MPL_HAS_MEMBER_INTROSPECTION_TEST_NAME(args) \ 3212ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh BOOST_PP_CAT(BOOST_PP_ARRAY_ELEM(0, args) , _test) \ 3222ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh /**/ 3232ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh 3242ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh// Thanks to Guillaume Melquiond for pointing out the need for the 3252ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh// "substitute" template as an argument to the overloaded test 3262ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh// functions to get SFINAE to work for member templates with the 3272ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh// correct name but different number of arguments. 3282ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh# define BOOST_MPL_HAS_MEMBER_MULTI_SUBSTITUTE(z, n, args) \ 3292ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh template< \ 3302ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh template< BOOST_PP_ENUM_PARAMS(BOOST_PP_INC(n), typename V) > class V \ 3312ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh > \ 3322ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh struct BOOST_MPL_HAS_MEMBER_INTROSPECTION_SUBSTITUTE_NAME(args, n) { \ 3332ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh }; \ 3342ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh /**/ 3352ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh 3362ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh# define BOOST_MPL_HAS_MEMBER_SUBSTITUTE(args, substitute_macro) \ 3372ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh BOOST_PP_REPEAT( \ 3382ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh BOOST_PP_ARRAY_ELEM(2, args) \ 3392ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh , BOOST_MPL_HAS_MEMBER_MULTI_SUBSTITUTE \ 3402ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh , args \ 3412ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh ) \ 3422ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh /**/ 3432ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh 3442ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh# if !BOOST_MPL_HAS_XXX_NO_EXPLICIT_TEST_FUNCTION 3452ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh# define BOOST_MPL_HAS_MEMBER_REJECT(args, member_macro) \ 3462ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh template< typename V > \ 3472ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh static boost::mpl::aux::no_tag \ 3482ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh BOOST_MPL_HAS_MEMBER_INTROSPECTION_TEST_NAME(args)(...); \ 3492ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh /**/ 3502ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh# else 3512ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh# define BOOST_MPL_HAS_MEMBER_REJECT(args, member_macro) \ 3522ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh static boost::mpl::aux::no_tag \ 3532ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh BOOST_MPL_HAS_MEMBER_INTROSPECTION_TEST_NAME(args)(...); \ 3542ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh /**/ 3552ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh# endif 3562ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh 3572ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh# if !BOOST_MPL_HAS_XXX_NO_WRAPPED_TYPES 3582ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh# define BOOST_MPL_HAS_MEMBER_MULTI_ACCEPT(z, n, args) \ 3592ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh template< typename V > \ 3602ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh static boost::mpl::aux::yes_tag \ 3612ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh BOOST_MPL_HAS_MEMBER_INTROSPECTION_TEST_NAME(args)( \ 3622ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh boost::mpl::aux::type_wrapper< V > const volatile* \ 3632ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh , BOOST_MPL_HAS_MEMBER_INTROSPECTION_SUBSTITUTE_NAME(args, n) < \ 3642ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh V::template BOOST_PP_ARRAY_ELEM(1, args) \ 3652ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh >* = 0 \ 3662ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh ); \ 3672ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh /**/ 3682ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh# define BOOST_MPL_HAS_MEMBER_ACCEPT(args, member_macro) \ 3692ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh BOOST_PP_REPEAT( \ 3702ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh BOOST_PP_ARRAY_ELEM(2, args) \ 3712ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh , BOOST_MPL_HAS_MEMBER_MULTI_ACCEPT \ 3722ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh , args \ 3732ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh ) \ 3742ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh /**/ 3752ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh# else 3762ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh# define BOOST_MPL_HAS_MEMBER_ACCEPT(args, member_macro) \ 3772ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh template< typename V > \ 3782ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh static boost::mpl::aux::yes_tag \ 3792ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh BOOST_MPL_HAS_MEMBER_INTROSPECTION_TEST_NAME(args)( \ 3802ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh V const volatile* \ 3812ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh , member_macro(args, V, T)* = 0 \ 3822ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh ); \ 3832ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh /**/ 3842ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh# endif 3852ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh 3862ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh# if !BOOST_MPL_HAS_XXX_NO_EXPLICIT_TEST_FUNCTION 3872ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh# define BOOST_MPL_HAS_MEMBER_TEST(args) \ 3882ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh sizeof(BOOST_MPL_HAS_MEMBER_INTROSPECTION_TEST_NAME(args)< U >(0)) \ 3892ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh == sizeof(boost::mpl::aux::yes_tag) \ 3902ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh /**/ 3912ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh# else 3922ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh# if !BOOST_MPL_HAS_XXX_NO_WRAPPED_TYPES 3932ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh# define BOOST_MPL_HAS_MEMBER_TEST(args) \ 3942ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh sizeof( \ 3952ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh BOOST_MPL_HAS_MEMBER_INTROSPECTION_TEST_NAME(args)( \ 3962ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh static_cast< boost::mpl::aux::type_wrapper< U >* >(0) \ 3972ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh ) \ 3982ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh ) == sizeof(boost::mpl::aux::yes_tag) \ 3992ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh /**/ 4002ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh# else 4012ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh# define BOOST_MPL_HAS_MEMBER_TEST(args) \ 4022ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh sizeof( \ 4032ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh BOOST_MPL_HAS_MEMBER_INTROSPECTION_TEST_NAME(args)( \ 4042ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh static_cast< U* >(0) \ 4052ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh ) \ 4062ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh ) == sizeof(boost::mpl::aux::yes_tag) \ 4072ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh /**/ 4082ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh# endif 4092ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh# endif 4102ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh 4112ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh# define BOOST_MPL_HAS_MEMBER_INTROSPECT( \ 4122ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh args, substitute_macro, member_macro \ 4132ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh ) \ 4142ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh template< typename U > \ 4152ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh struct BOOST_MPL_HAS_MEMBER_INTROSPECTION_NAME(args) { \ 4162ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh BOOST_MPL_HAS_MEMBER_SUBSTITUTE(args, substitute_macro) \ 4172ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh BOOST_MPL_HAS_MEMBER_REJECT(args, member_macro) \ 4182ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh BOOST_MPL_HAS_MEMBER_ACCEPT(args, member_macro) \ 4192ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh BOOST_STATIC_CONSTANT( \ 4202ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh bool, value = BOOST_MPL_HAS_MEMBER_TEST(args) \ 4212ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh ); \ 4222ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh typedef boost::mpl::bool_< value > type; \ 4232ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh }; \ 4242ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh /**/ 4252ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh 4262ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh# define BOOST_MPL_HAS_MEMBER_IMPLEMENTATION( \ 4272ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh args, introspect_macro, substitute_macro, member_macro \ 4282ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh ) \ 4292ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh template< \ 4302ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh typename T \ 4312ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh , typename fallback_ \ 4322ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh = boost::mpl::bool_< BOOST_PP_ARRAY_ELEM(3, args) > \ 4332ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh > \ 4342ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh class BOOST_PP_ARRAY_ELEM(0, args) { \ 4352ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh introspect_macro(args, substitute_macro, member_macro) \ 4362ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh public: \ 4372ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh static const bool value \ 4382ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh = BOOST_MPL_HAS_MEMBER_INTROSPECTION_NAME(args)< T >::value; \ 4392ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh typedef typename BOOST_MPL_HAS_MEMBER_INTROSPECTION_NAME(args)< \ 4402ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh T \ 4412ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh >::type type; \ 4422ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh }; \ 4432ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh /**/ 4442ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh 4452ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh// BOOST_MPL_HAS_MEMBER_WITH_FUNCTION_SFINAE expands to the full 4462ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh// implementation of the function-based metafunction. Compile with -E 4472ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh// to see the preprocessor output for this macro. 4482ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh# define BOOST_MPL_HAS_MEMBER_WITH_FUNCTION_SFINAE( \ 4492ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh args, substitute_macro, member_macro \ 4502ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh ) \ 4512ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh BOOST_MPL_HAS_MEMBER_IMPLEMENTATION( \ 4522ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh args \ 4532ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh , BOOST_MPL_HAS_MEMBER_INTROSPECT \ 4542ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh , substitute_macro \ 4552ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh , member_macro \ 4562ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh ) \ 4572ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh /**/ 4582ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh 4592ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh# if BOOST_MPL_HAS_XXX_NEEDS_TEMPLATE_SFINAE 4602ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh 4612ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh# if !defined(BOOST_MPL_HAS_XXX_NEEDS_NAMESPACE_LEVEL_SUBSTITUTE) 4622ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh# if BOOST_WORKAROUND(BOOST_MSVC, <= 1400) 4632ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh# define BOOST_MPL_HAS_XXX_NEEDS_NAMESPACE_LEVEL_SUBSTITUTE 1 4642ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh# endif 4652ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh# endif 4662ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh 4672ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh# if !BOOST_MPL_HAS_XXX_NEEDS_NAMESPACE_LEVEL_SUBSTITUTE 4682ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh# define BOOST_MPL_HAS_MEMBER_INTROSPECTION_SUBSTITUTE_NAME_WITH_TEMPLATE_SFINAE( \ 4692ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh args, n \ 4702ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh ) \ 4712ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh BOOST_MPL_HAS_MEMBER_INTROSPECTION_SUBSTITUTE_NAME(args, n) \ 4722ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh /**/ 4732ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh# else 4742ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh# define BOOST_MPL_HAS_MEMBER_INTROSPECTION_SUBSTITUTE_NAME_WITH_TEMPLATE_SFINAE( \ 4752ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh args, n \ 4762ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh ) \ 4772ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh BOOST_PP_CAT( \ 4782ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh boost_mpl_has_xxx_ \ 4792ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh , BOOST_MPL_HAS_MEMBER_INTROSPECTION_SUBSTITUTE_NAME(args, n) \ 4802ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh ) \ 4812ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh /**/ 4822ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh# endif 4832ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh 4842ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh# define BOOST_MPL_HAS_MEMBER_INTROSPECTION_SUBSTITUTE_TAG_NAME( \ 4852ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh args \ 4862ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh ) \ 4872ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh BOOST_PP_CAT( \ 4882ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh BOOST_MPL_HAS_MEMBER_INTROSPECTION_SUBSTITUTE_NAME_WITH_TEMPLATE_SFINAE( \ 4892ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh args, 0 \ 4902ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh ) \ 4912ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh , _tag \ 4922ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh ) \ 4932ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh /**/ 4942ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh 4952ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh# define BOOST_MPL_HAS_MEMBER_MULTI_SUBSTITUTE_WITH_TEMPLATE_SFINAE( \ 4962ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh z, n, args \ 4972ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh ) \ 4982ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh template< \ 4992ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh template< BOOST_PP_ENUM_PARAMS(BOOST_PP_INC(n), typename U) > class U \ 5002ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh > \ 5012ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh struct BOOST_MPL_HAS_MEMBER_INTROSPECTION_SUBSTITUTE_NAME_WITH_TEMPLATE_SFINAE( \ 5022ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh args, n \ 5032ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh ) { \ 5042ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh typedef \ 5052ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh BOOST_MPL_HAS_MEMBER_INTROSPECTION_SUBSTITUTE_TAG_NAME(args) \ 5062ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh type; \ 5072ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh }; \ 5082ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh /**/ 5092ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh 5102ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh# define BOOST_MPL_HAS_MEMBER_SUBSTITUTE_WITH_TEMPLATE_SFINAE( \ 5112ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh args, substitute_macro \ 5122ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh ) \ 5132ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh typedef void \ 5142ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh BOOST_MPL_HAS_MEMBER_INTROSPECTION_SUBSTITUTE_TAG_NAME(args); \ 5152ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh BOOST_PP_REPEAT( \ 5162ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh BOOST_PP_ARRAY_ELEM(2, args) \ 5172ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh , BOOST_MPL_HAS_MEMBER_MULTI_SUBSTITUTE_WITH_TEMPLATE_SFINAE \ 5182ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh , args \ 5192ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh ) \ 5202ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh /**/ 5212ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh 5222ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh# define BOOST_MPL_HAS_MEMBER_REJECT_WITH_TEMPLATE_SFINAE( \ 5232ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh args, member_macro \ 5242ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh ) \ 5252ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh template< \ 5262ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh typename U \ 5272ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh , typename V \ 5282ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh = BOOST_MPL_HAS_MEMBER_INTROSPECTION_SUBSTITUTE_TAG_NAME(args) \ 5292ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh > \ 5302ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh struct BOOST_MPL_HAS_MEMBER_INTROSPECTION_TEST_NAME(args) { \ 5312ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh BOOST_STATIC_CONSTANT(bool, value = false); \ 5322ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh typedef boost::mpl::bool_< value > type; \ 5332ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh }; \ 5342ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh /**/ 5352ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh 5362ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh# define BOOST_MPL_HAS_MEMBER_MULTI_ACCEPT_WITH_TEMPLATE_SFINAE( \ 5372ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh z, n, args \ 5382ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh ) \ 5392ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh template< typename U > \ 5402ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh struct BOOST_MPL_HAS_MEMBER_INTROSPECTION_TEST_NAME(args)< \ 5412ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh U \ 5422ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh , typename \ 5432ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh BOOST_MPL_HAS_MEMBER_INTROSPECTION_SUBSTITUTE_NAME_WITH_TEMPLATE_SFINAE( \ 5442ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh args, n \ 5452ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh )< \ 5462ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh BOOST_MSVC_TYPENAME U::BOOST_PP_ARRAY_ELEM(1, args)< > \ 5472ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh >::type \ 5482ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh > { \ 5492ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh BOOST_STATIC_CONSTANT(bool, value = true); \ 5502ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh typedef boost::mpl::bool_< value > type; \ 5512ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh }; \ 5522ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh /**/ 5532ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh 5542ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh# define BOOST_MPL_HAS_MEMBER_ACCEPT_WITH_TEMPLATE_SFINAE( \ 5552ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh args, member_macro \ 5562ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh ) \ 5572ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh BOOST_PP_REPEAT( \ 5582ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh BOOST_PP_ARRAY_ELEM(2, args) \ 5592ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh , BOOST_MPL_HAS_MEMBER_MULTI_ACCEPT_WITH_TEMPLATE_SFINAE \ 5602ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh , args \ 5612ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh ) \ 5622ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh /**/ 5632ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh 5642ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh# define BOOST_MPL_HAS_MEMBER_INTROSPECT_WITH_TEMPLATE_SFINAE( \ 5652ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh args, substitute_macro, member_macro \ 5662ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh ) \ 5672ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh BOOST_MPL_HAS_MEMBER_REJECT_WITH_TEMPLATE_SFINAE(args, member_macro) \ 5682ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh BOOST_MPL_HAS_MEMBER_ACCEPT_WITH_TEMPLATE_SFINAE(args, member_macro) \ 5692ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh template< typename U > \ 5702ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh struct BOOST_MPL_HAS_MEMBER_INTROSPECTION_NAME(args) \ 5712ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh : BOOST_MPL_HAS_MEMBER_INTROSPECTION_TEST_NAME(args)< U > { \ 5722ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh }; \ 5732ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh /**/ 5742ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh 5752ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh// BOOST_MPL_HAS_MEMBER_WITH_TEMPLATE_SFINAE expands to the full 5762ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh// implementation of the template-based metafunction. Compile with -E 5772ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh// to see the preprocessor output for this macro. 5782ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh// 5792ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh// Note that if BOOST_MPL_HAS_XXX_NEEDS_NAMESPACE_LEVEL_SUBSTITUTE is 5802ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh// defined BOOST_MPL_HAS_MEMBER_SUBSTITUTE_WITH_TEMPLATE_SFINAE needs 5812ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh// to be expanded at namespace level before 5822ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh// BOOST_MPL_HAS_MEMBER_WITH_TEMPLATE_SFINAE can be used. 5832ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh# define BOOST_MPL_HAS_MEMBER_WITH_TEMPLATE_SFINAE( \ 5842ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh args, substitute_macro, member_macro \ 5852ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh ) \ 5862ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh BOOST_MPL_HAS_MEMBER_SUBSTITUTE_WITH_TEMPLATE_SFINAE( \ 5872ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh args, substitute_macro \ 5882ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh ) \ 5892ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh BOOST_MPL_HAS_MEMBER_IMPLEMENTATION( \ 5902ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh args \ 5912ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh , BOOST_MPL_HAS_MEMBER_INTROSPECT_WITH_TEMPLATE_SFINAE \ 5922ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh , substitute_macro \ 5932ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh , member_macro \ 5942ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh ) \ 5952ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh /**/ 5962ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh 5972ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh# endif // BOOST_MPL_HAS_XXX_NEEDS_TEMPLATE_SFINAE 5982ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh 5992ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh// Note: In the current implementation the parameter and access macros 6002ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh// are no longer expanded. 6012ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh# if !BOOST_WORKAROUND(BOOST_MSVC, <= 1400) 6022ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh# define BOOST_MPL_HAS_XXX_TEMPLATE_NAMED_DEF(trait, name, default_) \ 6032ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh BOOST_MPL_HAS_MEMBER_WITH_FUNCTION_SFINAE( \ 6042ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh ( 4, ( trait, name, BOOST_MPL_LIMIT_METAFUNCTION_ARITY, default_ ) ) \ 6052ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh , BOOST_MPL_HAS_MEMBER_TEMPLATE_SUBSTITUTE_PARAMETER \ 6062ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh , BOOST_MPL_HAS_MEMBER_TEMPLATE_ACCESS \ 6072ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh ) \ 6082ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh /**/ 6092ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh# else 6102ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh# define BOOST_MPL_HAS_XXX_TEMPLATE_NAMED_DEF(trait, name, default_) \ 6112ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh BOOST_MPL_HAS_MEMBER_WITH_TEMPLATE_SFINAE( \ 6122ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh ( 4, ( trait, name, BOOST_MPL_LIMIT_METAFUNCTION_ARITY, default_ ) ) \ 6132ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh , BOOST_MPL_HAS_MEMBER_TEMPLATE_SUBSTITUTE_PARAMETER \ 6142ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh , BOOST_MPL_HAS_MEMBER_TEMPLATE_ACCESS \ 6152ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh ) \ 6162ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh /**/ 6172ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh# endif 6182ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh 6192ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh#else // BOOST_MPL_CFG_NO_HAS_XXX_TEMPLATE 6202ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh 6212ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh// placeholder implementation 6222ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh 6232ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh# define BOOST_MPL_HAS_XXX_TEMPLATE_NAMED_DEF(trait, name, default_) \ 6242ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh template< typename T \ 6252ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh , typename fallback_ = boost::mpl::bool_< default_ > > \ 6262ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh struct trait { \ 6272ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh BOOST_STATIC_CONSTANT(bool, value = fallback_::value); \ 6282ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh typedef fallback_ type; \ 6292ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh }; \ 6302ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh /**/ 6312ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh 6322ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh#endif // BOOST_MPL_CFG_NO_HAS_XXX_TEMPLATE 6332ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh 6342ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh# define BOOST_MPL_HAS_XXX_TEMPLATE_DEF(name) \ 6352ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh BOOST_MPL_HAS_XXX_TEMPLATE_NAMED_DEF( \ 6362ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh BOOST_PP_CAT(has_, name), name, false \ 6372ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh ) \ 6382ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh /**/ 6392ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh 6402ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh#endif // BOOST_MPL_HAS_XXX_HPP_INCLUDED 641