iter_fold.hpp 5.9 KB

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