1 /*=============================================================================
2 Copyright (c) 2001-2014 Joel de Guzman
3 http://spirit.sourceforge.net/
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
11 #include <boost/spirit/home/x3/support/unused.hpp>
12 #include <boost/mpl/identity.hpp>
14 namespace boost { namespace spirit { namespace x3
16 template <typename ID, typename T, typename Next = unused_type>
19 context(T& val, Next const& next)
20 : val(val), next(next) {}
22 T& get(mpl::identity<ID>) const
27 template <typename ID_>
28 decltype(auto) get(ID_ id) const
37 template <typename ID, typename T>
38 struct context<ID, T, unused_type>
43 context(T& val, unused_type)
46 T& get(mpl::identity<ID>) const
51 template <typename ID_>
52 unused_type get(ID_) const
60 template <typename Tag, typename Context>
61 inline decltype(auto) get(Context const& context)
63 return context.get(mpl::identity<Tag>());
66 template <typename ID, typename T, typename Next>
67 inline context<ID, T, Next> make_context(T& val, Next const& next)
72 template <typename ID, typename T>
73 inline context<ID, T> make_context(T& val)
80 template <typename ID, typename T, typename Next, typename FoundVal>
82 make_unique_context(T& /* val */, Next const& next, FoundVal&)
87 template <typename ID, typename T, typename Next>
88 inline context<ID, T, Next>
89 make_unique_context(T& val, Next const& next, unused_type)
95 template <typename ID, typename T, typename Next>
97 make_unique_context(T& val, Next const& next)
99 return detail::make_unique_context<ID>(val, next, x3::get<ID>(next));