113 lines
		
	
	
		
			2.6 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
		
		
			
		
	
	
			113 lines
		
	
	
		
			2.6 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
|   | 
 | ||
|  | #ifndef BOOST_MPL_EQUAL_HPP_INCLUDED
 | ||
|  | #define BOOST_MPL_EQUAL_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/aux_/iter_fold_if_impl.hpp>
 | ||
|  | #include <boost/mpl/aux_/iter_apply.hpp>
 | ||
|  | #include <boost/mpl/and.hpp>
 | ||
|  | #include <boost/mpl/not.hpp>
 | ||
|  | #include <boost/mpl/begin_end.hpp>
 | ||
|  | #include <boost/mpl/next.hpp>
 | ||
|  | #include <boost/mpl/always.hpp>
 | ||
|  | #include <boost/mpl/bool.hpp>
 | ||
|  | #include <boost/mpl/lambda.hpp>
 | ||
|  | #include <boost/mpl/bind.hpp>
 | ||
|  | #include <boost/mpl/apply.hpp>
 | ||
|  | #include <boost/mpl/void.hpp>
 | ||
|  | #include <boost/mpl/aux_/na_spec.hpp>
 | ||
|  | #include <boost/mpl/aux_/lambda_support.hpp>
 | ||
|  | #include <boost/mpl/aux_/msvc_eti_base.hpp>
 | ||
|  | 
 | ||
|  | #include <boost/type_traits/is_same.hpp>
 | ||
|  | 
 | ||
|  | namespace boost { namespace mpl { | ||
|  | 
 | ||
|  | namespace aux { | ||
|  | 
 | ||
|  | template< | ||
|  |       typename Predicate | ||
|  |     , typename LastIterator1 | ||
|  |     , typename LastIterator2 | ||
|  |     > | ||
|  | struct equal_pred | ||
|  | { | ||
|  |     template< | ||
|  |           typename Iterator2 | ||
|  |         , typename Iterator1 | ||
|  |         > | ||
|  |     struct apply | ||
|  |     { | ||
|  |         typedef typename and_<  | ||
|  |               not_< is_same<Iterator1,LastIterator1> > | ||
|  |             , not_< is_same<Iterator2,LastIterator2> > | ||
|  |             , aux::iter_apply2<Predicate,Iterator1,Iterator2> | ||
|  |             >::type type; | ||
|  |     }; | ||
|  | }; | ||
|  | 
 | ||
|  | template< | ||
|  |       typename Sequence1 | ||
|  |     , typename Sequence2 | ||
|  |     , typename Predicate | ||
|  |     > | ||
|  | struct equal_impl | ||
|  | { | ||
|  |     typedef typename begin<Sequence1>::type first1_; | ||
|  |     typedef typename begin<Sequence2>::type first2_; | ||
|  |     typedef typename end<Sequence1>::type last1_; | ||
|  |     typedef typename end<Sequence2>::type last2_; | ||
|  | 
 | ||
|  |     typedef aux::iter_fold_if_impl< | ||
|  |           first1_ | ||
|  |         , first2_ | ||
|  |         , next<> | ||
|  |         , protect< aux::equal_pred<Predicate,last1_,last2_> > | ||
|  |         , void_ | ||
|  |         , always<false_> | ||
|  |         > fold_; | ||
|  | 
 | ||
|  |     typedef typename fold_::iterator iter1_; | ||
|  |     typedef typename fold_::state iter2_; | ||
|  |     typedef and_< | ||
|  |           is_same<iter1_,last1_> | ||
|  |         , is_same<iter2_,last2_> | ||
|  |         > result_; | ||
|  | 
 | ||
|  |     typedef typename result_::type type; | ||
|  | }; | ||
|  | 
 | ||
|  | 
 | ||
|  | } // namespace aux
 | ||
|  | 
 | ||
|  | 
 | ||
|  | template< | ||
|  |       typename BOOST_MPL_AUX_NA_PARAM(Sequence1) | ||
|  |     , typename BOOST_MPL_AUX_NA_PARAM(Sequence2) | ||
|  |     , typename Predicate = is_same<_,_> | ||
|  |     > | ||
|  | struct equal | ||
|  |     : aux::msvc_eti_base<  | ||
|  |           typename aux::equal_impl<Sequence1,Sequence2,Predicate>::type | ||
|  |         >::type | ||
|  | { | ||
|  |     BOOST_MPL_AUX_LAMBDA_SUPPORT(2,equal,(Sequence1,Sequence2)) | ||
|  | }; | ||
|  | 
 | ||
|  | BOOST_MPL_AUX_NA_SPEC(2, equal) | ||
|  | 
 | ||
|  | }} | ||
|  | 
 | ||
|  | #endif // BOOST_MPL_EQUAL_HPP_INCLUDED
 |