LeviLamina
Loading...
Searching...
No Matches
Symbol.h
1#pragma once
2
3#include <string>
4#include <string_view>
5#include <vector>
6
7#include "ll/api/base/Macro.h"
8#include "ll/api/base/StdInt.h"
9
10namespace ll::memory {
11class Symbol;
12template <size_t N>
13class FixedSymbol;
14
15class SymbolView {
16 std::string_view sym;
17
18public:
19 [[nodiscard]] constexpr SymbolView() = default;
20
21 [[nodiscard]] constexpr SymbolView(SymbolView&&) noexcept = default;
22 LL_MAY_CONSTEXPR SymbolView& operator=(SymbolView&&) noexcept = default;
23 [[nodiscard]] constexpr SymbolView(SymbolView const&) noexcept = default;
24 LL_MAY_CONSTEXPR SymbolView& operator=(SymbolView const&) noexcept = default;
25
26 [[nodiscard]] constexpr explicit SymbolView(std::string_view symbol) : sym(symbol) {}
27
28 [[nodiscard]] constexpr SymbolView(Symbol const& symbol);
29 template <size_t N>
30 [[nodiscard]] constexpr SymbolView(FixedSymbol<N> const& symbol);
31
32 [[nodiscard]] constexpr size_t size() const { return sym.size(); }
33
34 LLNDAPI void* resolve(bool disableErrorOutput = false) const;
35
36 [[nodiscard]] constexpr std::string_view raw() const { return sym; }
37
38 LLNDAPI std::string toString() const;
39};
40
41class Symbol {
42 std::string sym;
43
44public:
45 [[nodiscard]] explicit constexpr Symbol(std::string symbol) : sym(std::move(symbol)) {}
46
47 [[nodiscard]] constexpr size_t size() const { return sym.size(); }
48
49 [[nodiscard]] constexpr SymbolView view() const { return SymbolView{sym}; }
50};
51
52[[nodiscard]] constexpr SymbolView::SymbolView(Symbol const& symbol) : SymbolView(symbol.view()) {}
53
54template <size_t N>
55class FixedSymbol {
56public:
57 char sym[N + 1]{};
58
59 [[nodiscard]] consteval FixedSymbol(std::string_view symbol) { std::copy_n(symbol.data(), symbol.size(), sym); }
60 [[nodiscard]] consteval FixedSymbol(char const* symbol) { std::copy_n(symbol, N, sym); }
61
62 [[nodiscard]] consteval size_t size() const { return N; }
63
64 [[nodiscard]] constexpr SymbolView view() const { return SymbolView{std::string_view{sym}}; }
65};
66template <size_t N>
67FixedSymbol(char const (&)[N]) -> FixedSymbol<N - 1>;
68
69template <size_t N>
70[[nodiscard]] constexpr SymbolView::SymbolView(FixedSymbol<N> const& symbol) : SymbolView(symbol.view()) {}
71
72template <FixedSymbol symbol>
73inline void* symbolAddressCache = symbol.view().resolve();
74
75} // namespace ll::memory
76
77namespace ll::inline literals::inline memory_literals {
78template <memory::FixedSymbol symbol>
79consteval memory::SymbolView operator""_sym() noexcept {
80 return symbol.view();
81}
82template <memory::FixedSymbol symbol>
83constexpr void* operator""_symp() noexcept {
84 return memory::symbolAddressCache<symbol>;
85}
86} // namespace ll::inline literals::inline memory_literals
Definition Symbol.h:55
Definition Symbol.h:15
Definition Symbol.h:41