1 /*============================================================================= 2 Copyright (c) 2001-2014 Joel de Guzman 3 Copyright (c) 2013 Agust�n Berg� 4 http://spirit.sourceforge.net/ 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_X3_SUBCONTEXT_APR_15_2013_0840AM) 10 #define BOOST_SPIRIT_X3_SUBCONTEXT_APR_15_2013_0840AM 11 12 #include <boost/fusion/support/pair.hpp> 13 #include <boost/spirit/home/x3/support/context.hpp> 14 #include <boost/spirit/home/x3/support/unused.hpp> 15 16 namespace boost { namespace spirit { namespace x3 17 { 18 template <typename... T> 19 struct subcontext; 20 21 template <> 22 struct subcontext<> 23 { 24 template <typename Context> subcontextboost::spirit::x3::subcontext25 subcontext(Context const& /*context*/) 26 {} 27 28 template <typename ID_> 29 unused_type getboost::spirit::x3::subcontext30 get(ID_) const 31 { 32 return unused; 33 } 34 }; 35 36 template <typename T> 37 struct subcontext<T> 38 : context<typename T::first_type, typename T::second_type> 39 { 40 typedef context< 41 typename T::first_type, typename T::second_type 42 > context_type; 43 44 template <typename Context> subcontextboost::spirit::x3::subcontext45 subcontext(Context const& context) 46 : context_type(x3::get<typename T::first_type>(context)) 47 {} 48 49 using context_type::get; 50 }; 51 52 template <typename T, typename... Tail> 53 struct subcontext<T, Tail...> 54 : subcontext<Tail...> 55 , context< 56 typename T::first_type, typename T::second_type 57 , subcontext<Tail...> 58 > 59 { 60 typedef subcontext<Tail...> base_type; 61 typedef context< 62 typename T::first_type, typename T::second_type 63 , base_type 64 > context_type; 65 66 template <typename Context> subcontextboost::spirit::x3::subcontext67 subcontext(Context const& context) 68 : base_type(context) 69 , context_type( 70 x3::get<typename T::first_type>(context) 71 , *static_cast<base_type*>(this)) 72 {} 73 74 using context_type::get; 75 }; 76 77 }}} 78 79 #endif 80