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