Mercurial > hg > vamp-build-and-test
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 |