]> git.proxmox.com Git - ceph.git/blob - ceph/src/boost/libs/parameter/test/literate/deduced-template-parameters0.cpp
add subtree-ish sources for 12.0.3
[ceph.git] / ceph / src / boost / libs / parameter / test / literate / deduced-template-parameters0.cpp
1
2 #include <boost/parameter.hpp>
3 #include <boost/mpl/is_sequence.hpp>
4 #include <boost/noncopyable.hpp>
5 #include <memory>
6
7 using namespace boost::parameter;
8 using boost::mpl::_;
9
10 namespace boost { namespace python {
11
12 BOOST_PARAMETER_TEMPLATE_KEYWORD(class_type)
13 BOOST_PARAMETER_TEMPLATE_KEYWORD(base_list)
14 BOOST_PARAMETER_TEMPLATE_KEYWORD(held_type)
15 BOOST_PARAMETER_TEMPLATE_KEYWORD(copyable)
16
17 }}
18 namespace boost { namespace python {
19
20 namespace detail { struct bases_base {}; }
21
22 template <class A0 = void, class A1 = void, class A2 = void >
23 struct bases : detail::bases_base
24 {};
25
26 }}
27
28
29 #include <boost/type_traits/is_class.hpp>
30 namespace boost { namespace python {
31 typedef parameter::parameters<
32 required<tag::class_type, is_class<_> >
33
34 , parameter::optional<
35 deduced<tag::base_list>
36 , is_base_and_derived<detail::bases_base,_>
37 >
38
39 , parameter::optional<
40 deduced<tag::held_type>
41 , mpl::not_<
42 mpl::or_<
43 is_base_and_derived<detail::bases_base,_>
44 , is_same<noncopyable,_>
45 >
46 >
47 >
48
49 , parameter::optional<deduced<tag::copyable>, is_same<noncopyable,_> >
50
51 > class_signature;
52 template <
53 class A0
54 , class A1 = parameter::void_
55 , class A2 = parameter::void_
56 , class A3 = parameter::void_
57 >
58 struct class_
59 {
60 // Create ArgumentPack
61 typedef typename
62 class_signature::bind<A0,A1,A2,A3>::type
63 args;
64
65 // Extract first logical parameter.
66 typedef typename parameter::value_type<
67 args, tag::class_type>::type class_type;
68
69 typedef typename parameter::value_type<
70 args, tag::base_list, bases<> >::type base_list;
71
72 typedef typename parameter::value_type<
73 args, tag::held_type, class_type>::type held_type;
74
75 typedef typename parameter::value_type<
76 args, tag::copyable, void>::type copyable;
77 };
78
79 }}
80
81
82
83 struct B {};
84 struct D {};
85
86 using boost::python::bases;
87 typedef boost::python::class_<B, boost::noncopyable> c1;
88
89 typedef boost::python::class_<D, std::auto_ptr<D>, bases<B> > c2;
90 BOOST_MPL_ASSERT((boost::is_same<c1::class_type, B>));
91 BOOST_MPL_ASSERT((boost::is_same<c1::base_list, bases<> >));
92 BOOST_MPL_ASSERT((boost::is_same<c1::held_type, B>));
93 BOOST_MPL_ASSERT((
94 boost::is_same<c1::copyable, boost::noncopyable>
95 ));
96
97 BOOST_MPL_ASSERT((boost::is_same<c2::class_type, D>));
98 BOOST_MPL_ASSERT((boost::is_same<c2::base_list, bases<B> >));
99 BOOST_MPL_ASSERT((
100 boost::is_same<c2::held_type, std::auto_ptr<D> >
101 ));
102 BOOST_MPL_ASSERT((boost::is_same<c2::copyable, void>));
103