subcontext.hpp 2.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980
  1. /*=============================================================================
  2. Copyright (c) 2001-2014 Joel de Guzman
  3. Copyright (c) 2013 Agustín Bergé
  4. 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_SUBCONTEXT_APR_15_2013_0840AM)
  9. #define BOOST_SPIRIT_X3_SUBCONTEXT_APR_15_2013_0840AM
  10. #include <boost/fusion/support/pair.hpp>
  11. #include <boost/spirit/home/x3/support/context.hpp>
  12. #include <boost/spirit/home/x3/support/unused.hpp>
  13. namespace boost { namespace spirit { namespace x3
  14. {
  15. template <typename... T>
  16. struct subcontext;
  17. template <>
  18. struct subcontext<>
  19. {
  20. template <typename Context>
  21. subcontext(Context const& /*context*/)
  22. {}
  23. template <typename ID_>
  24. unused_type
  25. get(ID_) const
  26. {
  27. return unused;
  28. }
  29. };
  30. template <typename T>
  31. struct subcontext<T>
  32. : context<typename T::first_type, typename T::second_type>
  33. {
  34. typedef context<
  35. typename T::first_type, typename T::second_type
  36. > context_type;
  37. template <typename Context>
  38. subcontext(Context const& context)
  39. : context_type(x3::get<typename T::first_type>(context))
  40. {}
  41. using context_type::get;
  42. };
  43. template <typename T, typename... Tail>
  44. struct subcontext<T, Tail...>
  45. : subcontext<Tail...>
  46. , context<
  47. typename T::first_type, typename T::second_type
  48. , subcontext<Tail...>
  49. >
  50. {
  51. typedef subcontext<Tail...> base_type;
  52. typedef context<
  53. typename T::first_type, typename T::second_type
  54. , base_type
  55. > context_type;
  56. template <typename Context>
  57. subcontext(Context const& context)
  58. : base_type(context)
  59. , context_type(
  60. x3::get<typename T::first_type>(context)
  61. , *static_cast<base_type*>(this))
  62. {}
  63. using context_type::get;
  64. };
  65. }}}
  66. #endif