#ifndef BOOST_METAPARSE_META_HS_CURRY_HPP #define BOOST_METAPARSE_META_HS_CURRY_HPP // Copyright Abel Sinkovics (abel@sinkovics.hu) 2010. // 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) #include #include #include #include #include #include #include #include #include #include #include #include #include #include #ifndef CURRY_MAX_ARGUMENT # define CURRY_MAX_ARGUMENT 5 #endif namespace impl { template < class UnpackedMetafunctionClass, class ArgumentsLeft, class ArgumentList > struct curry_impl; template < class UnpackedMetafunctionClass, class ArgumentsLeft, class ArgumentList > struct next_currying_step { typedef next_currying_step type; template struct apply : curry_impl< UnpackedMetafunctionClass, typename boost::mpl::minus< ArgumentsLeft, boost::mpl::int_<1> >::type, typename boost::mpl::push_back::type > {}; }; template < class UnpackedMetafunctionClass, class ArgumentsLeft, class ArgumentList > struct curry_impl : boost::mpl::eval_if< typename boost::mpl::equal_to< ArgumentsLeft, boost::mpl::int_<0> >::type, boost::mpl::apply, next_currying_step< UnpackedMetafunctionClass, ArgumentsLeft, ArgumentList > > {}; } template struct curry0 : T {}; #ifdef CURRY # error CURRY already defined #endif #define CURRY(z, n, unused) \ template