domain.hpp 2.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283
  1. /*=============================================================================
  2. Copyright (c) 2005-2010 Joel de Guzman
  3. Copyright (c) 2010 Eric Niebler
  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. #ifndef BOOST_PHOENIX_CORE_DOMAIN_HPP
  8. #define BOOST_PHOENIX_CORE_DOMAIN_HPP
  9. #include <boost/phoenix/core/limits.hpp>
  10. #include <boost/proto/matches.hpp>
  11. #include <boost/proto/transform/call.hpp>
  12. #include <boost/proto/transform/when.hpp>
  13. #include <boost/proto/domain.hpp>
  14. namespace boost { namespace phoenix
  15. {
  16. template <typename Expr>
  17. struct actor;
  18. struct meta_grammar;
  19. struct phoenix_generator
  20. : proto::switch_<phoenix_generator>
  21. {
  22. BOOST_PROTO_USE_BASIC_EXPR()
  23. template<typename Tag>
  24. struct case_
  25. : proto::otherwise<proto::call<proto::pod_generator<actor>(proto::_)> >
  26. {};
  27. };
  28. // proto's assignment operator takes rhs by reference
  29. template<>
  30. struct phoenix_generator::case_<proto::tag::assign>
  31. : proto::otherwise<proto::call<proto::compose_generators<
  32. proto::by_value_generator
  33. , proto::pod_generator<actor>
  34. >(proto::_)> >
  35. {};
  36. // proto's subscript operator takes rhs by reference
  37. template<>
  38. struct phoenix_generator::case_<proto::tag::subscript>
  39. : proto::otherwise<proto::call<proto::compose_generators<
  40. proto::by_value_generator
  41. , proto::pod_generator<actor>
  42. >(proto::_)> >
  43. {};
  44. struct phoenix_default_domain
  45. : proto::domain<
  46. proto::basic_default_generator
  47. , proto::_
  48. , proto::basic_default_domain
  49. >
  50. {
  51. template <typename T>
  52. struct as_child
  53. //: proto_base_domain::as_expr<T> // proto lambda example.
  54. : as_expr<T>
  55. {};
  56. };
  57. struct phoenix_domain
  58. : proto::domain<
  59. phoenix_generator
  60. , meta_grammar
  61. , proto::basic_default_domain
  62. >
  63. {
  64. template <typename T>
  65. struct as_child
  66. //: proto_base_domain::as_expr<T> // proto lambda example.
  67. : as_expr<T>
  68. {};
  69. };
  70. }}
  71. #endif