51 lines
		
	
	
		
			1.2 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			51 lines
		
	
	
		
			1.2 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
#pragma once
 | 
						|
#include <string>
 | 
						|
#include "type.h"
 | 
						|
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);
 | 
						|
 | 
						|
		template<_ReflCheck_Ctor R, typename ...Args>
 | 
						|
		R Invoke(const Name& name, Args&&... args);
 | 
						|
 | 
						|
		ObjectView Parent();
 | 
						|
	};
 | 
						|
	class ArgsView {
 | 
						|
	public:
 | 
						|
		const void* val;
 | 
						|
		const UClass* cls;
 | 
						|
		ArgsView(const void* val = nullptr, const UClass* cls = nullptr) : val(val), cls(cls) {}
 | 
						|
		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);
 | 
						|
	};
 | 
						|
} |