113 lines
		
	
	
		
			2.7 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
			
		
		
	
	
			113 lines
		
	
	
		
			2.7 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
| 
 | |
| #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
 | 
