append.hpp 9.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212
  1. // Copyright (C) 2009-2012 Lorenzo Caminiti
  2. // Distributed under the Boost Software License, Version 1.0
  3. // (see accompanying file LICENSE_1_0.txt or a copy at
  4. // http://www.boost.org/LICENSE_1_0.txt)
  5. // Home at http://www.boost.org/libs/local_function
  6. #ifndef BOOST_LOCAL_FUNCTION_AUX_PP_DECL_TRAITS_APPEND_HPP_
  7. #define BOOST_LOCAL_FUNCTION_AUX_PP_DECL_TRAITS_APPEND_HPP_
  8. #include <boost/local_function/aux_/preprocessor/traits/decl_returns.hpp>
  9. #include <boost/local_function/aux_/preprocessor/traits/decl_params.hpp>
  10. #include <boost/local_function/aux_/preprocessor/traits/decl_const_binds.hpp>
  11. #include <boost/local_function/aux_/preprocessor/traits/decl_binds.hpp>
  12. #include <boost/local_function/aux_/preprocessor/traits/decl_error.hpp>
  13. #include <boost/local_function/aux_/preprocessor/traits/param.hpp>
  14. #include <boost/local_function/detail/preprocessor/keyword/return.hpp>
  15. #include <boost/preprocessor/facilities/empty.hpp>
  16. #include <boost/preprocessor/arithmetic/dec.hpp>
  17. #include <boost/preprocessor/list/append.hpp>
  18. #include <boost/preprocessor/list/size.hpp>
  19. #include <boost/preprocessor/list/at.hpp>
  20. #include <boost/preprocessor/list/first_n.hpp>
  21. // PRIVATE //
  22. #define BOOST_LOCAL_FUNCTION_AUX_PP_DECL_TRAITS_APPEND_PARAM_DEFAULT_( \
  23. params, default_value) \
  24. /* `DEC` ok because precondition that unbinds are not nil-list */ \
  25. BOOST_PP_LIST_APPEND( \
  26. BOOST_PP_LIST_FIRST_N(BOOST_PP_DEC(BOOST_PP_LIST_SIZE(params)), \
  27. params) \
  28. , \
  29. ( /* list 2-tuple */ \
  30. ( /* (param_decl, default) 2-tuple */ \
  31. BOOST_LOCAL_FUNCTION_AUX_PP_PARAM_TRAITS_DECL( \
  32. BOOST_PP_LIST_AT(params, BOOST_PP_DEC( \
  33. BOOST_PP_LIST_SIZE(params)))) \
  34. , \
  35. default_value BOOST_PP_EMPTY \
  36. ) \
  37. , \
  38. BOOST_PP_NIL \
  39. ) \
  40. )
  41. // PUBLIC //
  42. // return_type: `return result_type`.
  43. #define BOOST_LOCAL_FUNCTION_AUX_PP_DECL_TRAITS_APPEND_RETURN( \
  44. decl_traits, return_type) \
  45. ( /* returns */ \
  46. BOOST_PP_LIST_APPEND( \
  47. BOOST_LOCAL_FUNCTION_AUX_PP_DECL_TRAITS_RETURNS(decl_traits), \
  48. ( BOOST_LOCAL_FUNCTION_DETAIL_PP_KEYWORD_RETURN_REMOVE_FRONT( \
  49. return_type), BOOST_PP_NIL ) ) \
  50. , /* params and defaults */ \
  51. BOOST_LOCAL_FUNCTION_AUX_PP_DECL_TRAITS_PARAMS(decl_traits) \
  52. , /* const-bind vars */ \
  53. BOOST_LOCAL_FUNCTION_AUX_PP_DECL_TRAITS_CONST_BINDS(decl_traits) \
  54. , /* const-bind `this` types */ \
  55. BOOST_LOCAL_FUNCTION_AUX_PP_DECL_TRAITS_CONST_BIND_THIS_TYPES( \
  56. decl_traits) \
  57. , /* bind vars */ \
  58. BOOST_LOCAL_FUNCTION_AUX_PP_DECL_TRAITS_BINDS(decl_traits) \
  59. , /* bind `this` types */ \
  60. BOOST_LOCAL_FUNCTION_AUX_PP_DECL_TRAITS_BIND_THIS_TYPES(decl_traits) \
  61. , /* error message (if any) */ \
  62. BOOST_LOCAL_FUNCTION_AUX_PP_DECL_TRAITS_ERROR(decl_traits) \
  63. )
  64. // param_decl: `[auto | register] type_ name_`.
  65. #define BOOST_LOCAL_FUNCTION_AUX_PP_DECL_TRAITS_APPEND_PARAM( \
  66. decl_traits, param_decl) \
  67. ( /* returns */ \
  68. BOOST_LOCAL_FUNCTION_AUX_PP_DECL_TRAITS_RETURNS(decl_traits) \
  69. , /* params and defaults */ \
  70. BOOST_PP_LIST_APPEND( \
  71. BOOST_LOCAL_FUNCTION_AUX_PP_DECL_TRAITS_PARAMS(decl_traits), \
  72. /* append param (with no default -- EMPTY) */ \
  73. ( (param_decl, BOOST_PP_EMPTY), BOOST_PP_NIL ) ) \
  74. , /* const-bind vars */ \
  75. BOOST_LOCAL_FUNCTION_AUX_PP_DECL_TRAITS_CONST_BINDS(decl_traits) \
  76. , /* const-bind `this` types */ \
  77. BOOST_LOCAL_FUNCTION_AUX_PP_DECL_TRAITS_CONST_BIND_THIS_TYPES( \
  78. decl_traits) \
  79. , /* bind vars */ \
  80. BOOST_LOCAL_FUNCTION_AUX_PP_DECL_TRAITS_BINDS(decl_traits) \
  81. , /* bind `this` types */ \
  82. BOOST_LOCAL_FUNCTION_AUX_PP_DECL_TRAITS_BIND_THIS_TYPES(decl_traits) \
  83. , /* error message (if any) */ \
  84. BOOST_LOCAL_FUNCTION_AUX_PP_DECL_TRAITS_ERROR(decl_traits) \
  85. )
  86. // default_value: a valid parameter default value (`-1`, etc).
  87. // Precondition: already added unbinds are not nil-list.
  88. #define BOOST_LOCAL_FUNCTION_AUX_PP_DECL_TRAITS_APPEND_PARAM_DEFAULT( \
  89. decl_traits, default_value) \
  90. ( /* returns */ \
  91. BOOST_LOCAL_FUNCTION_AUX_PP_DECL_TRAITS_RETURNS(decl_traits) \
  92. , /* unbind params and defaults */ \
  93. BOOST_LOCAL_FUNCTION_AUX_PP_DECL_TRAITS_APPEND_PARAM_DEFAULT_( \
  94. BOOST_LOCAL_FUNCTION_AUX_PP_DECL_TRAITS_PARAMS(decl_traits), \
  95. default_value) /* append default to last added param */ \
  96. , /* const-bind vars */ \
  97. BOOST_LOCAL_FUNCTION_AUX_PP_DECL_TRAITS_CONST_BINDS(decl_traits) \
  98. , /* const-bind `this` types */ \
  99. BOOST_LOCAL_FUNCTION_AUX_PP_DECL_TRAITS_CONST_BIND_THIS_TYPES( \
  100. decl_traits) \
  101. , /* bind vars */ \
  102. BOOST_LOCAL_FUNCTION_AUX_PP_DECL_TRAITS_BINDS(decl_traits) \
  103. , /* bind `this` types */ \
  104. BOOST_LOCAL_FUNCTION_AUX_PP_DECL_TRAITS_BIND_THIS_TYPES(decl_traits) \
  105. , /* error message (if any) */ \
  106. BOOST_LOCAL_FUNCTION_AUX_PP_DECL_TRAITS_ERROR(decl_traits) \
  107. )
  108. // var_without_type: `[&] var_` (var_ != this).
  109. // var_with_type: `PP_EMPTY | type [&] var_` (var_ != this).
  110. #define BOOST_LOCAL_FUNCTION_AUX_PP_DECL_TRAITS_APPEND_BIND( \
  111. decl_traits, var_without_type, var_with_type) \
  112. ( /* returns */ \
  113. BOOST_LOCAL_FUNCTION_AUX_PP_DECL_TRAITS_RETURNS(decl_traits) \
  114. , /* params and defaults */ \
  115. BOOST_LOCAL_FUNCTION_AUX_PP_DECL_TRAITS_PARAMS(decl_traits) \
  116. , /* const-bind vars */ \
  117. BOOST_LOCAL_FUNCTION_AUX_PP_DECL_TRAITS_CONST_BINDS(decl_traits) \
  118. , /* const-bind `this` types */ \
  119. BOOST_LOCAL_FUNCTION_AUX_PP_DECL_TRAITS_CONST_BIND_THIS_TYPES( \
  120. decl_traits) \
  121. , /* bind vars */ \
  122. BOOST_PP_LIST_APPEND( \
  123. BOOST_LOCAL_FUNCTION_AUX_PP_DECL_TRAITS_BINDS(decl_traits), \
  124. ( (var_without_type, var_with_type), BOOST_PP_NIL ) ) \
  125. , /* bind `this` types */ \
  126. BOOST_LOCAL_FUNCTION_AUX_PP_DECL_TRAITS_BIND_THIS_TYPES(decl_traits) \
  127. , /* error message (if any) */ \
  128. BOOST_LOCAL_FUNCTION_AUX_PP_DECL_TRAITS_ERROR(decl_traits) \
  129. )
  130. // this_type: `PP_EMPTY | type`.
  131. #define BOOST_LOCAL_FUNCTION_AUX_PP_DECL_TRAITS_APPEND_BIND_THIS_TYPE( \
  132. decl_traits, this_type) \
  133. ( /* returns */ \
  134. BOOST_LOCAL_FUNCTION_AUX_PP_DECL_TRAITS_RETURNS(decl_traits) \
  135. , /* params and defaults */ \
  136. BOOST_LOCAL_FUNCTION_AUX_PP_DECL_TRAITS_PARAMS(decl_traits) \
  137. , /* const-bind vars */ \
  138. BOOST_LOCAL_FUNCTION_AUX_PP_DECL_TRAITS_CONST_BINDS(decl_traits) \
  139. , /* const-bind `this` types */ \
  140. BOOST_LOCAL_FUNCTION_AUX_PP_DECL_TRAITS_CONST_BIND_THIS_TYPES( \
  141. decl_traits) \
  142. , /* bind vars */ \
  143. BOOST_LOCAL_FUNCTION_AUX_PP_DECL_TRAITS_BINDS(decl_traits) \
  144. , /* bind `this` types */ \
  145. BOOST_PP_LIST_APPEND( \
  146. BOOST_LOCAL_FUNCTION_AUX_PP_DECL_TRAITS_BIND_THIS_TYPES( \
  147. decl_traits), \
  148. ( (this_type), BOOST_PP_NIL ) ) \
  149. , /* error message (if any) */ \
  150. BOOST_LOCAL_FUNCTION_AUX_PP_DECL_TRAITS_ERROR(decl_traits) \
  151. )
  152. // var_without_type: `[&] var_` (var_ != this).
  153. // var_with_type: `BOOST_PP_EMPTY | type_ [&] name_` (var_ != this).
  154. #define BOOST_LOCAL_FUNCTION_AUX_PP_DECL_TRAITS_APPEND_CONST_BIND( \
  155. decl_traits, var_without_type, var_with_type) \
  156. ( /* returns */ \
  157. BOOST_LOCAL_FUNCTION_AUX_PP_DECL_TRAITS_RETURNS(decl_traits) \
  158. , /* params and defaults */ \
  159. BOOST_LOCAL_FUNCTION_AUX_PP_DECL_TRAITS_PARAMS(decl_traits) \
  160. , /* const-bind vars */ \
  161. BOOST_PP_LIST_APPEND( \
  162. BOOST_LOCAL_FUNCTION_AUX_PP_DECL_TRAITS_CONST_BINDS( \
  163. decl_traits), \
  164. ( (var_without_type, var_with_type), BOOST_PP_NIL ) ) \
  165. , /* const-bind `this` types */ \
  166. BOOST_LOCAL_FUNCTION_AUX_PP_DECL_TRAITS_CONST_BIND_THIS_TYPES( \
  167. decl_traits) \
  168. , /* bind vars */ \
  169. BOOST_LOCAL_FUNCTION_AUX_PP_DECL_TRAITS_BINDS(decl_traits) \
  170. , /* bind `this` types */ \
  171. BOOST_LOCAL_FUNCTION_AUX_PP_DECL_TRAITS_BIND_THIS_TYPES(decl_traits) \
  172. , /* error message (if any) */ \
  173. BOOST_LOCAL_FUNCTION_AUX_PP_DECL_TRAITS_ERROR(decl_traits) \
  174. )
  175. // this_type: `PP_EMPTY | type`.
  176. #define BOOST_LOCAL_FUNCTION_AUX_PP_DECL_TRAITS_APPEND_CONST_BIND_THIS_TYPE( \
  177. decl_traits, this_type) \
  178. ( /* returns */ \
  179. BOOST_LOCAL_FUNCTION_AUX_PP_DECL_TRAITS_RETURNS(decl_traits) \
  180. , /* params and defaults */ \
  181. BOOST_LOCAL_FUNCTION_AUX_PP_DECL_TRAITS_PARAMS(decl_traits) \
  182. , /* const-bind vars */ \
  183. BOOST_LOCAL_FUNCTION_AUX_PP_DECL_TRAITS_CONST_BINDS(decl_traits) \
  184. , /* const-bind `this` types */ \
  185. BOOST_PP_LIST_APPEND( \
  186. BOOST_LOCAL_FUNCTION_AUX_PP_DECL_TRAITS_CONST_BIND_THIS_TYPES( \
  187. decl_traits), \
  188. ( (this_type), BOOST_PP_NIL ) ) \
  189. , /* bind vars */ \
  190. BOOST_LOCAL_FUNCTION_AUX_PP_DECL_TRAITS_BINDS(decl_traits) \
  191. , /* bind `this` types */ \
  192. BOOST_LOCAL_FUNCTION_AUX_PP_DECL_TRAITS_BIND_THIS_TYPES(decl_traits) \
  193. , /* error message (if any) */ \
  194. BOOST_LOCAL_FUNCTION_AUX_PP_DECL_TRAITS_ERROR(decl_traits) \
  195. )
  196. #endif // #include guard