diff --git a/orc-rt/unittests/DirectCaller.h b/orc-rt/unittests/DirectCaller.h new file mode 100644 index 0000000000000..7c5c9d300d882 --- /dev/null +++ b/orc-rt/unittests/DirectCaller.h @@ -0,0 +1,71 @@ +//===- DirectCaller.h -----------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef ORC_RT_UNITTEST_DIRECTCALLER_H +#define ORC_RT_UNITTEST_DIRECTCALLER_H + +#include "orc-rt/WrapperFunction.h" + +#include +#include + +/// Make calls and call result handlers directly on the current thread. +class DirectCaller { +private: + class DirectResultSender { + public: + virtual ~DirectResultSender() {} + virtual void send(orc_rt_SessionRef Session, + orc_rt::WrapperFunctionBuffer ResultBytes) = 0; + static void send(orc_rt_SessionRef Session, void *CallCtx, + orc_rt_WrapperFunctionBuffer ResultBytes) { + std::unique_ptr( + reinterpret_cast(CallCtx)) + ->send(Session, ResultBytes); + } + }; + + template + class DirectResultSenderImpl : public DirectResultSender { + public: + DirectResultSenderImpl(ImplFn &&Fn) : Fn(std::forward(Fn)) {} + void send(orc_rt_SessionRef Session, + orc_rt::WrapperFunctionBuffer ResultBytes) override { + Fn(Session, std::move(ResultBytes)); + } + + private: + std::decay_t Fn; + }; + + template + static std::unique_ptr + makeDirectResultSender(ImplFn &&Fn) { + return std::make_unique>( + std::forward(Fn)); + } + +public: + DirectCaller(orc_rt_SessionRef Session, orc_rt_WrapperFunction Fn) + : Session(Session), Fn(Fn) {} + + template + void operator()(HandleResultFn &&HandleResult, + orc_rt::WrapperFunctionBuffer ArgBytes) { + auto DR = + makeDirectResultSender(std::forward(HandleResult)); + Fn(Session, reinterpret_cast(DR.release()), + DirectResultSender::send, ArgBytes.release()); + } + +private: + orc_rt_SessionRef Session; + orc_rt_WrapperFunction Fn; +}; + +#endif // ORC_RT_UNITTEST_DIRECTCALLER_H diff --git a/orc-rt/unittests/SPSWrapperFunctionTest.cpp b/orc-rt/unittests/SPSWrapperFunctionTest.cpp index 9d0d9e46d1958..d9f34e6b7bfa2 100644 --- a/orc-rt/unittests/SPSWrapperFunctionTest.cpp +++ b/orc-rt/unittests/SPSWrapperFunctionTest.cpp @@ -16,64 +16,12 @@ #include "orc-rt/WrapperFunction.h" #include "orc-rt/move_only_function.h" +#include "DirectCaller.h" + #include "gtest/gtest.h" using namespace orc_rt; -/// Make calls and call result handlers directly on the current thread. -class DirectCaller { -private: - class DirectResultSender { - public: - virtual ~DirectResultSender() {} - virtual void send(orc_rt_SessionRef Session, - WrapperFunctionBuffer ResultBytes) = 0; - static void send(orc_rt_SessionRef Session, void *CallCtx, - orc_rt_WrapperFunctionBuffer ResultBytes) { - std::unique_ptr( - reinterpret_cast(CallCtx)) - ->send(Session, ResultBytes); - } - }; - - template - class DirectResultSenderImpl : public DirectResultSender { - public: - DirectResultSenderImpl(ImplFn &&Fn) : Fn(std::forward(Fn)) {} - void send(orc_rt_SessionRef Session, - WrapperFunctionBuffer ResultBytes) override { - Fn(Session, std::move(ResultBytes)); - } - - private: - std::decay_t Fn; - }; - - template - static std::unique_ptr - makeDirectResultSender(ImplFn &&Fn) { - return std::make_unique>( - std::forward(Fn)); - } - -public: - DirectCaller(orc_rt_SessionRef Session, orc_rt_WrapperFunction Fn) - : Session(Session), Fn(Fn) {} - - template - void operator()(HandleResultFn &&HandleResult, - WrapperFunctionBuffer ArgBytes) { - auto DR = - makeDirectResultSender(std::forward(HandleResult)); - Fn(Session, reinterpret_cast(DR.release()), - DirectResultSender::send, ArgBytes.release()); - } - -private: - orc_rt_SessionRef Session; - orc_rt_WrapperFunction Fn; -}; - static void void_noop_sps_wrapper(orc_rt_SessionRef Session, void *CallCtx, orc_rt_WrapperFunctionReturn Return, orc_rt_WrapperFunctionBuffer ArgBytes) {