2024-04-16 16:17:13 +08:00
										 
									 
								 
							 | 
							
								
									
										
									
								
							 | 
							
								
							 | 
							
							
								#pragma once
							 | 
						
					
						
							
								
									
										
										
										
											2024-04-08 21:01:50 +08:00
										 
									 
								 
							 | 
							
								
							 | 
							
								
							 | 
							
							
								#include "detail/uclass.inl"
							 | 
						
					
						
							
								
									
										
										
										
											2024-06-24 00:26:52 +08:00
										 
									 
								 
							 | 
							
								
									
										
									
								
							 | 
							
								
							 | 
							
							
								#include "detail/container.inl"
							 | 
						
					
						
							
								
									
										
										
										
											2024-04-08 21:01:50 +08:00
										 
									 
								 
							 | 
							
								
							 | 
							
								
							 | 
							
							
								#include "detail/view.inl"
							 | 
						
					
						
							
								
									
										
										
										
											2024-04-11 10:13:15 +08:00
										 
									 
								 
							 | 
							
								
									
										
									
								
							 | 
							
								
							 | 
							
							
								#include "detail/field.inl"
							 | 
						
					
						
							
								
									
										
										
										
											2024-04-25 21:45:41 +08:00
										 
									 
								 
							 | 
							
								
									
										
									
								
							 | 
							
								
							 | 
							
							
								#include "detail/convert.inl"
							 | 
						
					
						
							
								
									
										
										
										
											2024-04-19 22:02:27 +08:00
										 
									 
								 
							 | 
							
								
									
										
									
								
							 | 
							
								
							 | 
							
							
								#include "detail/meta.inl"
							 | 
						
					
						
							
								
									
										
										
										
											2024-04-16 16:17:13 +08:00
										 
									 
								 
							 | 
							
								
									
										
									
								
							 | 
							
								
							 | 
							
							
								#include "macro.h"
							 | 
						
					
						
							
								
									
										
										
										
											2024-04-09 16:31:09 +08:00
										 
									 
								 
							 | 
							
								
									
										
									
								
							 | 
							
								
							 | 
							
							
								namespace refl {
							 | 
						
					
						
							
								
									
										
										
										
											2024-06-12 22:07:45 +08:00
										 
									 
								 
							 | 
							
								
									
										
									
								
							 | 
							
								
							 | 
							
							
									template<typename T, typename... Args>
							 | 
						
					
						
							
								
									
										
										
										
											2024-06-25 20:26:46 +08:00
										 
									 
								 
							 | 
							
								
									
										
									
								
							 | 
							
								
							 | 
							
							
									consteval FieldPtr StaticCtorField(T(*ptr)(Args...), const MethodData& data = {}) {
							 | 
						
					
						
							
								
									
										
										
										
											2024-06-12 22:07:45 +08:00
										 
									 
								 
							 | 
							
								
									
										
									
								
							 | 
							
								
							 | 
							
							
										uint32_t flag = FIELD_CTOR_FLAG;
							 | 
						
					
						
							
								
									
										
										
										
											2024-06-25 20:26:46 +08:00
										 
									 
								 
							 | 
							
								
									
										
									
								
							 | 
							
								
							 | 
							
							
										Offset offset = AnyArgs::GetArgsSize<void,void*, Args...>(data.value);
							 | 
						
					
						
							
								
									
										
										
										
											2024-06-12 22:07:45 +08:00
										 
									 
								 
							 | 
							
								
									
										
									
								
							 | 
							
								
							 | 
							
							
										if (data.meta.IsValid()) {
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
											offset += data.meta.Size();
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
										}
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
										FieldPtr::Data method(offset);
							 | 
						
					
						
							
								
									
										
										
										
											2024-06-25 20:26:46 +08:00
										 
									 
								 
							 | 
							
								
									
										
									
								
							 | 
							
								
							 | 
							
							
										return {FName("Ctor"), nullptr, method, flag};
							 | 
						
					
						
							
								
									
										
										
										
											2024-06-12 22:07:45 +08:00
										 
									 
								 
							 | 
							
								
									
										
									
								
							 | 
							
								
							 | 
							
							
									}
							 | 
						
					
						
							
								
									
										
										
										
											2024-04-09 16:31:09 +08:00
										 
									 
								 
							 | 
							
								
									
										
									
								
							 | 
							
								
							 | 
							
							
									template<typename T, typename Obj>
							 | 
						
					
						
							
								
									
										
										
										
											2024-04-25 21:45:41 +08:00
										 
									 
								 
							 | 
							
								
									
										
									
								
							 | 
							
								
							 | 
							
							
									consteval FieldPtr StaticMemberField(T Obj::* ptr, const Name& name, const MemberData& data = {}) {
							 | 
						
					
						
							
								
									
										
										
										
											2024-04-19 22:02:27 +08:00
										 
									 
								 
							 | 
							
								
									
										
									
								
							 | 
							
								
							 | 
							
							
										Offset offset = data.value.IsValid() ? sizeof(T) : 0;
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
										if (data.meta.IsValid()) {
							 | 
						
					
						
							
								
									
										
										
										
											2024-04-25 21:45:41 +08:00
										 
									 
								 
							 | 
							
								
									
										
									
								
							 | 
							
								
							 | 
							
							
											offset += data.meta.Size();
							 | 
						
					
						
							
								
									
										
										
										
											2024-04-19 22:02:27 +08:00
										 
									 
								 
							 | 
							
								
									
										
									
								
							 | 
							
								
							 | 
							
							
										}
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
										FieldPtr::Data member(offset);
							 | 
						
					
						
							
								
									
										
										
										
											2024-04-25 21:45:41 +08:00
										 
									 
								 
							 | 
							
								
									
										
									
								
							 | 
							
								
							 | 
							
							
										uint32_t flag = FIELD_MEMBER_FLAG | FIELD_ATTRIBUTE_FLAG;
							 | 
						
					
						
							
								
									
										
										
										
											2024-06-25 20:26:46 +08:00
										 
									 
								 
							 | 
							
								
									
										
									
								
							 | 
							
								
							 | 
							
							
										return { name, nullptr , member , flag};
							 | 
						
					
						
							
								
									
										
										
										
											2024-04-09 16:31:09 +08:00
										 
									 
								 
							 | 
							
								
									
										
									
								
							 | 
							
								
							 | 
							
							
									}
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
									template<typename R, typename ...Args>
							 | 
						
					
						
							
								
									
										
										
										
											2024-04-25 21:45:41 +08:00
										 
									 
								 
							 | 
							
								
									
										
									
								
							 | 
							
								
							 | 
							
							
									consteval FieldPtr StaticMethodField(R(*ptr)(Args...), const Name& name, const MethodData& data = {}) {
							 | 
						
					
						
							
								
									
										
										
										
											2024-04-09 16:31:09 +08:00
										 
									 
								 
							 | 
							
								
									
										
									
								
							 | 
							
								
							 | 
							
							
										uint32_t flag = FIELD_METHOD_FLAG;
							 | 
						
					
						
							
								
									
										
										
										
											2024-06-25 20:26:46 +08:00
										 
									 
								 
							 | 
							
								
									
										
									
								
							 | 
							
								
							 | 
							
							
										Offset offset = AnyArgs::GetArgsSize<R, Args...>(data.value);
							 | 
						
					
						
							
								
									
										
										
										
											2024-04-19 22:02:27 +08:00
										 
									 
								 
							 | 
							
								
									
										
									
								
							 | 
							
								
							 | 
							
							
										if (data.meta.IsValid()) {
							 | 
						
					
						
							
								
									
										
										
										
											2024-04-25 21:45:41 +08:00
										 
									 
								 
							 | 
							
								
									
										
									
								
							 | 
							
								
							 | 
							
							
											offset += data.meta.Size();
							 | 
						
					
						
							
								
									
										
										
										
											2024-04-19 22:02:27 +08:00
										 
									 
								 
							 | 
							
								
									
										
									
								
							 | 
							
								
							 | 
							
							
										}
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
										FieldPtr::Data method(offset);
							 | 
						
					
						
							
								
									
										
										
										
											2024-06-25 20:26:46 +08:00
										 
									 
								 
							 | 
							
								
									
										
									
								
							 | 
							
								
							 | 
							
							
										return { name,nullptr,method, flag };
							 | 
						
					
						
							
								
									
										
										
										
											2024-04-09 16:31:09 +08:00
										 
									 
								 
							 | 
							
								
									
										
									
								
							 | 
							
								
							 | 
							
							
									}
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
									template<typename T, typename R, typename ...Args>
							 | 
						
					
						
							
								
									
										
										
										
											2024-04-25 21:45:41 +08:00
										 
									 
								 
							 | 
							
								
									
										
									
								
							 | 
							
								
							 | 
							
							
									consteval FieldPtr StaticMethodField(R(T::* ptr)(Args...), const Name& name, const MethodData& data = {}) {
							 | 
						
					
						
							
								
									
										
										
										
											2024-04-09 16:31:09 +08:00
										 
									 
								 
							 | 
							
								
									
										
									
								
							 | 
							
								
							 | 
							
							
										uint32_t flag = FIELD_MEMBER_FLAG | FIELD_METHOD_FLAG;
							 | 
						
					
						
							
								
									
										
										
										
											2024-06-25 20:26:46 +08:00
										 
									 
								 
							 | 
							
								
									
										
									
								
							 | 
							
								
							 | 
							
							
										Offset offset = AnyArgs::GetArgsSize<R,void*, Args...>(data.value);
							 | 
						
					
						
							
								
									
										
										
										
											2024-04-19 22:02:27 +08:00
										 
									 
								 
							 | 
							
								
									
										
									
								
							 | 
							
								
							 | 
							
							
										if (data.meta.IsValid()) {
							 | 
						
					
						
							
								
									
										
										
										
											2024-04-25 21:45:41 +08:00
										 
									 
								 
							 | 
							
								
									
										
									
								
							 | 
							
								
							 | 
							
							
											offset += data.meta.Size();
							 | 
						
					
						
							
								
									
										
										
										
											2024-04-19 22:02:27 +08:00
										 
									 
								 
							 | 
							
								
									
										
									
								
							 | 
							
								
							 | 
							
							
										}
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
										FieldPtr::Data method(offset);
							 | 
						
					
						
							
								
									
										
										
										
											2024-06-25 20:26:46 +08:00
										 
									 
								 
							 | 
							
								
									
										
									
								
							 | 
							
								
							 | 
							
							
										return { name, nullptr,method,flag };
							 | 
						
					
						
							
								
									
										
										
										
											2024-06-16 22:52:45 +08:00
										 
									 
								 
							 | 
							
								
									
										
									
								
							 | 
							
								
							 | 
							
							
									}
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
									template<typename T, typename R, typename ...Args>
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
									consteval FieldPtr StaticMethodField(R(T::* ptr)(Args...)const, const Name& name, const MethodData& data = {}) {
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
										uint32_t flag = FIELD_MEMBER_FLAG | FIELD_METHOD_FLAG;
							 | 
						
					
						
							
								
									
										
										
										
											2024-06-25 20:26:46 +08:00
										 
									 
								 
							 | 
							
								
									
										
									
								
							 | 
							
								
							 | 
							
							
										Offset offset = AnyArgs::GetArgsSize<R, void*, Args...>(data.value);
							 | 
						
					
						
							
								
									
										
										
										
											2024-06-16 22:52:45 +08:00
										 
									 
								 
							 | 
							
								
									
										
									
								
							 | 
							
								
							 | 
							
							
										if (data.meta.IsValid()) {
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
											offset += data.meta.Size();
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
										}
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
										FieldPtr::Data method(offset);
							 | 
						
					
						
							
								
									
										
										
										
											2024-06-25 20:26:46 +08:00
										 
									 
								 
							 | 
							
								
									
										
									
								
							 | 
							
								
							 | 
							
							
										return { name, nullptr, method,flag };
							 | 
						
					
						
							
								
									
										
										
										
											2024-04-09 16:31:09 +08:00
										 
									 
								 
							 | 
							
								
									
										
									
								
							 | 
							
								
							 | 
							
							
									}
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
								}
							 |