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"
23 std::optional<std::byte> element;
32 [[nodiscard]]
constexpr SignatureElement(uchar
byte) : element(
static_cast<std::byte
>(
byte)) {}
34 [[nodiscard]]
constexpr std::byte operator*()
const {
return *element; }
36 [[nodiscard]]
constexpr bool isWildcard()
const {
return !element.has_value(); }
38 [[nodiscard]]
constexpr bool operator==(std::byte other)
const {
return isWildcard() || *element == other; }
40 [[nodiscard]]
constexpr bool operator==(uchar other)
const {
return operator==(
static_cast<std::byte
>(other)); }
44 std::span<SignatureElement const> elements;
54 [[nodiscard]]
constexpr SignatureView(std::span<SignatureElement const> span) : elements(span) {}
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]; }
66 [[nodiscard]]
constexpr size_t size()
const {
return elements.size(); }
68 LLNDAPI
void* resolve(
bool disableErrorOutput =
false)
const;
69 LLNDAPI
void* resolve(std::span<std::byte> range,
bool disableErrorOutput =
false)
const;
71 LLNDAPI std::string toString(
bool alignWildcard =
true,
bool upperCase =
true)
const;
75 std::vector<SignatureElement> elements;
77 [[nodiscard]]
constexpr Signature(std::vector<SignatureElement> vec) : elements(std::move(vec)) {}
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();
87 elements.emplace_back(string_utils::digitFromChar(sv[0]) << 4 | string_utils::digitFromChar(sv[1]));
94 return {std::move(elements)};
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]; }
103 [[nodiscard]]
constexpr size_t size()
const {
return elements.size(); }
105 [[nodiscard]]
constexpr SignatureView view()
const {
return {std::span{elements}}; }
108[[nodiscard]]
constexpr SignatureView::SignatureView(
Signature const& signature) :
SignatureView(signature.view()) {}
112 std::array<SignatureElement, N> elements;
116 for (
size_t i = 0; i < N; ++i) {
117 elements[i] = signature[i];
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]; }
127 [[nodiscard]]
consteval size_t size()
const {
return N; }
129 [[nodiscard]]
constexpr SignatureView view()
const {
return {std::span{elements}}; }
133[[nodiscard]]
constexpr SignatureView::SignatureView(
FixedSignature<N> const& signature)
136template <FixedString signature>
137constexpr auto signatureCache = []() {
138 constexpr size_t N = []() {
140 string_utils::splitByPattern(
141 [&](std::string_view) {
150 FixedSignature<N> res{Signature::parse(signature)};
154template <FixedString signature>
155inline void* signatureAddressCache = signatureCache<signature>.view().resolve();
159namespace ll::inline literals::inline memory_literals {
160template <FixedString signature>
161consteval memory::SignatureView
operator""_sig() noexcept {
162 return memory::signatureCache<signature>.view();
164template <FixedString signature>
165constexpr void*
operator""_sigp() noexcept {
166 return memory::signatureAddressCache<signature>;
Definition Signature.h:111
Definition Signature.h:22
Definition Signature.h:43
Definition Signature.h:74