fold.hpp 5.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189
  1. /*=============================================================================
  2. Copyright (c) 2001-2011 Joel de Guzman
  3. Copyright (c) 2007 Dan Marsden
  4. Copyright (c) 2009-2010 Christopher Schmidt
  5. Distributed under the Boost Software License, Version 1.0. (See accompanying
  6. file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
  7. This is an auto-generated file. Do not edit!
  8. ==============================================================================*/
  9. # if BOOST_WORKAROUND (BOOST_MSVC, < 1500)
  10. # define BOOST_FUSION_FOLD_IMPL_ENABLER(T) void
  11. # else
  12. # define BOOST_FUSION_FOLD_IMPL_ENABLER(T) typename T::type
  13. # endif
  14. namespace boost { namespace fusion
  15. {
  16. namespace detail
  17. {
  18. template<int SeqSize, typename It, typename State, typename F, typename = void
  19. # if BOOST_WORKAROUND (BOOST_MSVC, < 1500)
  20. , bool = SeqSize == 0
  21. # endif
  22. >
  23. struct result_of_it_fold
  24. {};
  25. template<typename It, typename State, typename F>
  26. struct result_of_it_fold<0,It,State,F
  27. , typename boost::enable_if_has_type<BOOST_FUSION_FOLD_IMPL_ENABLER(State)>::type
  28. # if BOOST_WORKAROUND (BOOST_MSVC, < 1500)
  29. , true
  30. # endif
  31. >
  32. {
  33. typedef typename State::type type;
  34. };
  35. template<int SeqSize, typename It, typename State, typename F>
  36. struct result_of_it_fold<SeqSize,It,State,F
  37. , typename boost::enable_if_has_type<
  38. # if BOOST_WORKAROUND (BOOST_MSVC, >= 1500)
  39. typename boost::disable_if_c<SeqSize == 0, State>::type::type
  40. # else
  41. BOOST_FUSION_FOLD_IMPL_ENABLER(State)
  42. # endif
  43. >::type
  44. # if BOOST_WORKAROUND (BOOST_MSVC, < 1500)
  45. , false
  46. # endif
  47. >
  48. : result_of_it_fold<
  49. SeqSize-1
  50. , typename result_of::next<It>::type
  51. , boost::result_of<
  52. F(
  53. typename add_reference<typename State::type>::type,
  54. typename fusion::result_of::deref<It const>::type
  55. )
  56. >
  57. , F
  58. >
  59. {};
  60. template<typename It, typename State, typename F>
  61. BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED
  62. inline typename result_of_it_fold<
  63. 0
  64. , It
  65. , State
  66. , F
  67. >::type
  68. it_fold(mpl::int_<0>, It const&, typename State::type state, F&)
  69. {
  70. return state;
  71. }
  72. template<typename It, typename State, typename F, int SeqSize>
  73. BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED
  74. inline typename lazy_enable_if_c<
  75. SeqSize != 0
  76. , result_of_it_fold<
  77. SeqSize
  78. , It
  79. , State
  80. , F
  81. >
  82. >::type
  83. it_fold(mpl::int_<SeqSize>, It const& it, typename State::type state, F& f)
  84. {
  85. return it_fold<
  86. typename result_of::next<It>::type
  87. , boost::result_of<
  88. F(
  89. typename add_reference<typename State::type>::type,
  90. typename fusion::result_of::deref<It const>::type
  91. )
  92. >
  93. , F
  94. >(
  95. mpl::int_<SeqSize-1>()
  96. , fusion::next(it)
  97. , f(state, fusion::deref(it))
  98. , f
  99. );
  100. }
  101. template<typename Seq, typename State, typename F
  102. , bool = traits::is_sequence<Seq>::value
  103. , bool = traits::is_segmented<Seq>::value>
  104. struct result_of_fold
  105. {};
  106. template<typename Seq, typename State, typename F>
  107. struct result_of_fold<Seq, State, F, true, false>
  108. : result_of_it_fold<
  109. result_of::size<Seq>::value
  110. , typename result_of::begin<Seq>::type
  111. , add_reference<State>
  112. , F
  113. >
  114. {};
  115. template<typename Seq, typename State, typename F>
  116. BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED
  117. inline typename result_of_fold<Seq, State, F>::type
  118. fold(Seq& seq, State& state, F& f)
  119. {
  120. return it_fold<
  121. typename result_of::begin<Seq>::type
  122. , add_reference<State>
  123. , F
  124. >(
  125. typename result_of::size<Seq>::type()
  126. , fusion::begin(seq)
  127. , state
  128. , f
  129. );
  130. }
  131. }
  132. namespace result_of
  133. {
  134. template<typename Seq, typename State, typename F>
  135. struct fold
  136. : detail::result_of_fold<Seq, State, F>
  137. {};
  138. }
  139. template<typename Seq, typename State, typename F>
  140. BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED
  141. inline typename result_of::fold<
  142. Seq
  143. , State const
  144. , F
  145. >::type
  146. fold(Seq& seq, State const& state, F f)
  147. {
  148. return detail::fold<Seq, State const, F>(seq, state, f);
  149. }
  150. template<typename Seq, typename State, typename F>
  151. BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED
  152. inline typename result_of::fold<
  153. Seq const
  154. , State const
  155. , F
  156. >::type
  157. fold(Seq const& seq, State const& state, F f)
  158. {
  159. return detail::fold<Seq const, State const, F>(seq, state, f);
  160. }
  161. template<typename Seq, typename State, typename F>
  162. BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED
  163. inline typename result_of::fold<
  164. Seq
  165. , State
  166. , F
  167. >::type
  168. fold(Seq& seq, State& state, F f)
  169. {
  170. return detail::fold<Seq, State, F>(seq, state, f);
  171. }
  172. template<typename Seq, typename State, typename F>
  173. BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED
  174. inline typename result_of::fold<
  175. Seq const
  176. , State
  177. , F
  178. >::type
  179. fold(Seq const& seq, State& state, F f)
  180. {
  181. return detail::fold<Seq const, State, F>(seq, state, f);
  182. }
  183. }}