23class SignatureElement {
24 std::optional<std::byte> element;
27 [[nodiscard]]
constexpr SignatureElement() =
default;
29 [[nodiscard]]
constexpr SignatureElement(std::nullptr_t) {}
31 [[nodiscard]]
constexpr SignatureElement(std::byte
byte) : element(
byte) {}
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;
54 [[nodiscard]]
constexpr SignatureView() =
default;
56 [[nodiscard]]
constexpr SignatureView(SignatureView&&)
noexcept =
default;
57 LL_MAY_CONSTEXPR SignatureView& operator=(SignatureView&&)
noexcept =
default;
58 [[nodiscard]]
constexpr SignatureView(SignatureView
const&)
noexcept =
default;
59 LL_MAY_CONSTEXPR SignatureView& operator=(SignatureView
const&)
noexcept =
default;
61 [[nodiscard]]
constexpr SignatureView(std::span<SignatureElement const> span) : elements(span) {}
63 [[nodiscard]]
constexpr SignatureView(
Signature const& signature);
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)) {}
91 [[nodiscard]]
explicit constexpr Signature(
SignatureView view) : elements(view.begin(), view.end()) {}
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; }