| [12] | 1 |  | 
|---|
 | 2 | #ifndef BOOST_MPL_DISTANCE_HPP_INCLUDED | 
|---|
 | 3 | #define BOOST_MPL_DISTANCE_HPP_INCLUDED | 
|---|
 | 4 |  | 
|---|
 | 5 | // Copyright Aleksey Gurtovoy 2000-2004 | 
|---|
 | 6 | // | 
|---|
 | 7 | // Distributed under the Boost Software License, Version 1.0.  | 
|---|
 | 8 | // (See accompanying file LICENSE_1_0.txt or copy at  | 
|---|
 | 9 | // http://www.boost.org/LICENSE_1_0.txt) | 
|---|
 | 10 | // | 
|---|
 | 11 | // See http://www.boost.org/libs/mpl for documentation. | 
|---|
 | 12 |  | 
|---|
 | 13 | // $Source: /cvsroot/boost/boost/boost/mpl/distance.hpp,v $ | 
|---|
 | 14 | // $Date: 2005/01/26 01:58:33 $ | 
|---|
 | 15 | // $Revision: 1.10 $ | 
|---|
 | 16 |  | 
|---|
 | 17 | #include <boost/mpl/distance_fwd.hpp> | 
|---|
 | 18 | #include <boost/mpl/iter_fold.hpp> | 
|---|
 | 19 | #include <boost/mpl/iterator_range.hpp> | 
|---|
 | 20 | #include <boost/mpl/long.hpp> | 
|---|
 | 21 | #include <boost/mpl/next.hpp> | 
|---|
 | 22 | #include <boost/mpl/tag.hpp> | 
|---|
 | 23 | #include <boost/mpl/apply_wrap.hpp> | 
|---|
 | 24 | #include <boost/mpl/aux_/msvc_eti_base.hpp> | 
|---|
 | 25 | #include <boost/mpl/aux_/value_wknd.hpp> | 
|---|
 | 26 | #include <boost/mpl/aux_/na_spec.hpp> | 
|---|
 | 27 | #include <boost/mpl/aux_/config/forwarding.hpp> | 
|---|
 | 28 | #include <boost/mpl/aux_/config/static_constant.hpp> | 
|---|
 | 29 |  | 
|---|
 | 30 |  | 
|---|
 | 31 | namespace boost { namespace mpl { | 
|---|
 | 32 |  | 
|---|
 | 33 | // default implementation for forward/bidirectional iterators | 
|---|
 | 34 | template< typename Tag > struct distance_impl | 
|---|
 | 35 | { | 
|---|
 | 36 |     template< typename First, typename Last > struct apply | 
|---|
 | 37 | #if !defined(BOOST_MPL_CFG_NO_NESTED_FORWARDING) | 
|---|
 | 38 |         : aux::msvc_eti_base< typename iter_fold< | 
|---|
 | 39 |               iterator_range<First,Last> | 
|---|
 | 40 |             , mpl::long_<0> | 
|---|
 | 41 |             , next<> | 
|---|
 | 42 |             >::type > | 
|---|
 | 43 |     { | 
|---|
 | 44 | #else | 
|---|
 | 45 |     { | 
|---|
 | 46 |         typedef typename iter_fold< | 
|---|
 | 47 |               iterator_range<First,Last> | 
|---|
 | 48 |             , mpl::long_<0> | 
|---|
 | 49 |             , next<> | 
|---|
 | 50 |             >::type type; | 
|---|
 | 51 |          | 
|---|
 | 52 |         BOOST_STATIC_CONSTANT(long, value = | 
|---|
 | 53 |               (iter_fold< | 
|---|
 | 54 |                   iterator_range<First,Last> | 
|---|
 | 55 |                 , mpl::long_<0> | 
|---|
 | 56 |                 , next<> | 
|---|
 | 57 |                 >::type::value) | 
|---|
 | 58 |             ); | 
|---|
 | 59 | #endif | 
|---|
 | 60 |     }; | 
|---|
 | 61 | }; | 
|---|
 | 62 |  | 
|---|
 | 63 | template< | 
|---|
 | 64 |       typename BOOST_MPL_AUX_NA_PARAM(First) | 
|---|
 | 65 |     , typename BOOST_MPL_AUX_NA_PARAM(Last) | 
|---|
 | 66 |     > | 
|---|
 | 67 | struct distance | 
|---|
 | 68 |     : distance_impl< typename tag<First>::type > | 
|---|
 | 69 |         ::template apply<First, Last> | 
|---|
 | 70 | { | 
|---|
 | 71 |     BOOST_MPL_AUX_LAMBDA_SUPPORT(2, distance, (First, Last)) | 
|---|
 | 72 | }; | 
|---|
 | 73 |  | 
|---|
 | 74 | BOOST_MPL_AUX_NA_SPEC(2, distance) | 
|---|
 | 75 |  | 
|---|
 | 76 | }} | 
|---|
 | 77 |  | 
|---|
 | 78 | #endif // BOOST_MPL_DISTANCE_HPP_INCLUDED | 
|---|