98 lines
		
	
	
		
			3.2 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
		
		
			
		
	
	
			98 lines
		
	
	
		
			3.2 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
|   | /////////////////////////////////////////////////////////////////////////////// | ||
|  | /// \file pack.hpp | ||
|  | /// Contains helpers for pseudo-pack expansion. | ||
|  | // | ||
|  | //  Copyright 2012 Eric Niebler. 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) | ||
|  | 
 | ||
|  | #ifndef BOOST_PROTO_TRANSFORM_DETAIL_PACK_HPP_EAN_2012_07_11 | ||
|  | #define BOOST_PROTO_TRANSFORM_DETAIL_PACK_HPP_EAN_2012_07_11 | ||
|  | 
 | ||
|  | #include <boost/preprocessor/cat.hpp> | ||
|  | #include <boost/preprocessor/arithmetic/inc.hpp> | ||
|  | #include <boost/preprocessor/arithmetic/dec.hpp> | ||
|  | #include <boost/preprocessor/arithmetic/sub.hpp> | ||
|  | #include <boost/preprocessor/punctuation/comma_if.hpp> | ||
|  | #include <boost/preprocessor/repetition/enum.hpp> | ||
|  | #include <boost/preprocessor/repetition/enum_params.hpp> | ||
|  | #include <boost/preprocessor/repetition/enum_trailing_params.hpp> | ||
|  | #include <boost/preprocessor/repetition/enum_params_with_a_default.hpp> | ||
|  | #include <boost/preprocessor/repetition/repeat.hpp> | ||
|  | #include <boost/preprocessor/iteration/local.hpp> | ||
|  | #include <boost/preprocessor/iteration/iterate.hpp> | ||
|  | #include <boost/mpl/bool.hpp> | ||
|  | #include <boost/mpl/assert.hpp> | ||
|  | #include <boost/type_traits/is_same.hpp> | ||
|  | #include <boost/proto/proto_fwd.hpp> | ||
|  | 
 | ||
|  | #if defined(_MSC_VER) | ||
|  | # pragma warning(push) | ||
|  | # pragma warning(disable: 4348) // redefinition of default parameter | ||
|  | #endif | ||
|  | 
 | ||
|  | namespace boost { namespace proto | ||
|  | { | ||
|  |     namespace detail | ||
|  |     { | ||
|  |         template<typename Fun> | ||
|  |         struct msvc_fun_workaround; | ||
|  | 
 | ||
|  |         template<typename Tfx, typename T> | ||
|  |         struct expand_pattern_helper | ||
|  |         { | ||
|  |             typedef T type; | ||
|  |             typedef mpl::false_ applied; | ||
|  |         }; | ||
|  | 
 | ||
|  |         template<typename Tfx, typename Fun> | ||
|  |         struct expand_pattern_helper<Tfx, Fun *> | ||
|  |           : expand_pattern_helper<Tfx, Fun> | ||
|  |         {}; | ||
|  | 
 | ||
|  |         template<typename Tfx, typename T> | ||
|  |         struct expand_pattern_helper<Tfx, pack(T)> | ||
|  |         { | ||
|  |             // BUGBUG fix me. See comment in transform/detail/call.hpp | ||
|  |             BOOST_MPL_ASSERT_MSG( | ||
|  |                 (is_same<T, _>::value) | ||
|  |               , PACK_EXPANSIONS_OF_EXPRESSIONS_OTHER_THAN_THE_CURRENT_NOT_YET_SUPPORTED | ||
|  |               , (T) | ||
|  |             ); | ||
|  |             typedef Tfx type(T); | ||
|  |             typedef mpl::true_ applied; | ||
|  |         }; | ||
|  | 
 | ||
|  |         template<typename Tfx> | ||
|  |         struct expand_pattern_helper<Tfx, pack(_)> | ||
|  |         { | ||
|  |             typedef Tfx type; | ||
|  |             typedef mpl::true_ applied; | ||
|  |         }; | ||
|  | 
 | ||
|  |         #include <boost/proto/transform/detail/expand_pack.hpp> | ||
|  | 
 | ||
|  |         template<long Arity, typename Fun, typename Cont> | ||
|  |         struct expand_pattern; | ||
|  | 
 | ||
|  |         template<typename Fun, typename Cont> | ||
|  |         struct expand_pattern<0, Fun, Cont> | ||
|  |           : Cont::template cat<typename expand_pattern_helper<proto::_value, Fun>::type> | ||
|  |         { | ||
|  |             BOOST_MPL_ASSERT_MSG( | ||
|  |                 (expand_pattern_helper<proto::_value, Fun>::applied::value) | ||
|  |               , NO_PACK_EXPRESSION_FOUND_IN_PACK_EXPANSION | ||
|  |               , (Fun) | ||
|  |             ); | ||
|  |         }; | ||
|  | 
 | ||
|  |         #include <boost/proto/transform/detail/pack_impl.hpp> | ||
|  |     } | ||
|  | }} | ||
|  | 
 | ||
|  | #if defined(_MSC_VER) | ||
|  | # pragma warning(pop) | ||
|  | #endif | ||
|  | 
 | ||
|  | #endif |