]>
Commit | Line | Data |
---|---|---|
7c673cae FG |
1 | /*============================================================================= |
2 | Copyright (c) 2001-2011 Joel de Guzman | |
3 | Copyright (c) 2001-2011 Hartmut Kaiser | |
4 | Copyright (c) 2009 Francois Barel | |
5 | ||
6 | Distributed under the Boost Software License, Version 1.0. (See accompanying | |
7 | file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) | |
8 | ==============================================================================*/ | |
9 | #if !defined(BOOST_SPIRIT_EXTRACT_PARAM_AUGUST_08_2009_0848AM) | |
10 | #define BOOST_SPIRIT_EXTRACT_PARAM_AUGUST_08_2009_0848AM | |
11 | ||
12 | #if defined(_MSC_VER) | |
13 | #pragma once | |
14 | #endif | |
15 | ||
16 | #include <boost/spirit/home/support/meta_compiler.hpp> | |
17 | #include <boost/spirit/home/support/nonterminal/locals.hpp> | |
18 | #include <boost/spirit/home/support/unused.hpp> | |
19 | #include <boost/spirit/home/support/common_terminals.hpp> | |
20 | ||
21 | #include <boost/function_types/is_function.hpp> | |
22 | #include <boost/function_types/parameter_types.hpp> | |
23 | #include <boost/function_types/result_type.hpp> | |
24 | #include <boost/fusion/include/as_list.hpp> | |
25 | #include <boost/fusion/include/as_vector.hpp> | |
26 | #include <boost/mpl/deref.hpp> | |
27 | #include <boost/mpl/end.hpp> | |
28 | #include <boost/mpl/eval_if.hpp> | |
29 | #include <boost/mpl/find_if.hpp> | |
30 | #include <boost/mpl/identity.hpp> | |
31 | #include <boost/mpl/if.hpp> | |
32 | #include <boost/mpl/or.hpp> | |
33 | #include <boost/mpl/and.hpp> | |
34 | #include <boost/mpl/placeholders.hpp> | |
35 | #include <boost/type_traits/is_same.hpp> | |
36 | ||
37 | namespace boost { namespace spirit { namespace detail | |
38 | { | |
39 | /////////////////////////////////////////////////////////////////////////// | |
40 | // Helpers to extract params (locals, attributes, ...) from nonterminal | |
41 | // template arguments | |
42 | /////////////////////////////////////////////////////////////////////////// | |
43 | template <typename Types, typename Pred, typename Default> | |
44 | struct extract_param | |
45 | { | |
46 | typedef typename mpl::find_if<Types, Pred>::type pos; | |
47 | ||
48 | typedef typename | |
49 | mpl::eval_if< | |
50 | is_same<pos, typename mpl::end<Types>::type> | |
51 | , mpl::identity<Default> | |
52 | , mpl::deref<pos> | |
53 | >::type | |
54 | type; | |
55 | }; | |
56 | ||
57 | /////////////////////////////////////////////////////////////////////////// | |
58 | template <typename Types> | |
59 | struct extract_locals | |
60 | : fusion::result_of::as_vector< | |
61 | typename extract_param< | |
62 | Types | |
63 | , is_locals<mpl::_> | |
64 | , locals<> | |
65 | >::type | |
66 | > | |
67 | {}; | |
68 | ||
69 | /////////////////////////////////////////////////////////////////////////// | |
70 | template <typename Domain, typename Types> | |
71 | struct extract_component | |
72 | : spirit::result_of::compile< | |
73 | Domain | |
74 | , typename extract_param< | |
75 | Types | |
76 | , traits::matches<Domain, mpl::_> | |
77 | , unused_type | |
78 | >::type | |
79 | > | |
80 | {}; | |
81 | ||
82 | /////////////////////////////////////////////////////////////////////////// | |
83 | template <typename T> | |
84 | struct make_function_type : mpl::identity<T()> {}; | |
85 | ||
86 | /////////////////////////////////////////////////////////////////////////// | |
87 | template <typename Types, typename Encoding, typename Domain> | |
88 | struct extract_sig | |
89 | { | |
90 | typedef typename | |
91 | extract_param< | |
92 | Types | |
93 | , mpl::or_< | |
94 | function_types::is_function<mpl::_> | |
95 | , mpl::and_< | |
96 | mpl::not_<is_locals<mpl::_> > | |
97 | , mpl::not_<is_same<mpl::_, Encoding> > | |
98 | , mpl::not_<traits::matches<Domain, mpl::_> > | |
99 | , mpl::not_<is_same<mpl::_, unused_type> > | |
100 | > | |
101 | > | |
102 | , void() | |
103 | >::type | |
104 | attr_of_ftype; | |
105 | ||
106 | typedef typename | |
107 | mpl::eval_if< | |
108 | function_types::is_function<attr_of_ftype> | |
109 | , mpl::identity<attr_of_ftype> | |
110 | , make_function_type<attr_of_ftype> | |
111 | >::type | |
112 | type; | |
113 | }; | |
114 | ||
115 | template <typename Sig> | |
116 | struct attr_from_sig | |
117 | { | |
118 | typedef typename function_types::result_type<Sig>::type attr; | |
119 | ||
120 | typedef typename | |
121 | mpl::if_< | |
122 | is_same<attr, void> | |
123 | , unused_type | |
124 | , attr | |
125 | >::type | |
126 | type; | |
127 | }; | |
128 | ||
129 | template <typename Sig> | |
130 | struct params_from_sig | |
131 | { | |
132 | typedef typename function_types::parameter_types<Sig>::type params; | |
133 | ||
134 | typedef typename fusion::result_of::as_list<params>::type type; | |
135 | }; | |
136 | ||
137 | /////////////////////////////////////////////////////////////////////////// | |
138 | template <typename Types> | |
139 | struct extract_encoding | |
140 | : extract_param< | |
141 | Types | |
142 | , is_char_encoding<mpl::_> | |
143 | , unused_type | |
144 | > | |
145 | {}; | |
146 | }}} | |
147 | ||
148 | #endif |