@@ -234,7 +234,7 @@ class CodeInjection2<T, decltype(std::declval<T>()(std::declval<BaseCodeInjectio
234234public:
235235 CodeInjection2 (uintptr_t addr, T handler, bool needs_trampoline) :
236236 BaseCodeInjectionWithRegsAccess (addr, reinterpret_cast <WrapperPtr>(&wrapper), needs_trampoline),
237- m_functor (handler)
237+ m_functor (std::move( handler) )
238238 {}
239239
240240private:
@@ -253,8 +253,8 @@ class BaseCodeInjectionWithoutRegsAccess : public BaseCodeInjection
253253
254254 WrapperPtr m_wrapper_ptr;
255255
256- BaseCodeInjectionWithoutRegsAccess (uintptr_t addr, WrapperPtr wrapper_ptr, bool needs_trampoline ) :
257- BaseCodeInjection (addr, needs_trampoline ), m_wrapper_ptr(wrapper_ptr)
256+ BaseCodeInjectionWithoutRegsAccess (uintptr_t addr, WrapperPtr wrapper_ptr) :
257+ BaseCodeInjection (addr, true ), m_wrapper_ptr(wrapper_ptr)
258258 {}
259259
260260 void emit_code (AsmWriter& asm_writter, void * trampoline) override ;
@@ -266,9 +266,9 @@ class CodeInjection2<T, decltype(std::declval<T>()())> : public BaseCodeInjectio
266266 T m_functor;
267267
268268public:
269- CodeInjection2 (uintptr_t addr, T handler, bool needs_trampoline ) :
270- BaseCodeInjectionWithoutRegsAccess (addr, reinterpret_cast <WrapperPtr>(&wrapper), needs_trampoline ),
271- m_functor (handler)
269+ CodeInjection2 (uintptr_t addr, T handler) :
270+ BaseCodeInjectionWithoutRegsAccess (addr, reinterpret_cast <WrapperPtr>(&wrapper)),
271+ m_functor (std::move( handler) )
272272 {}
273273
274274private:
@@ -278,11 +278,20 @@ class CodeInjection2<T, decltype(std::declval<T>()())> : public BaseCodeInjectio
278278 }
279279};
280280
281- template <typename T>
282- class CodeInjection : public CodeInjection2 <T>
283- {
281+ template <typename T>
282+ class CodeInjection : public CodeInjection2 <T> {
284283public:
285- CodeInjection (uintptr_t addr, T handler, bool needs_trampoline = true ) :
286- CodeInjection2<T>(addr, handler, needs_trampoline)
287- {}
284+ CodeInjection (const uintptr_t addr, T handler)
285+ requires std::invocable<T&>
286+ : CodeInjection2<T>(addr, std::move(handler)) {
287+ }
288+
289+ CodeInjection (
290+ const uintptr_t addr,
291+ T handler,
292+ const bool needs_trampoline = true
293+ )
294+ requires std::invocable<T&, BaseCodeInjection::Regs&>
295+ : CodeInjection2<T>(addr, std::move(handler), needs_trampoline) {
296+ }
288297};
0 commit comments