subcontext.hpp 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  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/spirit/home/x3/support/context.hpp>
  11. #include <boost/spirit/home/x3/support/unused.hpp>
  12. namespace boost { namespace spirit { namespace x3
  13. {
  14. template <typename... T>
  15. struct subcontext;
  16. template <>
  17. struct subcontext<>
  18. {
  19. template <typename Context>
  20. subcontext(Context const& /*context*/)
  21. {}
  22. template <typename ID_>
  23. unused_type
  24. get(ID_) const
  25. {
  26. return unused;
  27. }
  28. };
  29. template <typename T>
  30. struct subcontext<T>
  31. : context<typename T::first_type, typename T::second_type>
  32. {
  33. typedef context<
  34. typename T::first_type, typename T::second_type
  35. > context_type;
  36. template <typename Context>
  37. subcontext(Context const& context)
  38. : context_type(x3::get<typename T::first_type>(context))
  39. {}
  40. using context_type::get;
  41. };
  42. template <typename T, typename... Tail>
  43. struct subcontext<T, Tail...>
  44. : subcontext<Tail...>
  45. , context<
  46. typename T::first_type, typename T::second_type
  47. , subcontext<Tail...>
  48. >
  49. {
  50. typedef subcontext<Tail...> base_type;
  51. typedef context<
  52. typename T::first_type, typename T::second_type
  53. , base_type
  54. > context_type;
  55. template <typename Context>
  56. subcontext(Context const& context)
  57. : base_type(context)
  58. , context_type(
  59. x3::get<typename T::first_type>(context)
  60. , *static_cast<base_type*>(this))
  61. {}
  62. using context_type::get;
  63. };
  64. }}}
  65. #endif