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