AsmGrader 0.0.0
Loading...
Searching...
No Matches
asm_symbol.hpp
Go to the documentation of this file.
1#pragma once
2
9
10#include <fmt/base.h>
11#include <fmt/format.h>
12
13#include <cstdint>
14#include <optional>
15#include <span>
16#include <string>
17#include <string_view>
18#include <utility>
19
20namespace asmgrader {
21
26template <typename T>
27class AsmSymbolResult : public Result<T>
28{
29public:
30 // NOLINTNEXTLINE(readability-identifier-naming) - rational: don't shadow member variables
31 explicit constexpr AsmSymbolResult(std::string_view symbol_name_)
32 : symbol_name{symbol_name_} {}
33
34 template <typename U>
35 void set_result(U&& val) {
36 Result<T>::operator=(std::forward<U>(val));
37 }
38
39 // not sure if these are really needed, but I'm including them to be safe
40 using Result<T>::operator==;
41 using Result<T>::operator<=>;
42
43 std::string_view symbol_name;
44
45 std::string repr(std::span<const inspection::Token> /*tokens*/, std::string_view /*raw_str*/) const {
46 return fmt::format("*{}", symbol_name);
47 }
48
49 // using the default `str` implementation for the base Expected type
50};
51
52template <typename T>
54{
55public:
56 AsmSymbol(Program& prog, std::string name, std::uintptr_t address);
57 AsmSymbol(Program& prog, std::string name, ErrorKind resolution_err);
58
59 std::string_view get_name() const;
60
62
63private:
64 std::string name_;
65 std::optional<ErrorKind> resolution_err_;
66};
67
68template <typename T>
69std::string_view AsmSymbol<T>::get_name() const {
70 return name_;
71}
72
73template <typename T>
75 AsmSymbolResult<T> res{name_};
76
77 if (resolution_err_.has_value()) {
78 res.set_result(*resolution_err_);
79 return res;
80 }
81
82 auto value = AsmData<T>::get_value_impl();
83
84 std::string val_str = "<unformattable>";
85 if constexpr (fmt::formattable<T>) {
86 val_str = fmt::format("{}", value);
87 }
88 LOG_DEBUG("Read value {} for symbol {:?} @ 0x{:X}", val_str, name_, AsmData<T>::get_address());
89
90 res.set_result(value);
91
92 return res;
93}
94
95template <typename T>
96AsmSymbol<T>::AsmSymbol(Program& prog, std::string name, std::uintptr_t address)
97 : AsmData<T>(prog, address)
98 , name_{std::move(name)} {}
99
100template <typename T>
101AsmSymbol<T>::AsmSymbol(Program& prog, std::string name, ErrorKind resolution_err)
102 : AsmData<T>(prog, 0)
103 , name_{std::move(name)}
104 , resolution_err_{resolution_err} {}
105
106} // namespace asmgrader
Definition asm_data.hpp:20
Result< T > get_value_impl() const
Definition asm_data.hpp:89
Transparent wrapper around Result<T>, as far as the user is concerned.
Definition asm_symbol.hpp:28
std::string_view symbol_name
Definition asm_symbol.hpp:43
constexpr AsmSymbolResult(std::string_view symbol_name_)
Definition asm_symbol.hpp:31
void set_result(U &&val)
Definition asm_symbol.hpp:35
std::string repr(std::span< const inspection::Token >, std::string_view) const
Definition asm_symbol.hpp:45
Definition asm_symbol.hpp:54
AsmSymbol(Program &prog, std::string name, std::uintptr_t address)
Definition asm_symbol.hpp:96
AsmSymbolResult< T > get_value() const
Definition asm_symbol.hpp:74
std::string_view get_name() const
Definition asm_symbol.hpp:69
std::variant wrapper for a partial implementation of C++23's expected type
Definition expected.hpp:34
constexpr auto operator<=>(const Expected &rhs) const =default
Definition program.hpp:32
#define LOG_DEBUG(...)
Definition logging.hpp:41
Definition asm_buffer.hpp:20
ErrorKind
Definition error_types.hpp:11
Definition byte_array.hpp:94