AsmGrader 0.0.0
Loading...
Searching...
No Matches
asm_function.hpp
Go to the documentation of this file.
1#pragma once
2
7
8#include <cstdint>
9#include <optional>
10#include <string>
11#include <type_traits>
12#include <utility>
13
14namespace asmgrader {
15
16template <typename T>
18{
19 static_assert(always_false_v<T>, "AsmFunction is not specialized for non-function types!");
20};
21
22template <typename Ret, typename... Args>
23class AsmFunction<Ret(Args...)>
24{
25public:
26 AsmFunction(Program& prog, std::string name, std::uintptr_t address);
27 AsmFunction(Program& prog, std::string name, ErrorKind resolution_err);
28
29 template <MemoryIOCompatible<Args>... Ts>
30 requires(sizeof...(Ts) == sizeof...(Args))
31 Result<Ret> operator()(Ts&&... args) {
32 if (resolution_err_.has_value()) {
33 return *resolution_err_;
34 }
35
36 (check_arg<Ts>(), ...);
37
38 return prog_->call_function<Ret(Args...)>(address_, std::forward<Ts>(args)...);
39 }
40
41private:
42 template <typename T>
43 void check_arg() {
44 using NormT = std::remove_cvref_t<T>;
45 static_assert(!std::is_pointer_v<NormT> && !std::is_array_v<NormT>,
46 "Passing a raw pointer as argument for an asm function, which is probably not what you meant to "
47 "do. See docs on program memory for more info.");
48 }
49
50 Program* prog_;
51
52 std::uintptr_t address_;
53 std::string name_;
54 std::optional<ErrorKind> resolution_err_;
55};
56
57template <typename Ret, typename... Args>
58AsmFunction<Ret(Args...)>::AsmFunction(Program& prog, std::string name, std::uintptr_t address)
59 : prog_{&prog}
60 , address_{address}
61 , name_{std::move(name)} {}
62
63template <typename Ret, typename... Args>
64AsmFunction<Ret(Args...)>::AsmFunction(Program& prog, std::string name, ErrorKind resolution_err)
65 : prog_{&prog}
66 , address_{0x0}
67 , name_{std::move(name)}
68 , resolution_err_{resolution_err} {}
69
70} // namespace asmgrader
Definition asm_function.hpp:18
std::variant wrapper for a partial implementation of C++23's expected type
Definition expected.hpp:34
Definition program.hpp:31
Definition asm_buffer.hpp:19
constexpr bool always_false_v
Definition always_false.hpp:16