@@ -1284,13 +1284,27 @@ namespace parameter_pack {
12841284
12851285template <typename ... EnumArgs>
12861286struct EnumeratedParamPack {
1287- struct Invoke {
1288- template <template <size_t i, typename TArgument> class Functor , typename ... ExtraParams>
1289- static void F (ExtraParams&&... extra_params) {
1287+ struct InvokeWithoutArg {
1288+ template <template <size_t i, typename TArgument> class Functor , typename ExtraParams>
1289+ static void F (ExtraParams&& extra_params) {
12901290 using TExpander = int [];
12911291 (void )TExpander{
12921292 0 ,
1293- (Functor<EnumArgs::i, typename EnumArgs::T>::F (extra_params...), 0 )...,
1293+ (Functor<EnumArgs::i, typename EnumArgs::T>::F (std::forward<ExtraParams>(extra_params)),
1294+ 0 )...,
1295+ };
1296+ }
1297+ };
1298+ struct InvokeWithArg {
1299+ template <template <size_t i, typename TArgument> class Functor , typename ExtraParams,
1300+ typename ... Params>
1301+ static void F (ExtraParams&& extra_params, Params&&... params) {
1302+ using TExpander = int [];
1303+ (void )TExpander{
1304+ 0 ,
1305+ (Functor<EnumArgs::i, typename EnumArgs::T>::F (std::forward<ExtraParams>(extra_params),
1306+ std::forward<Params>(params)),
1307+ 0 )...,
12941308 };
12951309 }
12961310 };
@@ -1310,22 +1324,27 @@ struct EnumerateImpl {
13101324
13111325 template <std::size_t ... id>
13121326 struct Zipper <std::integer_sequence<std::size_t , id...>> {
1313- using T = EnumeratedParamPack<Item<id, Args>...>;
1327+ using WithoutArg = typename EnumeratedParamPack<Item<id, Args>...>::InvokeWithoutArg;
1328+ using WithArg = typename EnumeratedParamPack<Item<id, Args>...>::InvokeWithArg;
13141329 };
13151330
13161331 public:
1317- using T = typename Zipper<std::index_sequence_for<Args...>>::T;
1332+ using WithoutArg = typename Zipper<std::index_sequence_for<Args...>>::WithoutArg;
1333+ using WithArg = typename Zipper<std::index_sequence_for<Args...>>::WithArg;
13181334};
13191335
13201336template <typename ... Args>
1321- using Enumerate = typename EnumerateImpl<Args...>::T;
1337+ using EnumerateWithoutArg = typename EnumerateImpl<Args...>::WithoutArg;
1338+
1339+ template <typename ... Args>
1340+ using EnumerateWithArg = typename EnumerateImpl<Args...>::WithArg;
13221341
13231342template <typename ... Args>
13241343struct ParamPack {
1325- template <template <size_t i, typename TArgument> class Functor , typename ... ExtraParams>
1326- static void InvokeWithoutArg (ExtraParams&&... extra_params) {
1327- Enumerate <Args...>::Invoke:: template F<Functor, ExtraParams... >(
1328- std::forward<ExtraParams>(extra_params)... );
1344+ template <template <size_t i, typename TArgument> class Functor , typename ExtraParams>
1345+ static void InvokeWithoutArg (ExtraParams&& extra_params) {
1346+ EnumerateWithoutArg <Args...>::template F<Functor, ExtraParams>(
1347+ std::forward<ExtraParams>(extra_params));
13291348 }
13301349};
13311350
@@ -1622,6 +1641,20 @@ inline TVMRetValue PackedFunc::operator()(Args&&... args) const {
16221641 return rv;
16231642}
16241643
1644+ template <int i, typename T>
1645+ struct TVMArgsSetterApply {
1646+ static TVM_ALWAYS_INLINE void F (TVMArgsSetter* setter, T&& value) {
1647+ (*setter)(i, std::forward<T>(value));
1648+ }
1649+ };
1650+
1651+ template <typename ... Args>
1652+ void TVM_ALWAYS_INLINE PackArgs (TVMValue* values, int * type_codes, Args&&... args) {
1653+ TVMArgsSetter setter (values, type_codes);
1654+ detail::parameter_pack::EnumerateWithArg<Args...>::template F<TVMArgsSetterApply>(
1655+ &setter, std::forward<Args>(args)...);
1656+ }
1657+
16251658namespace detail {
16261659template <typename R, int nleft, int index, typename F>
16271660struct unpack_call_dispatcher {
0 commit comments