substitute.hpp 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231
  1. #if !defined(BOOST_PP_IS_ITERATING)
  2. ///// header body
  3. //-----------------------------------------------------------------------------
  4. // boost variant/detail/substitute.hpp header file
  5. // See http://www.boost.org for updates, documentation, and revision history.
  6. //-----------------------------------------------------------------------------
  7. //
  8. // Copyright (c) 2003
  9. // Eric Friedman
  10. //
  11. // Distributed under the Boost Software License, Version 1.0. (See
  12. // accompanying file LICENSE_1_0.txt or copy at
  13. // http://www.boost.org/LICENSE_1_0.txt)
  14. #ifndef BOOST_VARIANT_DETAIL_SUBSTITUTE_HPP
  15. #define BOOST_VARIANT_DETAIL_SUBSTITUTE_HPP
  16. #include "boost/mpl/aux_/config/ctps.hpp"
  17. #include "boost/variant/detail/substitute_fwd.hpp"
  18. #include "boost/mpl/aux_/lambda_arity_param.hpp"
  19. #include "boost/mpl/aux_/preprocessor/params.hpp"
  20. #include "boost/mpl/aux_/preprocessor/repeat.hpp"
  21. #include "boost/mpl/int_fwd.hpp"
  22. #include "boost/mpl/limits/arity.hpp"
  23. #include "boost/preprocessor/cat.hpp"
  24. #include "boost/preprocessor/empty.hpp"
  25. #include "boost/preprocessor/arithmetic/inc.hpp"
  26. #include "boost/preprocessor/iterate.hpp"
  27. namespace boost {
  28. namespace detail { namespace variant {
  29. #if !defined(BOOST_VARIANT_DETAIL_NO_SUBSTITUTE)
  30. ///////////////////////////////////////////////////////////////////////////////
  31. // (detail) metafunction substitute
  32. //
  33. // Substitutes one type for another in the given type expression.
  34. //
  35. //
  36. // primary template
  37. //
  38. template <
  39. typename T, typename Dest, typename Source
  40. BOOST_MPL_AUX_LAMBDA_ARITY_PARAM(
  41. typename Arity /* = ... (see substitute_fwd.hpp) */
  42. )
  43. >
  44. struct substitute
  45. {
  46. typedef T type;
  47. };
  48. //
  49. // tag substitution specializations
  50. //
  51. #define BOOST_VARIANT_AUX_ENABLE_RECURSIVE_IMPL_SUBSTITUTE_TAG(CV_) \
  52. template <typename Dest, typename Source> \
  53. struct substitute< \
  54. CV_ Source \
  55. , Dest \
  56. , Source \
  57. BOOST_MPL_AUX_LAMBDA_ARITY_PARAM(mpl::int_<-1>) \
  58. > \
  59. { \
  60. typedef CV_ Dest type; \
  61. }; \
  62. /**/
  63. BOOST_VARIANT_AUX_ENABLE_RECURSIVE_IMPL_SUBSTITUTE_TAG( BOOST_PP_EMPTY() )
  64. BOOST_VARIANT_AUX_ENABLE_RECURSIVE_IMPL_SUBSTITUTE_TAG(const)
  65. BOOST_VARIANT_AUX_ENABLE_RECURSIVE_IMPL_SUBSTITUTE_TAG(volatile)
  66. BOOST_VARIANT_AUX_ENABLE_RECURSIVE_IMPL_SUBSTITUTE_TAG(const volatile)
  67. #undef BOOST_VARIANT_AUX_ENABLE_RECURSIVE_IMPL_SUBSTITUTE_TAG
  68. //
  69. // pointer specializations
  70. //
  71. #define BOOST_VARIANT_AUX_ENABLE_RECURSIVE_IMPL_HANDLE_POINTER(CV_) \
  72. template <typename T, typename Dest, typename Source> \
  73. struct substitute< \
  74. T * CV_ \
  75. , Dest \
  76. , Source \
  77. BOOST_MPL_AUX_LAMBDA_ARITY_PARAM(mpl::int_<-1>) \
  78. > \
  79. { \
  80. typedef typename substitute< \
  81. T, Dest, Source \
  82. >::type * CV_ type; \
  83. }; \
  84. /**/
  85. BOOST_VARIANT_AUX_ENABLE_RECURSIVE_IMPL_HANDLE_POINTER( BOOST_PP_EMPTY() )
  86. BOOST_VARIANT_AUX_ENABLE_RECURSIVE_IMPL_HANDLE_POINTER(const)
  87. BOOST_VARIANT_AUX_ENABLE_RECURSIVE_IMPL_HANDLE_POINTER(volatile)
  88. BOOST_VARIANT_AUX_ENABLE_RECURSIVE_IMPL_HANDLE_POINTER(const volatile)
  89. #undef BOOST_VARIANT_AUX_ENABLE_RECURSIVE_IMPL_HANDLE_POINTER
  90. //
  91. // reference specializations
  92. //
  93. template <typename T, typename Dest, typename Source>
  94. struct substitute<
  95. T&
  96. , Dest
  97. , Source
  98. BOOST_MPL_AUX_LAMBDA_ARITY_PARAM(mpl::int_<-1>)
  99. >
  100. {
  101. typedef typename substitute<
  102. T, Dest, Source
  103. >::type & type;
  104. };
  105. //
  106. // template expression (i.e., F<...>) specializations
  107. //
  108. #define BOOST_VARIANT_AUX_SUBSTITUTE_TYPEDEF_IMPL(N) \
  109. typedef typename substitute< \
  110. BOOST_PP_CAT(U,N), Dest, Source \
  111. >::type BOOST_PP_CAT(u,N); \
  112. /**/
  113. #define BOOST_VARIANT_AUX_SUBSTITUTE_TYPEDEF(z, N, _) \
  114. BOOST_VARIANT_AUX_SUBSTITUTE_TYPEDEF_IMPL( BOOST_PP_INC(N) ) \
  115. /**/
  116. #define BOOST_PP_ITERATION_LIMITS (0,BOOST_MPL_LIMIT_METAFUNCTION_ARITY)
  117. #define BOOST_PP_FILENAME_1 "boost/variant/detail/substitute.hpp"
  118. #include BOOST_PP_ITERATE()
  119. #undef BOOST_VARIANT_AUX_SUBSTITUTE_TYPEDEF_IMPL
  120. #undef BOOST_VARIANT_AUX_SUBSTITUTE_TYPEDEF
  121. #endif // !defined(BOOST_VARIANT_DETAIL_NO_SUBSTITUTE)
  122. }} // namespace detail::variant
  123. } // namespace boost
  124. #endif // BOOST_VARIANT_DETAIL_SUBSTITUTE_HPP
  125. ///// iteration, depth == 1
  126. #elif BOOST_PP_ITERATION_DEPTH() == 1
  127. #define i BOOST_PP_FRAME_ITERATION(1)
  128. #if i > 0
  129. //
  130. // template specializations
  131. //
  132. template <
  133. template < BOOST_MPL_PP_PARAMS(i,typename P) > class T
  134. , BOOST_MPL_PP_PARAMS(i,typename U)
  135. , typename Dest
  136. , typename Source
  137. >
  138. struct substitute<
  139. T< BOOST_MPL_PP_PARAMS(i,U) >
  140. , Dest
  141. , Source
  142. BOOST_MPL_AUX_LAMBDA_ARITY_PARAM(mpl::int_<( i )>)
  143. >
  144. {
  145. private:
  146. BOOST_MPL_PP_REPEAT(i, BOOST_VARIANT_AUX_SUBSTITUTE_TYPEDEF, _)
  147. public:
  148. typedef T< BOOST_MPL_PP_PARAMS(i,u) > type;
  149. };
  150. //
  151. // function specializations
  152. //
  153. template <
  154. typename R
  155. , BOOST_MPL_PP_PARAMS(i,typename U)
  156. , typename Dest
  157. , typename Source
  158. >
  159. struct substitute<
  160. R (*)( BOOST_MPL_PP_PARAMS(i,U) )
  161. , Dest
  162. , Source
  163. BOOST_MPL_AUX_LAMBDA_ARITY_PARAM(mpl::int_<-1>)
  164. >
  165. {
  166. private:
  167. typedef typename substitute< R, Dest, Source >::type r;
  168. BOOST_MPL_PP_REPEAT(i, BOOST_VARIANT_AUX_SUBSTITUTE_TYPEDEF, _)
  169. public:
  170. typedef r (*type)( BOOST_MPL_PP_PARAMS(i,u) );
  171. };
  172. #elif i == 0
  173. //
  174. // zero-arg function specialization
  175. //
  176. template <
  177. typename R, typename Dest, typename Source
  178. >
  179. struct substitute<
  180. R (*)( void )
  181. , Dest
  182. , Source
  183. BOOST_MPL_AUX_LAMBDA_ARITY_PARAM(mpl::int_<-1>)
  184. >
  185. {
  186. private:
  187. typedef typename substitute< R, Dest, Source >::type r;
  188. public:
  189. typedef r (*type)( void );
  190. };
  191. #endif // i
  192. #undef i
  193. #endif // BOOST_PP_IS_ITERATING