/* This file is part of the dynarmic project. * Copyright (c) 2018 MerryMage * This software may be used and distributed according to the terms of the GNU * General Public License version 2 or any later version. */ #pragma once #include #include #include "common/common_types.h" namespace Dynarmic::BackendX64 { class BlockOfCode; class Callback { public: virtual ~Callback() = default; virtual void EmitCall(BlockOfCode* code, std::function fn = []{}) = 0; virtual void EmitCall(BlockOfCode* code, std::function fn) = 0; virtual void EmitCall(BlockOfCode* code, std::function fn) = 0; virtual void EmitCall(BlockOfCode* code, std::function fn) = 0; }; class SimpleCallback final : public Callback { public: template SimpleCallback(Function fn) : fn(reinterpret_cast(fn)) {} ~SimpleCallback() override = default; void EmitCall(BlockOfCode* code, std::function l = []{}) override; void EmitCall(BlockOfCode* code, std::function l) override; void EmitCall(BlockOfCode* code, std::function l) override; void EmitCall(BlockOfCode* code, std::function l) override; private: void (*fn)(); }; class ArgCallback final : public Callback { public: template ArgCallback(Function fn, u64 arg) : fn(reinterpret_cast(fn)), arg(arg) {} ~ArgCallback() override = default; void EmitCall(BlockOfCode* code, std::function l = []{}) override; void EmitCall(BlockOfCode* code, std::function l) override; void EmitCall(BlockOfCode* code, std::function l) override; void EmitCall(BlockOfCode* code, std::function l) override; private: void (*fn)(); u64 arg; }; } // namespace Dynarmic::BackendX64