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
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 LLNDAPI static std::vector<Symbol> fromAddress(void*);
48
49 [[nodiscard]] constexpr size_t size() const { return sym.size(); }
50
51 [[nodiscard]] constexpr SymbolView view() const { return SymbolView{sym}; }
52};
53
54[[nodiscard]] constexpr SymbolView::SymbolView(Symbol const& symbol) : SymbolView(symbol.view()) {}
55
56template <size_t N>
58public:
59 char sym[N + 1]{};
60
61 [[nodiscard]] consteval FixedSymbol(std::string_view symbol) { std::copy_n(symbol.data(), symbol.size(), sym); }
62 [[nodiscard]] consteval FixedSymbol(char const* symbol) { std::copy_n(symbol, N, sym); }
63
64 [[nodiscard]] consteval size_t size() const { return N; }
65
66 [[nodiscard]] constexpr SymbolView view() const { return SymbolView{std::string_view{sym}}; }
67};
68template <size_t N>
69FixedSymbol(char const (&)[N]) -> FixedSymbol<N - 1>;
70
71template <size_t N>
72[[nodiscard]] constexpr SymbolView::SymbolView(FixedSymbol<N> const& symbol) : SymbolView(symbol.view()) {}
73
74template <FixedSymbol symbol>
75inline void* symbolAddressCache = symbol.view().resolve();
76
77} // namespace ll::memory
78
79namespace ll::inline literals::inline memory_literals {
80template <memory::FixedSymbol symbol>
81consteval memory::SymbolView operator""_sym() noexcept {
82 return symbol.view();
83}
84template <memory::FixedSymbol symbol>
85constexpr void* operator""_symp() noexcept {
86 return memory::symbolAddressCache<symbol>;
87}
88} // namespace ll::inline literals::inline memory_literals
Definition Symbol.h:57
Definition Symbol.h:15
Definition Symbol.h:41