146 lines
		
	
	
		
			4.2 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
			
		
		
	
	
			146 lines
		
	
	
		
			4.2 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
| 
 | |
| #ifndef BOOST_MPL_TRANSFORM_HPP_INCLUDED
 | |
| #define BOOST_MPL_TRANSFORM_HPP_INCLUDED
 | |
| 
 | |
| // Copyright Aleksey Gurtovoy 2000-2004
 | |
| // Copyright David Abrahams 2003-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/fold.hpp>
 | |
| #include <boost/mpl/reverse_fold.hpp>
 | |
| #include <boost/mpl/pair_view.hpp>
 | |
| #include <boost/mpl/is_sequence.hpp>
 | |
| #include <boost/mpl/eval_if.hpp>
 | |
| #include <boost/mpl/lambda.hpp>
 | |
| #include <boost/mpl/bind.hpp>
 | |
| #include <boost/mpl/or.hpp>
 | |
| #include <boost/mpl/not.hpp>
 | |
| #include <boost/mpl/aux_/na.hpp>
 | |
| #include <boost/mpl/aux_/inserter_algorithm.hpp>
 | |
| 
 | |
| namespace boost { namespace mpl {
 | |
| 
 | |
| namespace aux { 
 | |
| 
 | |
| template< 
 | |
|       typename Seq
 | |
|     , typename Op
 | |
|     , typename In
 | |
|     >
 | |
| struct transform1_impl
 | |
|     : fold< 
 | |
|           Seq
 | |
|         , typename In::state
 | |
|         , bind2< typename lambda< typename In::operation >::type
 | |
|             , _1
 | |
|             , bind1< typename lambda<Op>::type, _2>
 | |
|             > 
 | |
|         >
 | |
| {
 | |
| };
 | |
| 
 | |
| template< 
 | |
|       typename Seq
 | |
|     , typename Op
 | |
|     , typename In
 | |
|     >
 | |
| struct reverse_transform1_impl
 | |
|     : reverse_fold< 
 | |
|           Seq
 | |
|         , typename In::state
 | |
|         , bind2< typename lambda< typename In::operation >::type
 | |
|             , _1
 | |
|             , bind1< typename lambda<Op>::type, _2>
 | |
|             > 
 | |
|         >
 | |
| {
 | |
| };
 | |
| 
 | |
| template< 
 | |
|       typename Seq1
 | |
|     , typename Seq2
 | |
|     , typename Op
 | |
|     , typename In
 | |
|     >
 | |
| struct transform2_impl
 | |
|     : fold< 
 | |
|           pair_view<Seq1,Seq2>
 | |
|         , typename In::state
 | |
|         , bind2< typename lambda< typename In::operation >::type
 | |
|             , _1
 | |
|             , bind2<
 | |
|                   typename lambda<Op>::type
 | |
|                 , bind1<first<>,_2>
 | |
|                 , bind1<second<>,_2>
 | |
|                 >
 | |
|             > 
 | |
|         >
 | |
| {
 | |
| };
 | |
| 
 | |
| template< 
 | |
|       typename Seq1
 | |
|     , typename Seq2
 | |
|     , typename Op
 | |
|     , typename In
 | |
|     >
 | |
| struct reverse_transform2_impl
 | |
|     : reverse_fold< 
 | |
|           pair_view<Seq1,Seq2>
 | |
|         , typename In::state
 | |
|         , bind2< typename lambda< typename In::operation >::type
 | |
|             , _1
 | |
|             , bind2< typename lambda< Op >::type
 | |
|                 , bind1<first<>,_2>
 | |
|                 , bind1<second<>,_2>
 | |
|                 >
 | |
|             > 
 | |
|         >
 | |
| {
 | |
| };
 | |
| 
 | |
| } // namespace aux 
 | |
| 
 | |
| BOOST_MPL_AUX_INSERTER_ALGORITHM_DEF(3, transform1)                    
 | |
| BOOST_MPL_AUX_INSERTER_ALGORITHM_DEF(4, transform2)
 | |
|     
 | |
| #define AUX778076_TRANSFORM_DEF(name)                                   \
 | |
| template<                                                               \
 | |
|       typename BOOST_MPL_AUX_NA_PARAM(Seq1)                             \
 | |
|     , typename BOOST_MPL_AUX_NA_PARAM(Seq2OrOperation)                  \
 | |
|     , typename BOOST_MPL_AUX_NA_PARAM(OperationOrInserter)              \
 | |
|     , typename BOOST_MPL_AUX_NA_PARAM(Inserter)                         \
 | |
|     >                                                                   \
 | |
| struct name                                                             \
 | |
| {                                                                       \
 | |
|     typedef typename eval_if<                                           \
 | |
|           or_<                                                          \
 | |
|               is_na<OperationOrInserter>                                \
 | |
|             , is_lambda_expression< Seq2OrOperation >                   \
 | |
|             , not_< is_sequence<Seq2OrOperation> >                      \
 | |
|             >                                                           \
 | |
|         , name##1<Seq1,Seq2OrOperation,OperationOrInserter>             \
 | |
|         , name##2<Seq1,Seq2OrOperation,OperationOrInserter,Inserter>    \
 | |
|         >::type type;                                                   \
 | |
| };                                                                      \
 | |
| BOOST_MPL_AUX_NA_SPEC(4, name)                                          \
 | |
| /**/
 | |
| 
 | |
| AUX778076_TRANSFORM_DEF(transform)
 | |
| AUX778076_TRANSFORM_DEF(reverse_transform)
 | |
| 
 | |
| #undef AUX778076_TRANSFORM_DEF
 | |
| 
 | |
| }}
 | |
| 
 | |
| #endif // BOOST_MPL_TRANSFORM_HPP_INCLUDED
 | 
