|
1 // Copyright David Abrahams 2002. |
|
2 // Distributed under the Boost Software License, Version 1.0. (See |
|
3 // accompanying file LICENSE_1_0.txt or copy at |
|
4 // http://www.boost.org/LICENSE_1_0.txt) |
|
5 #ifndef BASES_DWA2002321_HPP |
|
6 # define BASES_DWA2002321_HPP |
|
7 |
|
8 # include <boost/python/detail/prefix.hpp> |
|
9 # include <boost/type_traits/object_traits.hpp> |
|
10 # include <boost/python/detail/type_list.hpp> |
|
11 # include <boost/mpl/if.hpp> |
|
12 # include <boost/mpl/bool.hpp> |
|
13 # include <boost/preprocessor/enum_params_with_a_default.hpp> |
|
14 # include <boost/preprocessor/enum_params.hpp> |
|
15 |
|
16 namespace boost { namespace python { |
|
17 |
|
18 # define BOOST_PYTHON_BASE_PARAMS BOOST_PP_ENUM_PARAMS_Z(1, BOOST_PYTHON_MAX_BASES, Base) |
|
19 |
|
20 // A type list for specifying bases |
|
21 template < BOOST_PP_ENUM_PARAMS_WITH_A_DEFAULT(BOOST_PYTHON_MAX_BASES, typename Base, mpl::void_) > |
|
22 struct bases : detail::type_list< BOOST_PYTHON_BASE_PARAMS >::type |
|
23 {}; |
|
24 |
|
25 namespace detail |
|
26 { |
|
27 # ifndef BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION |
|
28 template <class T> struct specifies_bases |
|
29 : mpl::false_ |
|
30 { |
|
31 }; |
|
32 |
|
33 template < BOOST_PP_ENUM_PARAMS_Z(1, BOOST_PYTHON_MAX_BASES, class Base) > |
|
34 struct specifies_bases< bases< BOOST_PYTHON_BASE_PARAMS > > |
|
35 : mpl::true_ |
|
36 { |
|
37 }; |
|
38 # else |
|
39 template < BOOST_PP_ENUM_PARAMS(BOOST_PYTHON_MAX_BASES, class Base) > |
|
40 static char is_bases_helper(bases< BOOST_PYTHON_BASE_PARAMS > const&); |
|
41 |
|
42 static char (& is_bases_helper(...) )[256]; |
|
43 |
|
44 template <class T> |
|
45 struct specifies_bases |
|
46 { |
|
47 private: |
|
48 static typename add_reference<T>::type make(); |
|
49 BOOST_STATIC_CONSTANT(bool, non_ref = !is_reference<T>::value); |
|
50 public: |
|
51 BOOST_STATIC_CONSTANT(bool, value = non_ref & (sizeof(is_bases_helper(make())) == 1)); |
|
52 typedef mpl::bool_<value> type; |
|
53 }; |
|
54 # endif |
|
55 template <class T, class Prev = bases<> > |
|
56 struct select_bases |
|
57 : mpl::if_< |
|
58 specifies_bases<T> |
|
59 , T |
|
60 , Prev |
|
61 > |
|
62 { |
|
63 }; |
|
64 } |
|
65 # undef BOOST_PYTHON_BASE_PARAMS |
|
66 }} // namespace boost::python |
|
67 |
|
68 #endif // BASES_DWA2002321_HPP |