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