LeviLamina
Loading...
Searching...
No Matches
Signature.h
1#pragma once
2
3#include <array>
4#include <memory>
5#include <optional>
6#include <span>
7#include <string>
8#include <string_view>
9#include <vector>
10
11#include "ll/api/base/FixedString.h"
12#include "ll/api/base/Macro.h"
13#include "ll/api/base/StdInt.h"
14#include "ll/api/utils/StringUtils.h"
15
16namespace ll::memory {
17
18class Signature;
19template <size_t N>
20class FixedSignature;
21
23 std::optional<std::byte> element;
24
25public:
26 [[nodiscard]] constexpr SignatureElement() = default;
27
28 [[nodiscard]] constexpr SignatureElement(std::nullptr_t) {}
29
30 [[nodiscard]] constexpr SignatureElement(std::byte byte) : element(byte) {}
31
32 [[nodiscard]] constexpr SignatureElement(uchar byte) : element(static_cast<std::byte>(byte)) {}
33
34 [[nodiscard]] constexpr std::byte operator*() const { return *element; }
35
36 [[nodiscard]] constexpr bool isWildcard() const { return !element.has_value(); }
37
38 [[nodiscard]] constexpr bool operator==(std::byte other) const { return isWildcard() || *element == other; }
39
40 [[nodiscard]] constexpr bool operator==(uchar other) const { return operator==(static_cast<std::byte>(other)); }
41};
42
44 std::span<SignatureElement const> elements;
45
46public:
47 [[nodiscard]] constexpr SignatureView() = default;
48
49 [[nodiscard]] constexpr SignatureView(SignatureView&&) noexcept = default;
50 LL_MAY_CONSTEXPR SignatureView& operator=(SignatureView&&) noexcept = default;
51 [[nodiscard]] constexpr SignatureView(SignatureView const&) noexcept = default;
52 LL_MAY_CONSTEXPR SignatureView& operator=(SignatureView const&) noexcept = default;
53
54 [[nodiscard]] constexpr SignatureView(std::span<SignatureElement const> span) : elements(span) {}
55
56 [[nodiscard]] constexpr SignatureView(Signature const& signature);
57 template <size_t N>
58 [[nodiscard]] constexpr SignatureView(FixedSignature<N> const& signature);
59
60 [[nodiscard]] constexpr auto begin() const { return elements.begin(); }
61 [[nodiscard]] constexpr auto end() const { return elements.end(); }
62 [[nodiscard]] constexpr decltype(auto) front() const { return elements.front(); }
63 [[nodiscard]] constexpr decltype(auto) back() const { return elements.back(); }
64 [[nodiscard]] constexpr decltype(auto) operator[](size_t idx) const { return elements[idx]; }
65
66 [[nodiscard]] constexpr size_t size() const { return elements.size(); }
67
68 LLNDAPI void* resolve(bool disableErrorOutput = false) const;
69 LLNDAPI void* resolve(std::span<std::byte> range, bool disableErrorOutput = false) const;
70
71 LLNDAPI std::string toString(bool alignWildcard = true, bool upperCase = true) const;
72};
73
74class Signature {
75 std::vector<SignatureElement> elements;
76
77 [[nodiscard]] constexpr Signature(std::vector<SignatureElement> vec) : elements(std::move(vec)) {}
78
79public:
80 [[nodiscard]] static constexpr Signature parse(std::string_view str) {
81 std::vector<SignatureElement> elements;
82 string_utils::splitByPattern(
83 [&](std::string_view sv) {
84 if (sv.starts_with('?')) {
85 elements.emplace_back();
86 } else {
87 elements.emplace_back(string_utils::digitFromChar(sv[0]) << 4 | string_utils::digitFromChar(sv[1]));
88 }
89 return true;
90 },
91 str,
92 " "
93 );
94 return {std::move(elements)};
95 }
96
97 [[nodiscard]] constexpr auto begin() const { return elements.begin(); }
98 [[nodiscard]] constexpr auto end() const { return elements.end(); }
99 [[nodiscard]] constexpr decltype(auto) front() const { return elements.front(); }
100 [[nodiscard]] constexpr decltype(auto) back() const { return elements.back(); }
101 [[nodiscard]] constexpr decltype(auto) operator[](size_t idx) const { return elements[idx]; }
102
103 [[nodiscard]] constexpr size_t size() const { return elements.size(); }
104
105 [[nodiscard]] constexpr SignatureView view() const { return {std::span{elements}}; }
106};
107
108[[nodiscard]] constexpr SignatureView::SignatureView(Signature const& signature) : SignatureView(signature.view()) {}
109
110template <size_t N>
112 std::array<SignatureElement, N> elements;
113
114public:
115 [[nodiscard]] constexpr FixedSignature(SignatureView signature) {
116 for (size_t i = 0; i < N; ++i) {
117 elements[i] = signature[i];
118 }
119 }
120
121 [[nodiscard]] auto begin() const { return elements.begin(); }
122 [[nodiscard]] auto end() const { return elements.end(); }
123 [[nodiscard]] constexpr decltype(auto) front() const { return elements.front(); }
124 [[nodiscard]] constexpr decltype(auto) back() const { return elements.back(); }
125 [[nodiscard]] constexpr decltype(auto) operator[](size_t idx) const { return elements[idx]; }
126
127 [[nodiscard]] consteval size_t size() const { return N; }
128
129 [[nodiscard]] constexpr SignatureView view() const { return {std::span{elements}}; }
130};
131
132template <size_t N>
133[[nodiscard]] constexpr SignatureView::SignatureView(FixedSignature<N> const& signature)
134: SignatureView(signature.view()) {}
135
136template <FixedString signature>
137constexpr auto signatureCache = []() {
138 constexpr size_t N = []() {
139 size_t i = 0;
140 string_utils::splitByPattern(
141 [&](std::string_view) {
142 i++;
143 return true;
144 },
145 signature,
146 " "
147 );
148 return i;
149 }();
150 FixedSignature<N> res{Signature::parse(signature)};
151 return res;
152}();
153
154template <FixedString signature>
155inline void* signatureAddressCache = signatureCache<signature>.view().resolve();
156
157} // namespace ll::memory
158
159namespace ll::inline literals::inline memory_literals {
160template <FixedString signature>
161consteval memory::SignatureView operator""_sig() noexcept {
162 return memory::signatureCache<signature>.view();
163}
164template <FixedString signature>
165constexpr void* operator""_sigp() noexcept {
166 return memory::signatureAddressCache<signature>;
167}
168} // namespace ll::inline literals::inline memory_literals
Definition Signature.h:111
Definition Signature.h:22
Definition Signature.h:43
Definition Signature.h:74