2024-04-07 21:15:34 +08:00
|
|
|
#pragma once
|
2024-04-06 23:50:17 +08:00
|
|
|
#include <string>
|
2024-04-07 21:15:34 +08:00
|
|
|
#include "type.h"
|
2024-04-06 23:50:17 +08:00
|
|
|
namespace refl {
|
|
|
|
|
class UClass;
|
|
|
|
|
class FieldPtr;
|
|
|
|
|
class ObjectView {
|
|
|
|
|
public:
|
|
|
|
|
const char* ptr;
|
|
|
|
|
const UClass* cls;
|
|
|
|
|
const FieldPtr* cache{nullptr};
|
|
|
|
|
ObjectView(const void* ptr, const UClass* cls) : ptr((const char*)ptr), cls(cls){}
|
|
|
|
|
public:
|
|
|
|
|
|
|
|
|
|
template<typename T>
|
|
|
|
|
bool Get(const Name& name, T& t);
|
|
|
|
|
|
|
|
|
|
template<typename T>
|
|
|
|
|
bool Set(const Name& name, const T& t);
|
|
|
|
|
|
|
|
|
|
template<typename ...Args>
|
|
|
|
|
bool Invoke(const Name& name, Args&&... args);
|
|
|
|
|
|
2024-04-07 21:15:34 +08:00
|
|
|
template<_ReflCheck_Ctor R, typename ...Args>
|
|
|
|
|
R Invoke(const Name& name, Args&&... args);
|
|
|
|
|
|
|
|
|
|
ObjectView Parent();
|
2024-04-06 23:50:17 +08:00
|
|
|
};
|
|
|
|
|
class ArgsView {
|
|
|
|
|
public:
|
|
|
|
|
const void* val;
|
|
|
|
|
const UClass* cls;
|
|
|
|
|
ArgsView(const void* val = nullptr, const UClass* cls = nullptr) : val(val), cls(cls) {}
|
2024-04-07 21:15:34 +08:00
|
|
|
template<typename T>
|
|
|
|
|
ArgsView(T&& v): val(&v), cls(&TypeInfo<typename std::remove_reference_t<T>*>::StaticClass){}
|
|
|
|
|
|
|
|
|
|
template<typename T>
|
|
|
|
|
inline T cast_to() {
|
|
|
|
|
if constexpr (std::is_pointer_v<T>) {
|
|
|
|
|
return (T)val;
|
|
|
|
|
}
|
|
|
|
|
else if constexpr (std::is_reference_v<T>){
|
|
|
|
|
using RT = std::remove_reference_t<T>;
|
|
|
|
|
return *(RT*)val;
|
|
|
|
|
}else{
|
|
|
|
|
return *(T*)val;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
bool ConvertTo(const UClass* toClass);
|
2024-04-06 23:50:17 +08:00
|
|
|
};
|
|
|
|
|
}
|