Chris@16
|
1 /*=============================================================================
|
Chris@16
|
2 Copyright (c) 2011 Eric Niebler
|
Chris@16
|
3
|
Chris@16
|
4 Distributed under the Boost Software License, Version 1.0. (See accompanying
|
Chris@16
|
5 file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
|
Chris@16
|
6 ==============================================================================*/
|
Chris@16
|
7 #if !defined(BOOST_FUSION_SEGMENTED_FOLD_UNTIL_HPP_INCLUDED)
|
Chris@16
|
8 #define BOOST_FUSION_SEGMENTED_FOLD_UNTIL_HPP_INCLUDED
|
Chris@16
|
9
|
Chris@101
|
10 #include <boost/fusion/support/config.hpp>
|
Chris@16
|
11 #include <boost/type_traits/is_const.hpp>
|
Chris@16
|
12 #include <boost/utility/enable_if.hpp>
|
Chris@16
|
13 #include <boost/fusion/support/detail/segmented_fold_until_impl.hpp>
|
Chris@16
|
14 #include <boost/fusion/view/iterator_range.hpp>
|
Chris@16
|
15 #include <boost/fusion/sequence/intrinsic/begin.hpp>
|
Chris@16
|
16 #include <boost/fusion/sequence/intrinsic/end.hpp>
|
Chris@16
|
17 #include <boost/fusion/sequence/intrinsic/empty.hpp>
|
Chris@16
|
18 #include <boost/fusion/container/list/cons.hpp>
|
Chris@16
|
19
|
Chris@16
|
20 namespace boost { namespace fusion
|
Chris@16
|
21 {
|
Chris@16
|
22 //auto segmented_fold_until(seq, state, fun)
|
Chris@16
|
23 //{
|
Chris@16
|
24 // return first(segmented_fold_until_impl(seq, state, nil_, fun));
|
Chris@16
|
25 //}
|
Chris@16
|
26
|
Chris@16
|
27 namespace result_of
|
Chris@16
|
28 {
|
Chris@16
|
29 template <typename Sequence, typename State, typename Fun>
|
Chris@16
|
30 struct segmented_fold_until
|
Chris@16
|
31 {
|
Chris@16
|
32 typedef
|
Chris@16
|
33 detail::segmented_fold_until_impl<
|
Chris@16
|
34 Sequence
|
Chris@16
|
35 , State
|
Chris@16
|
36 , fusion::nil_
|
Chris@16
|
37 , Fun
|
Chris@16
|
38 >
|
Chris@16
|
39 filter;
|
Chris@16
|
40
|
Chris@16
|
41 typedef
|
Chris@16
|
42 typename filter::type
|
Chris@16
|
43 type;
|
Chris@16
|
44 };
|
Chris@16
|
45 }
|
Chris@16
|
46
|
Chris@16
|
47 template <typename Sequence, typename State, typename Fun>
|
Chris@101
|
48 BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED
|
Chris@101
|
49 inline typename
|
Chris@16
|
50 lazy_disable_if<
|
Chris@16
|
51 is_const<Sequence>
|
Chris@16
|
52 , result_of::segmented_fold_until<Sequence, State, Fun>
|
Chris@16
|
53 >::type
|
Chris@16
|
54 segmented_fold_until(Sequence& seq, State const& state, Fun const& fun)
|
Chris@16
|
55 {
|
Chris@16
|
56 typedef
|
Chris@16
|
57 typename result_of::segmented_fold_until<Sequence, State, Fun>::filter
|
Chris@16
|
58 filter;
|
Chris@101
|
59
|
Chris@16
|
60 return filter::call(seq, state, fusion::nil_(), fun);
|
Chris@16
|
61 }
|
Chris@16
|
62
|
Chris@16
|
63 template <typename Sequence, typename State, typename Fun>
|
Chris@101
|
64 BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED
|
Chris@101
|
65 inline typename result_of::segmented_fold_until<Sequence const, State, Fun>::type
|
Chris@16
|
66 segmented_fold_until(Sequence const& seq, State const& state, Fun const& fun)
|
Chris@16
|
67 {
|
Chris@16
|
68 typedef
|
Chris@16
|
69 typename result_of::segmented_fold_until<Sequence const, State, Fun>::filter
|
Chris@16
|
70 filter;
|
Chris@101
|
71
|
Chris@16
|
72 return filter::call(seq, state, fusion::nil_(), fun);
|
Chris@16
|
73 }
|
Chris@16
|
74 }}
|
Chris@16
|
75
|
Chris@16
|
76 #endif
|