PageRenderTime 44ms CodeModel.GetById 15ms RepoModel.GetById 1ms app.codeStats 0ms

/boost/hana/detail/struct_macros.hpp.erb

https://bitbucket.org/bosp/external-boost
Ruby HTML | 231 lines | 195 code | 36 blank | 0 comment | 5 complexity | d9fe4087f65f70eab371a483c2f90123 MD5 | raw file
Possible License(s): MIT
  1. <%#
  2. This is an ERB [1] template file used to generate the
  3. <boost/hana/detail/struct_macros.hpp> header. The maximum
  4. number of members that can be handled by the macros can
  5. be controlled with the 'MAX_NUMBER_OF_MEMBERS' variable,
  6. which can be set when calling ERB to generate the header:
  7. export MAX_NUMBER_OF_MEMBERS=55; erb struct_macros.hpp.erb
  8. 'MAX_NUMBER_OF_MEMBERS' must be greater than 0. In case 'MAX_NUMBER_OF_MEMBERS'
  9. is not specified, it defaults to 40. To regenerate the default struct macros,
  10. issue the following command from the root of the project:
  11. erb include/boost/hana/detail/struct_macros.hpp.erb > include/boost/hana/detail/struct_macros.hpp
  12. [1]: http://en.wikipedia.org/wiki/ERuby
  13. %>
  14. <%
  15. MAX_NUMBER_OF_MEMBERS = (ENV["MAX_NUMBER_OF_MEMBERS"] || 40).to_i
  16. raise "MAX_NUMBER_OF_MEMBERS must be > 0" if not MAX_NUMBER_OF_MEMBERS > 0
  17. %>
  18. /*!
  19. @file
  20. Defines the `BOOST_HANA_DEFINE_STRUCT`, `BOOST_HANA_ADAPT_STRUCT`, and
  21. `BOOST_HANA_ADAPT_ADT` macros.
  22. @copyright Louis Dionne 2013-2017
  23. Distributed under the Boost Software License, Version 1.0.
  24. (See accompanying file LICENSE.md or copy at http://boost.org/LICENSE_1_0.txt)
  25. */
  26. //////////////////////////////////////////////////////////////////////////////
  27. // THIS FILE IS GENERATED FROM THE <boost/hana/detail/struct_macros.erb.hpp>
  28. // ERB TEMPLATE. DO NOT EDIT THIS FILE DIRECTLY.
  29. //
  30. // THE ERB TEMPLATE CONTAINS INFORMATION ABOUT HOW TO REGENERATE THIS FILE.
  31. //////////////////////////////////////////////////////////////////////////////
  32. #ifndef BOOST_HANA_DETAIL_STRUCT_MACROS_HPP
  33. #define BOOST_HANA_DETAIL_STRUCT_MACROS_HPP
  34. #include <boost/hana/config.hpp>
  35. #include <boost/hana/detail/preprocessor.hpp>
  36. #include <boost/hana/pair.hpp>
  37. #include <boost/hana/string.hpp>
  38. #include <boost/hana/tuple.hpp>
  39. #include <cstddef>
  40. #include <utility>
  41. BOOST_HANA_NAMESPACE_BEGIN namespace struct_detail {
  42. template <typename Memptr, Memptr ptr>
  43. struct member_ptr {
  44. template <typename T>
  45. constexpr decltype(auto) operator()(T&& t) const
  46. { return static_cast<T&&>(t).*ptr; }
  47. };
  48. constexpr std::size_t strlen(char const* s) {
  49. std::size_t n = 0;
  50. while (*s++ != '\0')
  51. ++n;
  52. return n;
  53. }
  54. template <std::size_t n, typename Names, std::size_t ...i>
  55. constexpr auto prepare_member_name_impl(std::index_sequence<i...>) {
  56. return hana::string_c<hana::at_c<n>(Names::get())[i]...>;
  57. }
  58. template <std::size_t n, typename Names>
  59. constexpr auto prepare_member_name() {
  60. constexpr std::size_t len = strlen(hana::at_c<n>(Names::get()));
  61. return prepare_member_name_impl<n, Names>(std::make_index_sequence<len>{});
  62. }
  63. } BOOST_HANA_NAMESPACE_END
  64. //////////////////////////////////////////////////////////////////////////////
  65. // BOOST_HANA_PP_NARG
  66. //////////////////////////////////////////////////////////////////////////////
  67. //! @ingroup group-details
  68. //! Macro expanding to the number of arguments it is passed.
  69. //!
  70. //! Specifically, `BOOST_HANA_PP_NARG(x1, ..., xn)` expands to `n`. It is
  71. //! an error to call this macro with 0 arguments.
  72. #define BOOST_HANA_PP_NARG(...) \
  73. BOOST_HANA_PP_NARG_IMPL(__VA_ARGS__, <%= (1..MAX_NUMBER_OF_MEMBERS).to_a.reverse.join(',') %>,)
  74. #define BOOST_HANA_PP_NARG_IMPL(<%= (1..MAX_NUMBER_OF_MEMBERS).to_a.map { |i| "e#{i}" }.join(',') %>, N, ...) N
  75. //////////////////////////////////////////////////////////////////////////////
  76. // BOOST_HANA_PP_BACK
  77. //////////////////////////////////////////////////////////////////////////////
  78. //! @ingroup group-details
  79. //! Expands to its last argument.
  80. #define BOOST_HANA_PP_BACK(...) \
  81. BOOST_HANA_PP_BACK_IMPL(BOOST_HANA_PP_NARG(__VA_ARGS__), __VA_ARGS__)
  82. #define BOOST_HANA_PP_BACK_IMPL(N, ...) \
  83. BOOST_HANA_PP_CONCAT(BOOST_HANA_PP_BACK_IMPL_, N)(__VA_ARGS__)
  84. <% (1..MAX_NUMBER_OF_MEMBERS).each do |n| %>
  85. #define BOOST_HANA_PP_BACK_IMPL_<%= n %>(<%= (1..n).to_a.map { |i| "e#{i}" }.join(', ') %>) e<%= n %>
  86. <% end %>
  87. //////////////////////////////////////////////////////////////////////////////
  88. // BOOST_HANA_PP_DROP_BACK
  89. //////////////////////////////////////////////////////////////////////////////
  90. //! @ingroup group-details
  91. //! Expands to all of its arguments, except for the last one.
  92. #define BOOST_HANA_PP_DROP_BACK(...) \
  93. BOOST_HANA_PP_DROP_BACK_IMPL(BOOST_HANA_PP_NARG(__VA_ARGS__), __VA_ARGS__)
  94. #define BOOST_HANA_PP_DROP_BACK_IMPL(N, ...) \
  95. BOOST_HANA_PP_CONCAT(BOOST_HANA_PP_DROP_BACK_IMPL_, N)(__VA_ARGS__)
  96. <% (1..MAX_NUMBER_OF_MEMBERS).each do |n| %>
  97. #define BOOST_HANA_PP_DROP_BACK_IMPL_<%= n %>(<%= (1..n).to_a.map { |i| "e#{i}" }.join(', ') %>)<%= (1..n-1).to_a.map { |i| "e#{i}" }.join(', ') %>
  98. <% end %>
  99. //////////////////////////////////////////////////////////////////////////////
  100. // BOOST_HANA_ADAPT_STRUCT
  101. //////////////////////////////////////////////////////////////////////////////
  102. template <typename ...>
  103. struct BOOST_HANA_ADAPT_STRUCT_must_be_called_in_the_global_namespace;
  104. #define BOOST_HANA_ADAPT_STRUCT(...) \
  105. template <> \
  106. struct BOOST_HANA_ADAPT_STRUCT_must_be_called_in_the_global_namespace<>; \
  107. BOOST_HANA_ADAPT_STRUCT_IMPL(BOOST_HANA_PP_NARG(__VA_ARGS__), __VA_ARGS__)\
  108. static_assert(true, "force the usage of a trailing semicolon") \
  109. /**/
  110. #define BOOST_HANA_ADAPT_STRUCT_IMPL(N, ...) \
  111. BOOST_HANA_PP_CONCAT(BOOST_HANA_ADAPT_STRUCT_IMPL_, N)(__VA_ARGS__)
  112. <% (0..MAX_NUMBER_OF_MEMBERS).each do |n| %>
  113. #define BOOST_HANA_ADAPT_STRUCT_IMPL_<%= n+1 %>(TYPE <%= (1..n).map { |i| ", m#{i}" }.join %>) \
  114. namespace boost { namespace hana { \
  115. template <> \
  116. struct accessors_impl<TYPE> { \
  117. static constexpr auto apply() { \
  118. struct member_names { \
  119. static constexpr auto get() { \
  120. return ::boost::hana::make_tuple( \
  121. <%= (1..n).map { |i| "BOOST_HANA_PP_STRINGIZE(m#{i})" }.join(', ') %> \
  122. ); \
  123. } \
  124. }; \
  125. return ::boost::hana::make_tuple( \
  126. <%= (1..n).map { |i| "::boost::hana::make_pair(::boost::hana::struct_detail::prepare_member_name<#{i-1}, member_names>(), ::boost::hana::struct_detail::member_ptr<decltype(&TYPE::m#{i}), &TYPE::m#{i}>{})" }.join(', ') %>\
  127. ); \
  128. } \
  129. }; \
  130. }} \
  131. /**/
  132. <% end %>
  133. //////////////////////////////////////////////////////////////////////////////
  134. // BOOST_HANA_ADAPT_ADT
  135. //////////////////////////////////////////////////////////////////////////////
  136. template <typename ...>
  137. struct BOOST_HANA_ADAPT_ADT_must_be_called_in_the_global_namespace;
  138. #define BOOST_HANA_ADAPT_ADT(...) \
  139. template <> \
  140. struct BOOST_HANA_ADAPT_ADT_must_be_called_in_the_global_namespace<>; \
  141. BOOST_HANA_ADAPT_ADT_IMPL(BOOST_HANA_PP_NARG(__VA_ARGS__), __VA_ARGS__) \
  142. static_assert(true, "force the usage of a trailing semicolon") \
  143. /**/
  144. #define BOOST_HANA_ADAPT_ADT_IMPL(N, ...) \
  145. BOOST_HANA_PP_CONCAT(BOOST_HANA_ADAPT_ADT_IMPL_, N)(__VA_ARGS__)
  146. <% (0..MAX_NUMBER_OF_MEMBERS).each do |n| %>
  147. #define BOOST_HANA_ADAPT_ADT_IMPL_<%= n+1 %>(TYPE <%= (1..n).map { |i| ", m#{i}" }.join %>) \
  148. namespace boost { namespace hana { \
  149. template <> \
  150. struct accessors_impl<TYPE> { \
  151. template <typename ...> \
  152. static constexpr auto apply() { \
  153. struct member_names { \
  154. static constexpr auto get() { \
  155. return ::boost::hana::make_tuple( \
  156. <%= (1..n).map { |i| "BOOST_HANA_PP_STRINGIZE(BOOST_HANA_PP_FRONT m#{i})" }.join(', ') %>\
  157. ); \
  158. } \
  159. }; \
  160. return ::boost::hana::make_tuple( \
  161. <%= (1..n).map { |i| "::boost::hana::make_pair(::boost::hana::struct_detail::prepare_member_name<#{i-1}, member_names>(), BOOST_HANA_PP_DROP_FRONT m#{i})" }.join(', ') %>\
  162. ); \
  163. } \
  164. }; \
  165. }} \
  166. /**/
  167. <% end %>
  168. //////////////////////////////////////////////////////////////////////////////
  169. // BOOST_HANA_DEFINE_STRUCT
  170. //////////////////////////////////////////////////////////////////////////////
  171. #define BOOST_HANA_DEFINE_STRUCT(...) \
  172. BOOST_HANA_DEFINE_STRUCT_IMPL(BOOST_HANA_PP_NARG(__VA_ARGS__), __VA_ARGS__)
  173. #define BOOST_HANA_DEFINE_STRUCT_IMPL(N, ...) \
  174. BOOST_HANA_PP_CONCAT(BOOST_HANA_DEFINE_STRUCT_IMPL_, N)(__VA_ARGS__)
  175. <% (0..MAX_NUMBER_OF_MEMBERS).each do |n| %>
  176. #define BOOST_HANA_DEFINE_STRUCT_IMPL_<%= n+1 %>(TYPE <%= (1..n).map { |i| ", m#{i}" }.join %>) \
  177. <%= (1..n).map { |i| "BOOST_HANA_PP_DROP_BACK m#{i} BOOST_HANA_PP_BACK m#{i};" }.join(' ') %> \
  178. \
  179. struct hana_accessors_impl { \
  180. static constexpr auto apply() { \
  181. struct member_names { \
  182. static constexpr auto get() { \
  183. return ::boost::hana::make_tuple( \
  184. <%= (1..n).map { |i| "BOOST_HANA_PP_STRINGIZE(BOOST_HANA_PP_BACK m#{i})" }.join(', ') %>\
  185. ); \
  186. } \
  187. }; \
  188. return ::boost::hana::make_tuple( \
  189. <%= (1..n).map { |i| "::boost::hana::make_pair(::boost::hana::struct_detail::prepare_member_name<#{i-1}, member_names>(), ::boost::hana::struct_detail::member_ptr<decltype(&TYPE::BOOST_HANA_PP_BACK m#{i}), &TYPE::BOOST_HANA_PP_BACK m#{i}>{})" }.join(', ') %>\
  190. ); \
  191. } \
  192. } \
  193. /**/
  194. <% end %>
  195. #endif // !BOOST_HANA_DETAIL_STRUCT_MACROS_HPP