comparison DEPENDENCIES/generic/include/boost/python/detail/def_helper.hpp @ 16:2665513ce2d3

Add boost headers
author Chris Cannam
date Tue, 05 Aug 2014 11:11:38 +0100
parents
children
comparison
equal deleted inserted replaced
15:663ca0da4350 16:2665513ce2d3
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 DEF_HELPER_DWA200287_HPP
6 # define DEF_HELPER_DWA200287_HPP
7
8 # include <boost/python/args.hpp>
9 # include <boost/type_traits/ice.hpp>
10 # include <boost/type_traits/same_traits.hpp>
11 # include <boost/python/detail/indirect_traits.hpp>
12 # include <boost/mpl/not.hpp>
13 # include <boost/mpl/and.hpp>
14 # include <boost/mpl/or.hpp>
15 # include <boost/type_traits/add_reference.hpp>
16 # include <boost/mpl/lambda.hpp>
17 # include <boost/mpl/apply.hpp>
18 # include <boost/tuple/tuple.hpp>
19 # include <boost/python/detail/not_specified.hpp>
20 # include <boost/python/detail/def_helper_fwd.hpp>
21
22 namespace boost { namespace python {
23
24 struct default_call_policies;
25
26 namespace detail
27 {
28 // tuple_extract<Tuple,Predicate>::extract(t) returns the first
29 // element of a Tuple whose type E satisfies the given Predicate
30 // applied to add_reference<E>. The Predicate must be an MPL
31 // metafunction class.
32 template <class Tuple, class Predicate>
33 struct tuple_extract;
34
35 // Implementation class for when the tuple's head type does not
36 // satisfy the Predicate
37 template <bool matched>
38 struct tuple_extract_impl
39 {
40 template <class Tuple, class Predicate>
41 struct apply
42 {
43 typedef typename Tuple::head_type result_type;
44
45 static typename Tuple::head_type extract(Tuple const& x)
46 {
47 return x.get_head();
48 }
49 };
50 };
51
52 // Implementation specialization for when the tuple's head type
53 // satisfies the predicate
54 template <>
55 struct tuple_extract_impl<false>
56 {
57 template <class Tuple, class Predicate>
58 struct apply
59 {
60 // recursive application of tuple_extract on the tail of the tuple
61 typedef tuple_extract<typename Tuple::tail_type, Predicate> next;
62 typedef typename next::result_type result_type;
63
64 static result_type extract(Tuple const& x)
65 {
66 return next::extract(x.get_tail());
67 }
68 };
69 };
70
71 // A metafunction which selects a version of tuple_extract_impl to
72 // use for the implementation of tuple_extract
73 template <class Tuple, class Predicate>
74 struct tuple_extract_base_select
75 {
76 typedef typename Tuple::head_type head_type;
77 typedef typename mpl::apply1<Predicate, typename add_reference<head_type>::type>::type match_t;
78 BOOST_STATIC_CONSTANT(bool, match = match_t::value);
79 typedef typename tuple_extract_impl<match>::template apply<Tuple,Predicate> type;
80 };
81
82 template <class Tuple, class Predicate>
83 struct tuple_extract
84 : tuple_extract_base_select<
85 Tuple
86 , typename mpl::lambda<Predicate>::type
87 >::type
88 {
89 };
90
91
92 //
93 // Specialized extractors for the docstring, keywords, CallPolicies,
94 // and default implementation of virtual functions
95 //
96
97 template <class Tuple>
98 struct doc_extract
99 : tuple_extract<
100 Tuple
101 , mpl::not_<
102 mpl::or_<
103 indirect_traits::is_reference_to_class<mpl::_1>
104 , indirect_traits::is_reference_to_member_function_pointer<mpl::_1 >
105 >
106 >
107 >
108 {
109 };
110
111 template <class Tuple>
112 struct keyword_extract
113 : tuple_extract<Tuple, is_reference_to_keywords<mpl::_1 > >
114 {
115 };
116
117 template <class Tuple>
118 struct policy_extract
119 : tuple_extract<
120 Tuple
121 , mpl::and_<
122 mpl::not_<is_same<not_specified const&,mpl::_1> >
123 , indirect_traits::is_reference_to_class<mpl::_1 >
124 , mpl::not_<is_reference_to_keywords<mpl::_1 > >
125 >
126 >
127 {
128 };
129
130 template <class Tuple>
131 struct default_implementation_extract
132 : tuple_extract<
133 Tuple
134 , indirect_traits::is_reference_to_member_function_pointer<mpl::_1 >
135 >
136 {
137 };
138
139 //
140 // A helper class for decoding the optional arguments to def()
141 // invocations, which can be supplied in any order and are
142 // discriminated by their type properties. The template parameters
143 // are expected to be the types of the actual (optional) arguments
144 // passed to def().
145 //
146 template <class T1, class T2, class T3, class T4>
147 struct def_helper
148 {
149 // A tuple type which begins with references to the supplied
150 // arguments and ends with actual representatives of the default
151 // types.
152 typedef boost::tuples::tuple<
153 T1 const&
154 , T2 const&
155 , T3 const&
156 , T4 const&
157 , default_call_policies
158 , detail::keywords<0>
159 , char const*
160 , void(not_specified::*)() // A function pointer type which is never an
161 // appropriate default implementation
162 > all_t;
163
164 // Constructors; these initialize an member of the tuple type
165 // shown above.
166 def_helper(T1 const& a1) : m_all(a1,m_nil,m_nil,m_nil) {}
167 def_helper(T1 const& a1, T2 const& a2) : m_all(a1,a2,m_nil,m_nil) {}
168 def_helper(T1 const& a1, T2 const& a2, T3 const& a3) : m_all(a1,a2,a3,m_nil) {}
169 def_helper(T1 const& a1, T2 const& a2, T3 const& a3, T4 const& a4) : m_all(a1,a2,a3,a4) {}
170
171 private: // types
172 typedef typename default_implementation_extract<all_t>::result_type default_implementation_t;
173
174 public: // Constants which can be used for static assertions.
175
176 // Users must not supply a default implementation for non-class
177 // methods.
178 BOOST_STATIC_CONSTANT(
179 bool, has_default_implementation = (
180 !is_same<default_implementation_t, void(not_specified::*)()>::value));
181
182 public: // Extractor functions which pull the appropriate value out
183 // of the tuple
184 char const* doc() const
185 {
186 return doc_extract<all_t>::extract(m_all);
187 }
188
189 typename keyword_extract<all_t>::result_type keywords() const
190 {
191 return keyword_extract<all_t>::extract(m_all);
192 }
193
194 typename policy_extract<all_t>::result_type policies() const
195 {
196 return policy_extract<all_t>::extract(m_all);
197 }
198
199 default_implementation_t default_implementation() const
200 {
201 return default_implementation_extract<all_t>::extract(m_all);
202 }
203
204 private: // data members
205 all_t m_all;
206 not_specified m_nil; // for filling in not_specified slots
207 };
208 }
209
210 }} // namespace boost::python::detail
211
212 #endif // DEF_HELPER_DWA200287_HPP