// Copyright David Abrahams 2002. // Distributed under the Boost Software License, Version 1.0. (See // accompanying file LICENSE_1_0.txt or copy at // http://www.boost.org/LICENSE_1_0.txt) #ifndef BASES_DWA2002321_HPP # define BASES_DWA2002321_HPP # include # include # include # include # include # include # include namespace boost { namespace python { # define BOOST_PYTHON_BASE_PARAMS BOOST_PP_ENUM_PARAMS_Z(1, BOOST_PYTHON_MAX_BASES, Base) // A type list for specifying bases template < BOOST_PP_ENUM_PARAMS_WITH_A_DEFAULT(BOOST_PYTHON_MAX_BASES, typename Base, mpl::void_) > struct bases : detail::type_list< BOOST_PYTHON_BASE_PARAMS >::type {}; namespace detail { # ifndef BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION template struct specifies_bases : mpl::false_ { }; template < BOOST_PP_ENUM_PARAMS_Z(1, BOOST_PYTHON_MAX_BASES, class Base) > struct specifies_bases< bases< BOOST_PYTHON_BASE_PARAMS > > : mpl::true_ { }; # else template < BOOST_PP_ENUM_PARAMS(BOOST_PYTHON_MAX_BASES, class Base) > static char is_bases_helper(bases< BOOST_PYTHON_BASE_PARAMS > const&); static char (& is_bases_helper(...) )[256]; template struct specifies_bases { private: static typename add_reference::type make(); BOOST_STATIC_CONSTANT(bool, non_ref = !is_reference::value); public: BOOST_STATIC_CONSTANT(bool, value = non_ref & (sizeof(is_bases_helper(make())) == 1)); typedef mpl::bool_ type; }; # endif template > struct select_bases : mpl::if_< specifies_bases , T , Prev > { }; } # undef BOOST_PYTHON_BASE_PARAMS }} // namespace boost::python #endif // BASES_DWA2002321_HPP