Chris@102
|
1 /*=============================================================================
|
Chris@102
|
2 Copyright (c) 2001-2014 Joel de Guzman
|
Chris@102
|
3 Copyright (c) 2013 Agustín Bergé
|
Chris@102
|
4 http://spirit.sourceforge.net/
|
Chris@102
|
5
|
Chris@102
|
6 Distributed under the Boost Software License, Version 1.0. (See accompanying
|
Chris@102
|
7 file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
|
Chris@102
|
8 =============================================================================*/
|
Chris@102
|
9 #if !defined(BOOST_SPIRIT_X3_SUBCONTEXT_APR_15_2013_0840AM)
|
Chris@102
|
10 #define BOOST_SPIRIT_X3_SUBCONTEXT_APR_15_2013_0840AM
|
Chris@102
|
11
|
Chris@102
|
12 #if defined(_MSC_VER)
|
Chris@102
|
13 #pragma once
|
Chris@102
|
14 #endif
|
Chris@102
|
15
|
Chris@102
|
16 #include <boost/fusion/support/pair.hpp>
|
Chris@102
|
17 #include <boost/spirit/home/x3/support/context.hpp>
|
Chris@102
|
18 #include <boost/spirit/home/x3/support/unused.hpp>
|
Chris@102
|
19
|
Chris@102
|
20 namespace boost { namespace spirit { namespace x3
|
Chris@102
|
21 {
|
Chris@102
|
22 template <typename... T>
|
Chris@102
|
23 struct subcontext;
|
Chris@102
|
24
|
Chris@102
|
25 template <>
|
Chris@102
|
26 struct subcontext<>
|
Chris@102
|
27 {
|
Chris@102
|
28 template <typename Context>
|
Chris@102
|
29 subcontext(Context const& /*context*/)
|
Chris@102
|
30 {}
|
Chris@102
|
31
|
Chris@102
|
32 template <typename ID_, typename Unused = void>
|
Chris@102
|
33 struct get_result
|
Chris@102
|
34 {
|
Chris@102
|
35 typedef unused_type type;
|
Chris@102
|
36 };
|
Chris@102
|
37
|
Chris@102
|
38 template <typename ID_>
|
Chris@102
|
39 unused_type
|
Chris@102
|
40 get(ID_) const
|
Chris@102
|
41 {
|
Chris@102
|
42 return unused;
|
Chris@102
|
43 }
|
Chris@102
|
44 };
|
Chris@102
|
45
|
Chris@102
|
46 template <typename T>
|
Chris@102
|
47 struct subcontext<T>
|
Chris@102
|
48 : context<typename T::first_type, typename T::second_type>
|
Chris@102
|
49 {
|
Chris@102
|
50 typedef context<
|
Chris@102
|
51 typename T::first_type, typename T::second_type
|
Chris@102
|
52 > context_type;
|
Chris@102
|
53
|
Chris@102
|
54 template <typename Context>
|
Chris@102
|
55 subcontext(Context const& context)
|
Chris@102
|
56 : context_type(x3::get<typename T::first_type>(context))
|
Chris@102
|
57 {}
|
Chris@102
|
58
|
Chris@102
|
59 using context_type::get;
|
Chris@102
|
60 };
|
Chris@102
|
61
|
Chris@102
|
62 template <typename T, typename... Tail>
|
Chris@102
|
63 struct subcontext<T, Tail...>
|
Chris@102
|
64 : subcontext<Tail...>
|
Chris@102
|
65 , context<
|
Chris@102
|
66 typename T::first_type, typename T::second_type
|
Chris@102
|
67 , subcontext<Tail...>
|
Chris@102
|
68 >
|
Chris@102
|
69 {
|
Chris@102
|
70 typedef subcontext<Tail...> base_type;
|
Chris@102
|
71 typedef context<
|
Chris@102
|
72 typename T::first_type, typename T::second_type
|
Chris@102
|
73 , base_type
|
Chris@102
|
74 > context_type;
|
Chris@102
|
75
|
Chris@102
|
76 template <typename Context>
|
Chris@102
|
77 subcontext(Context const& context)
|
Chris@102
|
78 : base_type(context)
|
Chris@102
|
79 , context_type(
|
Chris@102
|
80 x3::get<typename T::first_type>(context)
|
Chris@102
|
81 , *static_cast<base_type*>(this))
|
Chris@102
|
82 {}
|
Chris@102
|
83
|
Chris@102
|
84 using context_type::get;
|
Chris@102
|
85 };
|
Chris@102
|
86
|
Chris@102
|
87 }}}
|
Chris@102
|
88
|
Chris@102
|
89 #endif
|