/* 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 { namespace 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() = 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() = 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 BackendX64 } // namespace Dynarmic