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/HashUtils.h"
15#include "ll/api/utils/StringUtils.h"
24 std::optional<std::byte> element;
33 [[nodiscard]]
constexpr SignatureElement(uchar
byte) : element(
static_cast<std::byte
>(
byte)) {}
35 [[nodiscard]]
constexpr std::byte operator*()
const {
return *element; }
37 [[nodiscard]]
constexpr bool isWildcard()
const {
return !element.has_value(); }
39 [[nodiscard]]
constexpr bool operator==(
SignatureElement const& other)
const {
return element == other.element; }
41 [[nodiscard]]
constexpr bool operator==(std::byte other)
const {
return isWildcard() || *element == other; }
43 [[nodiscard]]
constexpr bool operator==(uchar other)
const {
return operator==(
static_cast<std::byte
>(other)); }
45 [[nodiscard]]
size_t hash()
const {
return std::hash<std::optional<std::byte>>{}(element); }
49 std::span<SignatureElement const> elements;
51 void* uncachedResolve(std::span<std::byte> range)
const;
61 [[nodiscard]]
constexpr SignatureView(std::span<SignatureElement const> span) : elements(span) {}
67 [[nodiscard]]
constexpr auto begin()
const {
return elements.begin(); }
68 [[nodiscard]]
constexpr auto end()
const {
return elements.end(); }
69 [[nodiscard]]
constexpr decltype(
auto) front()
const {
return elements.front(); }
70 [[nodiscard]]
constexpr decltype(
auto) back()
const {
return elements.back(); }
71 [[nodiscard]]
constexpr decltype(
auto)
operator[](
size_t idx)
const {
return elements[idx]; }
73 [[nodiscard]]
constexpr size_t size()
const {
return elements.size(); }
75 LLNDAPI
void* resolve(
bool disableErrorOutput =
false)
const;
76 LLNDAPI
void* resolve(std::span<std::byte> range,
bool disableErrorOutput =
false)
const;
78 LLNDAPI std::string toString(
bool alignWildcard =
true,
bool upperCase =
true)
const;
80 [[nodiscard]]
constexpr bool operator==(
SignatureView const& other)
const {
81 return std::equal(begin(), end(), other.begin(), other.end());
86 std::vector<SignatureElement> elements;
88 [[nodiscard]]
constexpr Signature(std::vector<SignatureElement> vec) : elements(std::move(vec)) {}
93 [[nodiscard]]
static constexpr Signature parse(std::string_view str) {
94 std::vector<SignatureElement> elements;
95 string_utils::splitByPattern(
96 [&](std::string_view sv) {
97 if (sv.starts_with(
'?')) {
98 elements.emplace_back();
100 elements.emplace_back(string_utils::digitFromChar(sv[0]) << 4 | string_utils::digitFromChar(sv[1]));
107 return {std::move(elements)};
110 [[nodiscard]]
constexpr auto begin()
const {
return elements.begin(); }
111 [[nodiscard]]
constexpr auto end()
const {
return elements.end(); }
112 [[nodiscard]]
constexpr decltype(
auto) front()
const {
return elements.front(); }
113 [[nodiscard]]
constexpr decltype(
auto) back()
const {
return elements.back(); }
114 [[nodiscard]]
constexpr decltype(
auto)
operator[](
size_t idx)
const {
return elements[idx]; }
116 [[nodiscard]]
constexpr size_t size()
const {
return elements.size(); }
118 [[nodiscard]]
constexpr SignatureView view()
const {
return {std::span{elements}}; }
120 [[nodiscard]]
constexpr bool operator==(
Signature const& other)
const {
return elements == other.elements; }
123[[nodiscard]]
constexpr SignatureView::SignatureView(
Signature const& signature) :
SignatureView(signature.view()) {}
127 std::array<SignatureElement, N> elements;
131 for (
size_t i = 0; i < N; ++i) {
132 elements[i] = signature[i];
136 [[nodiscard]]
auto begin()
const {
return elements.begin(); }
137 [[nodiscard]]
auto end()
const {
return elements.end(); }
138 [[nodiscard]]
constexpr decltype(
auto) front()
const {
return elements.front(); }
139 [[nodiscard]]
constexpr decltype(
auto) back()
const {
return elements.back(); }
140 [[nodiscard]]
constexpr decltype(
auto)
operator[](
size_t idx)
const {
return elements[idx]; }
142 [[nodiscard]]
consteval size_t size()
const {
return N; }
144 [[nodiscard]]
constexpr SignatureView view()
const {
return {std::span{elements}}; }
148[[nodiscard]]
constexpr SignatureView::SignatureView(
FixedSignature<N> const& signature)
151template <FixedString signature>
152constexpr inline auto signatureCache = []() {
153 constexpr size_t N = []() {
155 string_utils::splitByPattern(
156 [&](std::string_view) {
165 FixedSignature<N> res{Signature::parse(signature)};
170namespace ll::inline literals::inline memory_literals {
171template <FixedString signature>
172consteval memory::SignatureView
operator""_sig() noexcept {
173 return memory::signatureCache<signature>.view();
175template <FixedString signature>
176constexpr void*
operator""_sigp() noexcept {
177 return memory::signatureCache<signature>.view().resolve();
183struct hash<ll::memory::SignatureElement> {
187struct hash<ll::memory::Signature> {
189 return ll::hash_utils::HashCombiner{s.size()}.addRange(s);
193struct hash<ll::memory::SignatureView> {
195 return ll::hash_utils::HashCombiner{s.size()}.addRange(s);
Definition Signature.h:126
Definition Signature.h:23
Definition Signature.h:48
Definition Signature.h:85