AsmGrader 0.0.0
Loading...
Searching...
No Matches
asm_symbol.hpp
Go to the documentation of this file.
1#pragma once
2
8
9#include <fmt/base.h>
10
11#include <cstdint>
12#include <optional>
13#include <string>
14#include <string_view>
15#include <utility>
16
17namespace asmgrader {
18
19template <typename T>
21{
22public:
23 AsmSymbol(Program& prog, std::string name, std::uintptr_t address);
24 AsmSymbol(Program& prog, std::string name, ErrorKind resolution_err);
25
26 std::string_view get_name() const;
27
28 Result<T> get_value() const override;
29
30private:
31 std::string name_;
32 std::optional<ErrorKind> resolution_err_;
33};
34
35template <typename T>
36std::string_view AsmSymbol<T>::get_name() const {
37 return name_;
38}
39
40template <typename T>
42 if (resolution_err_.has_value()) {
43 return *resolution_err_;
44 }
45
46 auto value = AsmData<T>::get_value_impl();
47
48 std::string val_str = "<unformattable>";
49 if constexpr (fmt::formattable<T>) {
50 val_str = fmt::format("{}", value);
51 }
52 LOG_DEBUG("Read value {} for symbol {:?} @ 0x{:X}", val_str, name_, AsmData<T>::get_address());
53
54 return value;
55}
56
57template <typename T>
58AsmSymbol<T>::AsmSymbol(Program& prog, std::string name, std::uintptr_t address)
59 : AsmData<T>(prog, address)
60 , name_{std::move(name)} {}
61
62template <typename T>
63AsmSymbol<T>::AsmSymbol(Program& prog, std::string name, ErrorKind resolution_err)
64 : AsmData<T>(prog, 0)
65 , name_{std::move(name)}
66 , resolution_err_{resolution_err} {}
67
68} // namespace asmgrader
Definition asm_data.hpp:20
Result< T > get_value_impl() const
Definition asm_data.hpp:86
Definition asm_symbol.hpp:21
AsmSymbol(Program &prog, std::string name, std::uintptr_t address)
Definition asm_symbol.hpp:58
Result< T > get_value() const override
Get the value currently present in the asm program.
Definition asm_symbol.hpp:41
std::string_view get_name() const
Definition asm_symbol.hpp:36
std::variant wrapper for a partial implementation of C++23's expected type
Definition expected.hpp:34
Definition program.hpp:31
#define LOG_DEBUG(...)
Definition logging.hpp:44
Definition asm_buffer.hpp:19