proto_typeof.hpp 6.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139
  1. ///////////////////////////////////////////////////////////////////////////////
  2. /// \file proto_typeof.hpp
  3. /// Type registrations so that proto expression templates can be used together
  4. /// with the Boost.Typeof library.
  5. //
  6. // Copyright 2008 Eric Niebler. Distributed under the Boost
  7. // Software License, Version 1.0. (See accompanying file
  8. // LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
  9. #ifndef BOOST_XPRESSIVE_PROTO_PROTO_TYPEOF_H
  10. #define BOOST_XPRESSIVE_PROTO_PROTO_TYPEOF_H
  11. #include <boost/config.hpp>
  12. #include <boost/typeof/typeof.hpp>
  13. #include <boost/proto/proto_fwd.hpp>
  14. #include <boost/proto/deep_copy.hpp>
  15. #include BOOST_TYPEOF_INCREMENT_REGISTRATION_GROUP()
  16. BOOST_TYPEOF_REGISTER_TYPE(boost::proto::tag::terminal)
  17. BOOST_TYPEOF_REGISTER_TYPE(boost::proto::tag::unary_plus)
  18. BOOST_TYPEOF_REGISTER_TYPE(boost::proto::tag::negate)
  19. BOOST_TYPEOF_REGISTER_TYPE(boost::proto::tag::dereference)
  20. BOOST_TYPEOF_REGISTER_TYPE(boost::proto::tag::complement)
  21. BOOST_TYPEOF_REGISTER_TYPE(boost::proto::tag::address_of)
  22. BOOST_TYPEOF_REGISTER_TYPE(boost::proto::tag::logical_not)
  23. BOOST_TYPEOF_REGISTER_TYPE(boost::proto::tag::pre_inc)
  24. BOOST_TYPEOF_REGISTER_TYPE(boost::proto::tag::pre_dec)
  25. BOOST_TYPEOF_REGISTER_TYPE(boost::proto::tag::post_inc)
  26. BOOST_TYPEOF_REGISTER_TYPE(boost::proto::tag::post_dec)
  27. BOOST_TYPEOF_REGISTER_TYPE(boost::proto::tag::shift_left)
  28. BOOST_TYPEOF_REGISTER_TYPE(boost::proto::tag::shift_right)
  29. BOOST_TYPEOF_REGISTER_TYPE(boost::proto::tag::multiplies)
  30. BOOST_TYPEOF_REGISTER_TYPE(boost::proto::tag::divides)
  31. BOOST_TYPEOF_REGISTER_TYPE(boost::proto::tag::modulus)
  32. BOOST_TYPEOF_REGISTER_TYPE(boost::proto::tag::plus)
  33. BOOST_TYPEOF_REGISTER_TYPE(boost::proto::tag::minus)
  34. BOOST_TYPEOF_REGISTER_TYPE(boost::proto::tag::less)
  35. BOOST_TYPEOF_REGISTER_TYPE(boost::proto::tag::greater)
  36. BOOST_TYPEOF_REGISTER_TYPE(boost::proto::tag::less_equal)
  37. BOOST_TYPEOF_REGISTER_TYPE(boost::proto::tag::greater_equal)
  38. BOOST_TYPEOF_REGISTER_TYPE(boost::proto::tag::equal_to)
  39. BOOST_TYPEOF_REGISTER_TYPE(boost::proto::tag::not_equal_to)
  40. BOOST_TYPEOF_REGISTER_TYPE(boost::proto::tag::logical_or)
  41. BOOST_TYPEOF_REGISTER_TYPE(boost::proto::tag::logical_and)
  42. BOOST_TYPEOF_REGISTER_TYPE(boost::proto::tag::bitwise_and)
  43. BOOST_TYPEOF_REGISTER_TYPE(boost::proto::tag::bitwise_or)
  44. BOOST_TYPEOF_REGISTER_TYPE(boost::proto::tag::bitwise_xor)
  45. BOOST_TYPEOF_REGISTER_TYPE(boost::proto::tag::comma)
  46. BOOST_TYPEOF_REGISTER_TYPE(boost::proto::tag::mem_ptr)
  47. BOOST_TYPEOF_REGISTER_TYPE(boost::proto::tag::assign)
  48. BOOST_TYPEOF_REGISTER_TYPE(boost::proto::tag::shift_left_assign)
  49. BOOST_TYPEOF_REGISTER_TYPE(boost::proto::tag::shift_right_assign)
  50. BOOST_TYPEOF_REGISTER_TYPE(boost::proto::tag::multiplies_assign)
  51. BOOST_TYPEOF_REGISTER_TYPE(boost::proto::tag::divides_assign)
  52. BOOST_TYPEOF_REGISTER_TYPE(boost::proto::tag::modulus_assign)
  53. BOOST_TYPEOF_REGISTER_TYPE(boost::proto::tag::plus_assign)
  54. BOOST_TYPEOF_REGISTER_TYPE(boost::proto::tag::minus_assign)
  55. BOOST_TYPEOF_REGISTER_TYPE(boost::proto::tag::bitwise_and_assign)
  56. BOOST_TYPEOF_REGISTER_TYPE(boost::proto::tag::bitwise_or_assign)
  57. BOOST_TYPEOF_REGISTER_TYPE(boost::proto::tag::bitwise_xor_assign)
  58. BOOST_TYPEOF_REGISTER_TYPE(boost::proto::tag::subscript)
  59. BOOST_TYPEOF_REGISTER_TYPE(boost::proto::tag::member)
  60. BOOST_TYPEOF_REGISTER_TYPE(boost::proto::tag::if_else_)
  61. BOOST_TYPEOF_REGISTER_TYPE(boost::proto::tag::function)
  62. BOOST_TYPEOF_REGISTER_TYPE(boost::proto::exprns_::is_proto_expr)
  63. BOOST_TYPEOF_REGISTER_TEMPLATE(boost::proto::exprns_::expr, (typename)(typename)(long))
  64. BOOST_TYPEOF_REGISTER_TEMPLATE(boost::proto::exprns_::basic_expr, (typename)(typename)(long))
  65. BOOST_TYPEOF_REGISTER_TEMPLATE(boost::proto::utility::literal, (typename)(typename))
  66. BOOST_TYPEOF_REGISTER_TYPE(boost::proto::detail::not_a_generator)
  67. BOOST_TYPEOF_REGISTER_TYPE(boost::proto::detail::not_a_grammar)
  68. BOOST_TYPEOF_REGISTER_TYPE(boost::proto::detail::not_a_domain)
  69. BOOST_TYPEOF_REGISTER_TEMPLATE(boost::proto::domain, 3)
  70. BOOST_TYPEOF_REGISTER_TEMPLATE(boost::proto::term, 1)
  71. BOOST_TYPEOF_REGISTER_TEMPLATE(boost::proto::list1, 1)
  72. BOOST_TYPEOF_REGISTER_TEMPLATE(boost::proto::list2, 2)
  73. // can't use PP metaprogramming here because all typeof registrations
  74. // must be on separate lines.
  75. #if BOOST_PROTO_MAX_ARITY >= 3
  76. BOOST_TYPEOF_REGISTER_TEMPLATE(boost::proto::list3, 3)
  77. #endif
  78. #if BOOST_PROTO_MAX_ARITY >= 4
  79. BOOST_TYPEOF_REGISTER_TEMPLATE(boost::proto::list4, 4)
  80. #endif
  81. #if BOOST_PROTO_MAX_ARITY >= 5
  82. BOOST_TYPEOF_REGISTER_TEMPLATE(boost::proto::list5, 5)
  83. #endif
  84. #if BOOST_PROTO_MAX_ARITY >= 6
  85. BOOST_TYPEOF_REGISTER_TEMPLATE(boost::proto::list6, 6)
  86. #endif
  87. #if BOOST_PROTO_MAX_ARITY >= 7
  88. BOOST_TYPEOF_REGISTER_TEMPLATE(boost::proto::list7, 7)
  89. #endif
  90. #if BOOST_PROTO_MAX_ARITY >= 8
  91. BOOST_TYPEOF_REGISTER_TEMPLATE(boost::proto::list8, 8)
  92. #endif
  93. #if BOOST_PROTO_MAX_ARITY >= 9
  94. BOOST_TYPEOF_REGISTER_TEMPLATE(boost::proto::list9, 9)
  95. #endif
  96. #if BOOST_PROTO_MAX_ARITY >= 10
  97. BOOST_TYPEOF_REGISTER_TEMPLATE(boost::proto::list10, 10)
  98. #endif
  99. #if BOOST_PROTO_MAX_ARITY >= 11
  100. BOOST_TYPEOF_REGISTER_TEMPLATE(boost::proto::list11, 11)
  101. #endif
  102. #if BOOST_PROTO_MAX_ARITY >= 12
  103. BOOST_TYPEOF_REGISTER_TEMPLATE(boost::proto::list12, 12)
  104. #endif
  105. #if BOOST_PROTO_MAX_ARITY >= 13
  106. BOOST_TYPEOF_REGISTER_TEMPLATE(boost::proto::list13, 13)
  107. #endif
  108. #if BOOST_PROTO_MAX_ARITY >= 14
  109. BOOST_TYPEOF_REGISTER_TEMPLATE(boost::proto::list14, 14)
  110. #endif
  111. #if BOOST_PROTO_MAX_ARITY >= 15
  112. BOOST_TYPEOF_REGISTER_TEMPLATE(boost::proto::list15, 15)
  113. #endif
  114. #if BOOST_PROTO_MAX_ARITY >= 16
  115. BOOST_TYPEOF_REGISTER_TEMPLATE(boost::proto::list16, 16)
  116. #endif
  117. #if BOOST_PROTO_MAX_ARITY >= 17
  118. BOOST_TYPEOF_REGISTER_TEMPLATE(boost::proto::list17, 17)
  119. #endif
  120. #if BOOST_PROTO_MAX_ARITY >= 18
  121. BOOST_TYPEOF_REGISTER_TEMPLATE(boost::proto::list18, 18)
  122. #endif
  123. #if BOOST_PROTO_MAX_ARITY >= 19
  124. BOOST_TYPEOF_REGISTER_TEMPLATE(boost::proto::list19, 19)
  125. #endif
  126. #if BOOST_PROTO_MAX_ARITY >= 20
  127. BOOST_TYPEOF_REGISTER_TEMPLATE(boost::proto::list20, 20)
  128. #endif
  129. #define BOOST_PROTO_AUTO(Var, Expr) BOOST_AUTO(Var, boost::proto::deep_copy(Expr))
  130. #define BOOST_PROTO_AUTO_TPL(Var, Expr) BOOST_AUTO_TPL(Var, boost::proto::deep_copy(Expr))
  131. #endif