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 |