shjit
This commit is contained in:
@@ -0,0 +1,44 @@
|
||||
|
||||
#include "pointer.hpp"
|
||||
#include <iostream>
|
||||
|
||||
CPointer CPointer::GetFieldPtr(int offset) const {
|
||||
if (IsValid()) {
|
||||
return m_Value + offset;
|
||||
}
|
||||
|
||||
LogInvalid();
|
||||
|
||||
static CPointer null{};
|
||||
return &null;
|
||||
}
|
||||
|
||||
CPointer& CPointer::Offset(int offset) {
|
||||
if (IsValid()) {
|
||||
m_Value += offset;
|
||||
}
|
||||
|
||||
return *this;
|
||||
}
|
||||
|
||||
CPointer& CPointer::Absolute(int preAbs, int postAbs) {
|
||||
if (IsValid()) {
|
||||
Offset(preAbs);
|
||||
m_Value = m_Value + sizeof(int) + *reinterpret_cast<int*>(m_Value);
|
||||
Offset(postAbs);
|
||||
}
|
||||
|
||||
return *this;
|
||||
}
|
||||
|
||||
CPointer& CPointer::Dereference(int count) {
|
||||
if (IsValid()) {
|
||||
while (count-- != 0) {
|
||||
m_Value = *reinterpret_cast<uintptr_t*>(m_Value);
|
||||
}
|
||||
}
|
||||
|
||||
return *this;
|
||||
}
|
||||
|
||||
void CPointer::LogInvalid() const { std::cout << "invalid offset\n"; }
|
||||
@@ -0,0 +1,49 @@
|
||||
#pragma once
|
||||
#include <cstdint>
|
||||
#include <type_traits>
|
||||
class CPointer {
|
||||
public:
|
||||
CPointer() { m_Value = 0; }
|
||||
|
||||
template <typename T>
|
||||
CPointer(T value) {
|
||||
m_Value = (uintptr_t)(value);
|
||||
}
|
||||
|
||||
bool IsValid() const { return m_Value != 0; }
|
||||
|
||||
template <typename T>
|
||||
auto Get() const {
|
||||
return reinterpret_cast<T>(m_Value);
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
std::add_lvalue_reference_t<T> GetField(int offset) const {
|
||||
return *GetFieldPtr(offset).Get<T*>();
|
||||
}
|
||||
|
||||
template <typename T, typename... Args>
|
||||
auto Call(Args... args) const {
|
||||
if constexpr (std::is_invocable_v<T, Args...>) {
|
||||
if (IsValid()) {
|
||||
return std::invoke(Get<T>(), std::forward<Args>(args)...);
|
||||
}
|
||||
} else {
|
||||
static_assert(std::is_invocable_v<T, Args...>, "T must be an invocable type.");
|
||||
}
|
||||
|
||||
LogInvalid();
|
||||
return std::invoke_result_t<T, Args...>{};
|
||||
}
|
||||
|
||||
CPointer GetFieldPtr(int offset) const;
|
||||
|
||||
CPointer& Offset(int offset);
|
||||
CPointer& Absolute(int preAbs, int postAbs);
|
||||
CPointer& Dereference(int count);
|
||||
|
||||
private:
|
||||
void LogInvalid() const;
|
||||
|
||||
uintptr_t m_Value;
|
||||
};
|
||||
Reference in New Issue
Block a user