Chris@16
|
1 /*=============================================================================
|
Chris@16
|
2 Copyright (c) 2001-2011 Joel de Guzman
|
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(FUSION_DISTANCE_09172005_0730)
|
Chris@16
|
8 #define FUSION_DISTANCE_09172005_0730
|
Chris@16
|
9
|
Chris@101
|
10 #include <boost/fusion/support/config.hpp>
|
Chris@16
|
11 #include <boost/mpl/int.hpp>
|
Chris@16
|
12 #include <boost/mpl/if.hpp>
|
Chris@16
|
13 #include <boost/mpl/eval_if.hpp>
|
Chris@16
|
14 #include <boost/mpl/next.hpp>
|
Chris@16
|
15 #include <boost/mpl/identity.hpp>
|
Chris@16
|
16 #include <boost/fusion/iterator/next.hpp>
|
Chris@16
|
17 #include <boost/fusion/iterator/equal_to.hpp>
|
Chris@16
|
18
|
Chris@16
|
19 namespace boost { namespace fusion { namespace distance_detail
|
Chris@16
|
20 {
|
Chris@16
|
21 // Default distance implementation, linear
|
Chris@16
|
22 // search for the Last iterator.
|
Chris@16
|
23
|
Chris@16
|
24 template <typename First, typename Last>
|
Chris@16
|
25 struct linear_distance;
|
Chris@16
|
26
|
Chris@16
|
27 template <typename First, typename Last>
|
Chris@16
|
28 struct next_distance
|
Chris@16
|
29 {
|
Chris@16
|
30 typedef typename
|
Chris@16
|
31 mpl::next<
|
Chris@16
|
32 typename linear_distance<
|
Chris@16
|
33 typename result_of::next<First>::type
|
Chris@16
|
34 , Last
|
Chris@16
|
35 >::type
|
Chris@16
|
36 >::type
|
Chris@16
|
37 type;
|
Chris@16
|
38 };
|
Chris@16
|
39
|
Chris@16
|
40 template <typename First, typename Last>
|
Chris@16
|
41 struct linear_distance
|
Chris@16
|
42 : mpl::eval_if<
|
Chris@16
|
43 result_of::equal_to<First, Last>
|
Chris@16
|
44 , mpl::identity<mpl::int_<0> >
|
Chris@16
|
45 , next_distance<First, Last>
|
Chris@16
|
46 >::type
|
Chris@16
|
47 {
|
Chris@16
|
48 typedef typename
|
Chris@16
|
49 mpl::eval_if<
|
Chris@16
|
50 result_of::equal_to<First, Last>
|
Chris@16
|
51 , mpl::identity<mpl::int_<0> >
|
Chris@16
|
52 , next_distance<First, Last>
|
Chris@16
|
53 >::type
|
Chris@16
|
54 type;
|
Chris@16
|
55
|
Chris@101
|
56 BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED
|
Chris@16
|
57 static type
|
Chris@16
|
58 call(First const&, Last const&)
|
Chris@16
|
59 {
|
Chris@16
|
60 return type();
|
Chris@16
|
61 }
|
Chris@16
|
62 };
|
Chris@16
|
63
|
Chris@16
|
64 }}}
|
Chris@16
|
65
|
Chris@16
|
66 #endif
|