79 lines
		
	
	
		
			2.1 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
		
		
			
		
	
	
			79 lines
		
	
	
		
			2.1 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
|   | 
 | ||
|  | #ifndef BOOST_MPL_DISTANCE_HPP_INCLUDED | ||
|  | #define BOOST_MPL_DISTANCE_HPP_INCLUDED | ||
|  | 
 | ||
|  | // Copyright Aleksey Gurtovoy 2000-2004 | ||
|  | // | ||
|  | // Distributed under the Boost Software License, Version 1.0.  | ||
|  | // (See accompanying file LICENSE_1_0.txt or copy at  | ||
|  | // http://www.boost.org/LICENSE_1_0.txt) | ||
|  | // | ||
|  | // See http://www.boost.org/libs/mpl for documentation. | ||
|  | 
 | ||
|  | // $Id$ | ||
|  | // $Date$ | ||
|  | // $Revision$ | ||
|  | 
 | ||
|  | #include <boost/mpl/distance_fwd.hpp> | ||
|  | #include <boost/mpl/iter_fold.hpp> | ||
|  | #include <boost/mpl/iterator_range.hpp> | ||
|  | #include <boost/mpl/long.hpp> | ||
|  | #include <boost/mpl/next.hpp> | ||
|  | #include <boost/mpl/tag.hpp> | ||
|  | #include <boost/mpl/apply_wrap.hpp> | ||
|  | #include <boost/mpl/aux_/msvc_eti_base.hpp> | ||
|  | #include <boost/mpl/aux_/value_wknd.hpp> | ||
|  | #include <boost/mpl/aux_/na_spec.hpp> | ||
|  | #include <boost/mpl/aux_/config/forwarding.hpp> | ||
|  | #include <boost/mpl/aux_/config/static_constant.hpp> | ||
|  | 
 | ||
|  | 
 | ||
|  | namespace boost { namespace mpl { | ||
|  | 
 | ||
|  | // default implementation for forward/bidirectional iterators | ||
|  | template< typename Tag > struct distance_impl | ||
|  | { | ||
|  |     template< typename First, typename Last > struct apply | ||
|  | #if !defined(BOOST_MPL_CFG_NO_NESTED_FORWARDING) | ||
|  |         : aux::msvc_eti_base< typename iter_fold< | ||
|  |               iterator_range<First,Last> | ||
|  |             , mpl::long_<0> | ||
|  |             , next<> | ||
|  |             >::type > | ||
|  |     { | ||
|  | #else | ||
|  |     { | ||
|  |         typedef typename iter_fold< | ||
|  |               iterator_range<First,Last> | ||
|  |             , mpl::long_<0> | ||
|  |             , next<> | ||
|  |             >::type type; | ||
|  |          | ||
|  |         BOOST_STATIC_CONSTANT(long, value = | ||
|  |               (iter_fold< | ||
|  |                   iterator_range<First,Last> | ||
|  |                 , mpl::long_<0> | ||
|  |                 , next<> | ||
|  |                 >::type::value) | ||
|  |             ); | ||
|  | #endif | ||
|  |     }; | ||
|  | }; | ||
|  | 
 | ||
|  | template< | ||
|  |       typename BOOST_MPL_AUX_NA_PARAM(First) | ||
|  |     , typename BOOST_MPL_AUX_NA_PARAM(Last) | ||
|  |     > | ||
|  | struct distance | ||
|  |     : distance_impl< typename tag<First>::type > | ||
|  |         ::template apply<First, Last> | ||
|  | { | ||
|  |     BOOST_MPL_AUX_LAMBDA_SUPPORT(2, distance, (First, Last)) | ||
|  | }; | ||
|  | 
 | ||
|  | BOOST_MPL_AUX_NA_SPEC(2, distance) | ||
|  | 
 | ||
|  | }} | ||
|  | 
 | ||
|  | #endif // BOOST_MPL_DISTANCE_HPP_INCLUDED |