zengine-old/engine/3rdparty/zlib/include/refl/detail/view.h

51 lines
1.2 KiB
C
Raw Normal View History

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>
2024-04-08 21:01:50 +08:00
constexpr inline T cast_to() {
2024-04-07 21:15:34 +08:00
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
};
}