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

source code of include/boost/fusion/iterator/detail/distance.hpp