context.hpp 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103
  1. /*=============================================================================
  2. Copyright (c) 2001-2014 Joel de Guzman
  3. http://spirit.sourceforge.net/
  4. Distributed under the Boost Software License, Version 1.0. (See accompanying
  5. file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
  6. =============================================================================*/
  7. #if !defined(BOOST_SPIRIT_X3_CONTEXT_JAN_4_2012_1215PM)
  8. #define BOOST_SPIRIT_X3_CONTEXT_JAN_4_2012_1215PM
  9. #include <boost/spirit/home/x3/support/unused.hpp>
  10. #include <boost/mpl/identity.hpp>
  11. namespace boost { namespace spirit { namespace x3
  12. {
  13. template <typename ID, typename T, typename Next = unused_type>
  14. struct context
  15. {
  16. context(T& val, Next const& next)
  17. : val(val), next(next) {}
  18. T& get(mpl::identity<ID>) const
  19. {
  20. return val;
  21. }
  22. template <typename ID_>
  23. decltype(auto) get(ID_ id) const
  24. {
  25. return next.get(id);
  26. }
  27. T& val;
  28. Next const& next;
  29. };
  30. template <typename ID, typename T>
  31. struct context<ID, T, unused_type>
  32. {
  33. context(T& val)
  34. : val(val) {}
  35. context(T& val, unused_type)
  36. : val(val) {}
  37. T& get(mpl::identity<ID>) const
  38. {
  39. return val;
  40. }
  41. template <typename ID_>
  42. unused_type get(ID_) const
  43. {
  44. return {};
  45. }
  46. T& val;
  47. };
  48. template <typename Tag, typename Context>
  49. inline decltype(auto) get(Context const& context)
  50. {
  51. return context.get(mpl::identity<Tag>());
  52. }
  53. template <typename ID, typename T, typename Next>
  54. inline context<ID, T, Next> make_context(T& val, Next const& next)
  55. {
  56. return { val, next };
  57. }
  58. template <typename ID, typename T>
  59. inline context<ID, T> make_context(T& val)
  60. {
  61. return { val };
  62. }
  63. namespace detail
  64. {
  65. template <typename ID, typename T, typename Next, typename FoundVal>
  66. inline Next const&
  67. make_unique_context(T& /* val */, Next const& next, FoundVal&)
  68. {
  69. return next;
  70. }
  71. template <typename ID, typename T, typename Next>
  72. inline context<ID, T, Next>
  73. make_unique_context(T& val, Next const& next, unused_type)
  74. {
  75. return { val, next };
  76. }
  77. }
  78. template <typename ID, typename T, typename Next>
  79. inline auto
  80. make_unique_context(T& val, Next const& next)
  81. {
  82. return detail::make_unique_context<ID>(val, next, x3::get<ID>(next));
  83. }
  84. }}}
  85. #endif