| #pragma once |
| |
| #include <ATen/core/dispatch/Dispatcher.h> |
| |
| template <class... Inputs> |
| inline std::vector<c10::IValue> makeStack(Inputs&&... inputs) { |
| return {std::forward<Inputs>(inputs)...}; |
| } |
| |
| template <class... Args> |
| inline std::vector<c10::IValue> callOp( |
| const c10::OperatorHandle& op, |
| Args... args) { |
| auto stack = makeStack(std::forward<Args>(args)...); |
| c10::Dispatcher::singleton().callBoxed(op, &stack); |
| return stack; |
| } |
| |
| template <class... Args> |
| inline std::vector<c10::IValue> callOp( |
| const char* func_name, |
| const char* overload_name, |
| Args... args) { |
| const c10::optional<c10::OperatorHandle> op_handle = |
| c10::Dispatcher::singleton().findSchema({func_name, overload_name}); |
| assert(op_handle.has_value()); |
| return callOp(op_handle.value(), args...); |
| } |