comparison DEPENDENCIES/generic/include/boost/spirit/home/x3/support/context.hpp @ 102:f46d142149f5

Whoops, finish that update
author Chris Cannam
date Mon, 07 Sep 2015 11:13:41 +0100
parents
children
comparison
equal deleted inserted replaced
101:c530137014c0 102:f46d142149f5
1 /*=============================================================================
2 Copyright (c) 2001-2014 Joel de Guzman
3 http://spirit.sourceforge.net/
4
5 Distributed under the Boost Software License, Version 1.0. (See accompanying
6 file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
7 =============================================================================*/
8 #if !defined(BOOST_SPIRIT_X3_CONTEXT_JAN_4_2012_1215PM)
9 #define BOOST_SPIRIT_X3_CONTEXT_JAN_4_2012_1215PM
10
11 #if defined(_MSC_VER)
12 #pragma once
13 #endif
14
15 #include <boost/spirit/home/x3/support/unused.hpp>
16 #include <boost/mpl/identity.hpp>
17
18 namespace boost { namespace spirit { namespace x3
19 {
20 template <typename ID, typename T, typename Next = unused_type>
21 struct context
22 {
23 context(T& val, Next const& next)
24 : val(val), next(next) {}
25
26 template <typename ID_, typename Unused = void>
27 struct get_result
28 {
29 typedef typename Next::template get_result<ID_>::type type;
30 };
31
32 template <typename Unused>
33 struct get_result<mpl::identity<ID>, Unused>
34 {
35 typedef T& type;
36 };
37
38 T& get(mpl::identity<ID>) const
39 {
40 return val;
41 }
42
43 template <typename ID_>
44 typename Next::template get_result<ID_>::type
45 get(ID_ id) const
46 {
47 return next.get(id);
48 }
49
50 T& val;
51 Next const& next;
52 };
53
54 template <typename ID, typename T>
55 struct context<ID, T, unused_type>
56 {
57 context(T& val)
58 : val(val) {}
59
60 context(T& val, unused_type)
61 : val(val) {}
62
63 template <typename ID_, typename Unused = void>
64 struct get_result
65 {
66 typedef unused_type type;
67 };
68
69 template <typename Unused>
70 struct get_result<mpl::identity<ID>, Unused>
71 {
72 typedef T& type;
73 };
74
75 T& get(mpl::identity<ID>) const
76 {
77 return val;
78 }
79
80 template <typename ID_>
81 unused_type
82 get(ID_) const
83 {
84 return unused;
85 }
86
87 T& val;
88 };
89
90 template <typename Tag, typename Context>
91 inline auto
92 get(Context const& context)
93 -> decltype(context.get(mpl::identity<Tag>()))
94 {
95 return context.get(mpl::identity<Tag>());
96 }
97
98 template <typename ID, typename T, typename Next>
99 inline context<ID, T, Next> make_context(T& val, Next const& next)
100 {
101 return context<ID, T, Next>(val, next);
102 }
103
104 template <typename ID, typename T>
105 inline context<ID, T> make_context(T& val)
106 {
107 return context<ID, T>(val);
108 }
109
110 namespace detail
111 {
112 template <typename ID, typename T, typename Next, typename FoundVal>
113 inline Next const&
114 make_unique_context(T& val, Next const& next, FoundVal&)
115 {
116 return next;
117 }
118
119 template <typename ID, typename T, typename Next>
120 inline context<ID, T, Next>
121 make_unique_context(T& val, Next const& next, unused_type)
122 {
123 return context<ID, T, Next>(val, next);
124 }
125 }
126
127 template <typename ID, typename T, typename Next>
128 inline auto
129 make_unique_context(T& val, Next const& next)
130 {
131 return detail::make_unique_context<ID>(val, next, x3::get<ID>(next));
132 }
133 }}}
134
135 #endif